langwatch 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (945) hide show
  1. package/dist/add-7R3JWOSB.js +147 -0
  2. package/dist/add-7R3JWOSB.js.map +1 -0
  3. package/dist/add-JJFHYAXS.mjs +147 -0
  4. package/dist/add-JJFHYAXS.mjs.map +1 -0
  5. package/dist/assign-6GQCAQLS.js +53 -0
  6. package/dist/assign-6GQCAQLS.js.map +1 -0
  7. package/dist/assign-KYLY5AJB.mjs +53 -0
  8. package/dist/assign-KYLY5AJB.mjs.map +1 -0
  9. package/dist/chunk-257C3DFN.mjs +68 -0
  10. package/dist/chunk-2IBXN2UI.mjs +53 -0
  11. package/dist/chunk-36CN3DNU.mjs +196 -0
  12. package/dist/chunk-5V4TJHYH.mjs +63 -0
  13. package/dist/chunk-7L46JITH.js +36 -0
  14. package/dist/chunk-7L46JITH.js.map +1 -0
  15. package/dist/chunk-BIAEFD56.mjs +54 -0
  16. package/dist/chunk-CBEZY3YS.mjs +33 -0
  17. package/dist/chunk-CBEZY3YS.mjs.map +1 -0
  18. package/dist/chunk-CDLXAEWE.js +70 -0
  19. package/dist/chunk-CDLXAEWE.js.map +1 -0
  20. package/dist/chunk-DDM6RZL6.mjs +76 -0
  21. package/dist/chunk-DQHQ4GE3.js +888 -0
  22. package/dist/chunk-DQHQ4GE3.js.map +1 -0
  23. package/dist/chunk-FYV43PSH.mjs +334 -0
  24. package/dist/chunk-HBGBMVHJ.js +63 -0
  25. package/dist/chunk-HBGBMVHJ.js.map +1 -0
  26. package/dist/chunk-HBWD75KV.js +51 -0
  27. package/dist/chunk-HBWD75KV.js.map +1 -0
  28. package/dist/chunk-HP275BYX.js +76 -0
  29. package/dist/chunk-HP275BYX.js.map +1 -0
  30. package/dist/chunk-I72OUBLW.js +54 -0
  31. package/dist/chunk-I72OUBLW.js.map +1 -0
  32. package/dist/chunk-IXY5E2TO.js +15 -0
  33. package/dist/chunk-IXY5E2TO.js.map +1 -0
  34. package/dist/chunk-JGDMQ7UW.js +68 -0
  35. package/dist/chunk-JGDMQ7UW.js.map +1 -0
  36. package/dist/chunk-N45JXCGL.mjs +300 -0
  37. package/dist/chunk-N45JXCGL.mjs.map +1 -0
  38. package/dist/chunk-NE43FFBN.js +353 -0
  39. package/dist/chunk-NE43FFBN.js.map +1 -0
  40. package/dist/chunk-NFARSAL7.mjs +51 -0
  41. package/dist/chunk-NHFJYJQY.mjs +15 -0
  42. package/dist/chunk-OO7FCQAD.mjs +663 -0
  43. package/dist/chunk-OO7FCQAD.mjs.map +1 -0
  44. package/dist/chunk-P5YYU577.js +101 -0
  45. package/dist/chunk-P5YYU577.js.map +1 -0
  46. package/dist/chunk-QHLWRTYG.js +663 -0
  47. package/dist/chunk-QHLWRTYG.js.map +1 -0
  48. package/dist/chunk-QSCT6GWB.mjs +42 -0
  49. package/dist/chunk-RAWDBKS2.js +54 -0
  50. package/dist/chunk-RAWDBKS2.js.map +1 -0
  51. package/dist/chunk-RI6OUC7W.js +66 -0
  52. package/dist/chunk-RI6OUC7W.js.map +1 -0
  53. package/dist/chunk-RKFBOROT.mjs +36 -0
  54. package/dist/chunk-RKFBOROT.mjs.map +1 -0
  55. package/dist/chunk-S2K6M7DJ.js +53 -0
  56. package/dist/chunk-S2K6M7DJ.js.map +1 -0
  57. package/dist/chunk-SU3CWTY5.js +300 -0
  58. package/dist/chunk-SU3CWTY5.js.map +1 -0
  59. package/dist/chunk-T7D2GUDO.mjs +101 -0
  60. package/dist/chunk-TESTM5B6.js +85 -0
  61. package/dist/chunk-TESTM5B6.js.map +1 -0
  62. package/dist/chunk-UQFEWE33.js +63 -0
  63. package/dist/chunk-UQFEWE33.js.map +1 -0
  64. package/dist/chunk-VVZTY5MI.mjs +70 -0
  65. package/dist/chunk-W27ODKHX.mjs +888 -0
  66. package/dist/chunk-WNPVTJDB.mjs +63 -0
  67. package/dist/chunk-WNPVTJDB.mjs.map +1 -0
  68. package/dist/chunk-WO2JP6VF.mjs +54 -0
  69. package/dist/chunk-X7ZHULCR.js +27 -0
  70. package/dist/chunk-X7ZHULCR.js.map +1 -0
  71. package/dist/chunk-XEJXLBC7.mjs +85 -0
  72. package/dist/chunk-XMVWGE2B.mjs +353 -0
  73. package/dist/chunk-XWQWSUFG.js +196 -0
  74. package/dist/chunk-XWQWSUFG.js.map +1 -0
  75. package/dist/chunk-YA2IDZVP.js +33 -0
  76. package/dist/chunk-YA2IDZVP.js.map +1 -0
  77. package/dist/chunk-YGUS5AZR.mjs +66 -0
  78. package/dist/chunk-YQKPP2HE.js +334 -0
  79. package/dist/chunk-YQKPP2HE.js.map +1 -0
  80. package/dist/chunk-YT3P33CN.js +80 -0
  81. package/dist/chunk-YT3P33CN.js.map +1 -0
  82. package/dist/chunk-Z5PDIJJB.js +42 -0
  83. package/dist/chunk-Z5PDIJJB.js.map +1 -0
  84. package/dist/chunk-ZA6AGQLU.mjs +27 -0
  85. package/dist/chunk-ZRTWLTE6.mjs +80 -0
  86. package/dist/cli/index.js +96 -96
  87. package/dist/cli/index.mjs +96 -96
  88. package/dist/create-2CRXUOGV.js +49 -0
  89. package/dist/create-2CRXUOGV.js.map +1 -0
  90. package/dist/create-2YCDG2JE.mjs +83 -0
  91. package/dist/create-3JFCK2Q7.mjs +88 -0
  92. package/dist/create-3JFCK2Q7.mjs.map +1 -0
  93. package/dist/create-5FRTV3D7.mjs +42 -0
  94. package/dist/create-5FRTV3D7.mjs.map +1 -0
  95. package/dist/create-6UQOQL7P.mjs +49 -0
  96. package/dist/create-6UQOQL7P.mjs.map +1 -0
  97. package/dist/create-7DZBR2D2.js +22 -0
  98. package/dist/create-7DZBR2D2.js.map +1 -0
  99. package/dist/create-7R6THD2Y.js +88 -0
  100. package/dist/create-7R6THD2Y.js.map +1 -0
  101. package/dist/create-BCUEKB26.mjs +41 -0
  102. package/dist/create-BCUEKB26.mjs.map +1 -0
  103. package/dist/create-BWCOEZX6.js +41 -0
  104. package/dist/create-BWCOEZX6.js.map +1 -0
  105. package/dist/create-EDL2KY34.mjs +51 -0
  106. package/dist/create-EDL2KY34.mjs.map +1 -0
  107. package/dist/create-F2WCJVRY.js +51 -0
  108. package/dist/create-F2WCJVRY.js.map +1 -0
  109. package/dist/create-FWNHAZHG.js +42 -0
  110. package/dist/create-FWNHAZHG.js.map +1 -0
  111. package/dist/create-I2AFCP76.js +72 -0
  112. package/dist/create-I2AFCP76.js.map +1 -0
  113. package/dist/create-JZ7YW7HJ.js +87 -0
  114. package/dist/create-JZ7YW7HJ.js.map +1 -0
  115. package/dist/create-KFDGQKNL.js +48 -0
  116. package/dist/create-KFDGQKNL.js.map +1 -0
  117. package/dist/create-KGDQHE6B.mjs +72 -0
  118. package/dist/create-KGDQHE6B.mjs.map +1 -0
  119. package/dist/create-KMGWW73J.mjs +87 -0
  120. package/dist/create-KMGWW73J.mjs.map +1 -0
  121. package/dist/create-MT7RY7DY.mjs +48 -0
  122. package/dist/create-MT7RY7DY.mjs.map +1 -0
  123. package/dist/create-N6XTOPNZ.js +68 -0
  124. package/dist/create-N6XTOPNZ.js.map +1 -0
  125. package/dist/create-NCWNYSXE.mjs +85 -0
  126. package/dist/create-NCWNYSXE.mjs.map +1 -0
  127. package/dist/create-Q62FIVQ7.mjs +68 -0
  128. package/dist/create-Q62FIVQ7.mjs.map +1 -0
  129. package/dist/create-QB7UW753.js +47 -0
  130. package/dist/create-QB7UW753.js.map +1 -0
  131. package/dist/create-QQF6K4S3.mjs +47 -0
  132. package/dist/create-QQF6K4S3.mjs.map +1 -0
  133. package/dist/create-V3AYJ5CK.mjs +22 -0
  134. package/dist/create-VYTHRJUZ.js +85 -0
  135. package/dist/create-VYTHRJUZ.js.map +1 -0
  136. package/dist/create-YGUZQG6V.js +83 -0
  137. package/dist/create-YGUZQG6V.js.map +1 -0
  138. package/dist/delete-423ZLFER.mjs +49 -0
  139. package/dist/delete-423ZLFER.mjs.map +1 -0
  140. package/dist/delete-56L3FAQ5.js +58 -0
  141. package/dist/delete-56L3FAQ5.js.map +1 -0
  142. package/dist/delete-64PBJEMZ.mjs +38 -0
  143. package/dist/delete-64PBJEMZ.mjs.map +1 -0
  144. package/dist/delete-66K4C6OR.js +56 -0
  145. package/dist/delete-66K4C6OR.js.map +1 -0
  146. package/dist/delete-B7GGZUJB.mjs +49 -0
  147. package/dist/delete-B7GGZUJB.mjs.map +1 -0
  148. package/dist/delete-BI4AJTTJ.js +38 -0
  149. package/dist/delete-BI4AJTTJ.js.map +1 -0
  150. package/dist/delete-CP7KTUBJ.mjs +37 -0
  151. package/dist/delete-CP7KTUBJ.mjs.map +1 -0
  152. package/dist/delete-GQNMOGEN.js +40 -0
  153. package/dist/delete-GQNMOGEN.js.map +1 -0
  154. package/dist/delete-HSISE7F3.js +49 -0
  155. package/dist/delete-HSISE7F3.js.map +1 -0
  156. package/dist/delete-IC6KDACP.js +58 -0
  157. package/dist/delete-IC6KDACP.js.map +1 -0
  158. package/dist/delete-JXWQ42O5.mjs +56 -0
  159. package/dist/delete-JXWQ42O5.mjs.map +1 -0
  160. package/dist/delete-NZBT4PT3.mjs +58 -0
  161. package/dist/delete-NZBT4PT3.mjs.map +1 -0
  162. package/dist/delete-P7PBJ7EK.js +49 -0
  163. package/dist/delete-P7PBJ7EK.js.map +1 -0
  164. package/dist/delete-PRDVV3W7.mjs +58 -0
  165. package/dist/delete-PRDVV3W7.mjs.map +1 -0
  166. package/dist/delete-QTUYP7F4.mjs +49 -0
  167. package/dist/delete-QTUYP7F4.mjs.map +1 -0
  168. package/dist/delete-R4GYQTWJ.js +49 -0
  169. package/dist/delete-R4GYQTWJ.js.map +1 -0
  170. package/dist/delete-RPPWZ7UC.mjs +38 -0
  171. package/dist/delete-RPPWZ7UC.mjs.map +1 -0
  172. package/dist/delete-UV7RETVN.mjs +49 -0
  173. package/dist/delete-UV7RETVN.mjs.map +1 -0
  174. package/dist/delete-VEYYR2V2.mjs +60 -0
  175. package/dist/delete-VEYYR2V2.mjs.map +1 -0
  176. package/dist/delete-W4W7XE7W.mjs +43 -0
  177. package/dist/delete-W4W7XE7W.mjs.map +1 -0
  178. package/dist/delete-WD4GP6VC.mjs +40 -0
  179. package/dist/delete-WD4GP6VC.mjs.map +1 -0
  180. package/dist/delete-XOQPSIC3.js +38 -0
  181. package/dist/delete-XOQPSIC3.js.map +1 -0
  182. package/dist/delete-YNEQSVUG.js +43 -0
  183. package/dist/delete-YNEQSVUG.js.map +1 -0
  184. package/dist/delete-YO3A64VA.js +37 -0
  185. package/dist/delete-YO3A64VA.js.map +1 -0
  186. package/dist/delete-ZF2M52VU.js +60 -0
  187. package/dist/delete-ZF2M52VU.js.map +1 -0
  188. package/dist/delete-ZXRIAUBQ.js +49 -0
  189. package/dist/delete-ZXRIAUBQ.js.map +1 -0
  190. package/dist/download-E5SUD3F7.mjs +99 -0
  191. package/dist/download-E5SUD3F7.mjs.map +1 -0
  192. package/dist/download-JISYQMNY.js +99 -0
  193. package/dist/download-JISYQMNY.js.map +1 -0
  194. package/dist/duplicate-42LD4L23.mjs +44 -0
  195. package/dist/duplicate-42LD4L23.mjs.map +1 -0
  196. package/dist/duplicate-E5KLA2EM.js +44 -0
  197. package/dist/duplicate-E5KLA2EM.js.map +1 -0
  198. package/dist/export-5JOE3K6U.js +100 -0
  199. package/dist/export-5JOE3K6U.js.map +1 -0
  200. package/dist/export-XAAWFBWP.mjs +100 -0
  201. package/dist/export-XAAWFBWP.mjs.map +1 -0
  202. package/dist/get-47CRZQE2.js +84 -0
  203. package/dist/get-47CRZQE2.js.map +1 -0
  204. package/dist/get-6CH555QF.js +67 -0
  205. package/dist/get-6CH555QF.js.map +1 -0
  206. package/dist/get-76OQEJTU.js +68 -0
  207. package/dist/get-76OQEJTU.js.map +1 -0
  208. package/dist/get-7BYRNYJH.mjs +51 -0
  209. package/dist/get-7BYRNYJH.mjs.map +1 -0
  210. package/dist/get-A4QAB3FY.mjs +68 -0
  211. package/dist/get-A4QAB3FY.mjs.map +1 -0
  212. package/dist/get-AF7RKSZO.mjs +68 -0
  213. package/dist/get-AF7RKSZO.mjs.map +1 -0
  214. package/dist/get-BIBUDQMN.js +51 -0
  215. package/dist/get-BIBUDQMN.js.map +1 -0
  216. package/dist/get-CKRAB3K5.mjs +84 -0
  217. package/dist/get-CKRAB3K5.mjs.map +1 -0
  218. package/dist/get-DQFGVM3F.mjs +67 -0
  219. package/dist/get-DQFGVM3F.mjs.map +1 -0
  220. package/dist/get-G2ZN6SEM.js +50 -0
  221. package/dist/get-G2ZN6SEM.js.map +1 -0
  222. package/dist/get-IWXUP7QP.js +65 -0
  223. package/dist/get-IWXUP7QP.js.map +1 -0
  224. package/dist/get-K7ZKHSVV.mjs +64 -0
  225. package/dist/get-K7ZKHSVV.mjs.map +1 -0
  226. package/dist/get-KRIXLGMQ.js +93 -0
  227. package/dist/get-KRIXLGMQ.js.map +1 -0
  228. package/dist/get-KV5T4HQW.js +70 -0
  229. package/dist/get-KV5T4HQW.js.map +1 -0
  230. package/dist/get-LDSMHGUW.js +73 -0
  231. package/dist/get-LDSMHGUW.js.map +1 -0
  232. package/dist/get-M3R3ZXKQ.js +68 -0
  233. package/dist/get-M3R3ZXKQ.js.map +1 -0
  234. package/dist/get-NWUTIOCP.js +55 -0
  235. package/dist/get-NWUTIOCP.js.map +1 -0
  236. package/dist/get-O7XKPZAA.mjs +50 -0
  237. package/dist/get-O7XKPZAA.mjs.map +1 -0
  238. package/dist/get-QQPDGTAU.mjs +65 -0
  239. package/dist/get-QQPDGTAU.mjs.map +1 -0
  240. package/dist/get-RGIMJNQL.mjs +70 -0
  241. package/dist/get-RGIMJNQL.mjs.map +1 -0
  242. package/dist/get-RSWAAEYL.mjs +93 -0
  243. package/dist/get-RSWAAEYL.mjs.map +1 -0
  244. package/dist/get-SKFALBER.mjs +55 -0
  245. package/dist/get-SKFALBER.mjs.map +1 -0
  246. package/dist/get-UGZFJJUU.mjs +73 -0
  247. package/dist/get-UGZFJJUU.mjs.map +1 -0
  248. package/dist/get-X3II3DA2.mjs +51 -0
  249. package/dist/get-X3II3DA2.mjs.map +1 -0
  250. package/dist/get-XTTWOOCK.js +146 -0
  251. package/dist/get-XTTWOOCK.js.map +1 -0
  252. package/dist/get-Y5JAGKGZ.js +64 -0
  253. package/dist/get-Y5JAGKGZ.js.map +1 -0
  254. package/dist/get-YUC3K2US.js +51 -0
  255. package/dist/get-YUC3K2US.js.map +1 -0
  256. package/dist/get-ZDDRNPH7.mjs +146 -0
  257. package/dist/get-ZDDRNPH7.mjs.map +1 -0
  258. package/dist/implementation-DA0tkKLH.d.ts +716 -0
  259. package/dist/implementation-DQ_r7ave.d.mts +716 -0
  260. package/dist/index.d.mts +8 -4
  261. package/dist/index.d.ts +8 -4
  262. package/dist/index.js +58 -61
  263. package/dist/index.js.map +1 -1
  264. package/dist/index.mjs +35 -38
  265. package/dist/index.mjs.map +1 -1
  266. package/dist/list-2M7S7J7O.mjs +75 -0
  267. package/dist/list-2M7S7J7O.mjs.map +1 -0
  268. package/dist/list-54R5G4HH.mjs +74 -0
  269. package/dist/list-54R5G4HH.mjs.map +1 -0
  270. package/dist/list-5FYTT5HB.mjs +77 -0
  271. package/dist/list-5FYTT5HB.mjs.map +1 -0
  272. package/dist/list-5U4LMZBB.mjs +110 -0
  273. package/dist/list-5U4LMZBB.mjs.map +1 -0
  274. package/dist/list-62BXOYGD.js +84 -0
  275. package/dist/list-62BXOYGD.js.map +1 -0
  276. package/dist/list-63FURY7L.js +79 -0
  277. package/dist/list-63FURY7L.js.map +1 -0
  278. package/dist/list-AFXU53X4.mjs +79 -0
  279. package/dist/list-AFXU53X4.mjs.map +1 -0
  280. package/dist/list-APA4ERHO.mjs +89 -0
  281. package/dist/list-APA4ERHO.mjs.map +1 -0
  282. package/dist/list-C4MDIFZR.js +81 -0
  283. package/dist/list-C4MDIFZR.js.map +1 -0
  284. package/dist/list-C4WD6B3D.mjs +80 -0
  285. package/dist/list-C4WD6B3D.mjs.map +1 -0
  286. package/dist/list-DWXA3JFX.mjs +84 -0
  287. package/dist/list-DWXA3JFX.mjs.map +1 -0
  288. package/dist/list-EGNU7O7M.js +89 -0
  289. package/dist/list-EGNU7O7M.js.map +1 -0
  290. package/dist/list-HMJHFHHP.js +83 -0
  291. package/dist/list-HMJHFHHP.js.map +1 -0
  292. package/dist/list-HOY4EIKQ.js +77 -0
  293. package/dist/list-HOY4EIKQ.js.map +1 -0
  294. package/dist/list-HVF6OOMK.js +77 -0
  295. package/dist/list-HVF6OOMK.js.map +1 -0
  296. package/dist/list-IOO6MDMB.mjs +101 -0
  297. package/dist/list-IOO6MDMB.mjs.map +1 -0
  298. package/dist/list-J6CMUED2.mjs +83 -0
  299. package/dist/list-J6CMUED2.mjs.map +1 -0
  300. package/dist/list-MOMC25YL.js +77 -0
  301. package/dist/list-MOMC25YL.js.map +1 -0
  302. package/dist/list-MX4I22LJ.mjs +79 -0
  303. package/dist/list-MX4I22LJ.mjs.map +1 -0
  304. package/dist/list-O3WXWLZ2.js +75 -0
  305. package/dist/list-O3WXWLZ2.js.map +1 -0
  306. package/dist/list-O4JFOC7E.js +80 -0
  307. package/dist/list-O4JFOC7E.js.map +1 -0
  308. package/dist/list-SHZR6AY2.js +101 -0
  309. package/dist/list-SHZR6AY2.js.map +1 -0
  310. package/dist/list-TC3ZS3B7.js +74 -0
  311. package/dist/list-TC3ZS3B7.js.map +1 -0
  312. package/dist/list-UFWOZYRY.mjs +81 -0
  313. package/dist/list-UFWOZYRY.mjs.map +1 -0
  314. package/dist/list-UUZJCRRX.js +79 -0
  315. package/dist/list-UUZJCRRX.js.map +1 -0
  316. package/dist/list-WQEM5OO3.js +52 -0
  317. package/dist/list-WQEM5OO3.js.map +1 -0
  318. package/dist/list-WTCKNKVI.js +79 -0
  319. package/dist/list-WTCKNKVI.js.map +1 -0
  320. package/dist/list-X3G6DLUT.mjs +77 -0
  321. package/dist/list-X3G6DLUT.mjs.map +1 -0
  322. package/dist/list-X4NGP6JZ.mjs +52 -0
  323. package/dist/list-X4NGP6JZ.mjs.map +1 -0
  324. package/dist/list-XOOOXCSB.mjs +79 -0
  325. package/dist/list-XOOOXCSB.mjs.map +1 -0
  326. package/dist/list-ZIF74QQI.js +110 -0
  327. package/dist/list-ZIF74QQI.js.map +1 -0
  328. package/dist/list-ZMXP4YSQ.mjs +77 -0
  329. package/dist/list-ZMXP4YSQ.mjs.map +1 -0
  330. package/dist/login-43IWV5ZX.mjs +131 -0
  331. package/dist/login-TP4JYVIC.js +131 -0
  332. package/dist/login-TP4JYVIC.js.map +1 -0
  333. package/dist/observability-sdk/index.d.mts +1 -1
  334. package/dist/observability-sdk/index.d.ts +1 -1
  335. package/dist/observability-sdk/index.js +4 -3
  336. package/dist/observability-sdk/index.js.map +1 -1
  337. package/dist/observability-sdk/index.mjs +3 -2
  338. package/dist/observability-sdk/setup/node/index.js +5 -4
  339. package/dist/observability-sdk/setup/node/index.js.map +1 -1
  340. package/dist/observability-sdk/setup/node/index.mjs +4 -3
  341. package/dist/pull-AZPRK3GN.mjs +26 -0
  342. package/dist/pull-PGX2TZCI.js +26 -0
  343. package/dist/pull-PGX2TZCI.js.map +1 -0
  344. package/dist/push-6KWCSO2D.mjs +26 -0
  345. package/dist/push-7V3KD2UM.js +26 -0
  346. package/dist/push-7V3KD2UM.js.map +1 -0
  347. package/dist/query-BH42M4QU.js +121 -0
  348. package/dist/query-BH42M4QU.js.map +1 -0
  349. package/dist/query-Q4WHP7NL.mjs +121 -0
  350. package/dist/query-Q4WHP7NL.mjs.map +1 -0
  351. package/dist/records-add-AHSO44PG.mjs +97 -0
  352. package/dist/records-add-AHSO44PG.mjs.map +1 -0
  353. package/dist/records-add-JSYIMW5D.js +97 -0
  354. package/dist/records-add-JSYIMW5D.js.map +1 -0
  355. package/dist/records-delete-BZQHW47S.js +45 -0
  356. package/dist/records-delete-BZQHW47S.js.map +1 -0
  357. package/dist/records-delete-QPL3SVXF.mjs +45 -0
  358. package/dist/records-delete-QPL3SVXF.mjs.map +1 -0
  359. package/dist/records-list-RCLGBKXW.js +88 -0
  360. package/dist/records-list-RCLGBKXW.js.map +1 -0
  361. package/dist/records-list-ZDQNI77T.mjs +88 -0
  362. package/dist/records-list-ZDQNI77T.mjs.map +1 -0
  363. package/dist/records-update-6LMOUVI4.mjs +52 -0
  364. package/dist/records-update-6LMOUVI4.mjs.map +1 -0
  365. package/dist/records-update-AG4ADH3F.js +52 -0
  366. package/dist/records-update-AG4ADH3F.js.map +1 -0
  367. package/dist/remove-MM7YJZYL.mjs +114 -0
  368. package/dist/remove-MM7YJZYL.mjs.map +1 -0
  369. package/dist/remove-XSUM2GCV.js +114 -0
  370. package/dist/remove-XSUM2GCV.js.map +1 -0
  371. package/dist/rename-C76VRLQG.js +41 -0
  372. package/dist/rename-C76VRLQG.js.map +1 -0
  373. package/dist/rename-DDAOECU2.mjs +41 -0
  374. package/dist/rename-DDAOECU2.mjs.map +1 -0
  375. package/dist/restore-RWTZ5FID.mjs +70 -0
  376. package/dist/restore-RWTZ5FID.mjs.map +1 -0
  377. package/dist/restore-WC4KVCSC.js +70 -0
  378. package/dist/restore-WC4KVCSC.js.map +1 -0
  379. package/dist/run-IOFY35YT.mjs +82 -0
  380. package/dist/run-IOFY35YT.mjs.map +1 -0
  381. package/dist/run-IZTJZPSP.js +139 -0
  382. package/dist/run-IZTJZPSP.js.map +1 -0
  383. package/dist/run-LYB5PBK4.mjs +74 -0
  384. package/dist/run-LYB5PBK4.mjs.map +1 -0
  385. package/dist/run-M4BOFPQO.mjs +141 -0
  386. package/dist/run-M4BOFPQO.mjs.map +1 -0
  387. package/dist/run-PMCXW4TE.js +74 -0
  388. package/dist/run-PMCXW4TE.js.map +1 -0
  389. package/dist/run-RFPCGSZV.js +141 -0
  390. package/dist/run-RFPCGSZV.js.map +1 -0
  391. package/dist/run-S3Y3PBQM.mjs +128 -0
  392. package/dist/run-S3Y3PBQM.mjs.map +1 -0
  393. package/dist/run-TRWMJ4ML.mjs +139 -0
  394. package/dist/run-TRWMJ4ML.mjs.map +1 -0
  395. package/dist/run-USVYBYA5.js +82 -0
  396. package/dist/run-USVYBYA5.js.map +1 -0
  397. package/dist/run-YLVPYLLZ.js +128 -0
  398. package/dist/run-YLVPYLLZ.js.map +1 -0
  399. package/dist/search-JATZKUZ3.js +107 -0
  400. package/dist/search-JATZKUZ3.js.map +1 -0
  401. package/dist/search-YOPZMZV2.mjs +107 -0
  402. package/dist/search-YOPZMZV2.mjs.map +1 -0
  403. package/dist/set-Q6CV5ZSE.js +58 -0
  404. package/dist/set-Q6CV5ZSE.js.map +1 -0
  405. package/dist/set-ROA3RS3Y.mjs +58 -0
  406. package/dist/set-ROA3RS3Y.mjs.map +1 -0
  407. package/dist/status-2RU6EVUV.mjs +66 -0
  408. package/dist/status-2RU6EVUV.mjs.map +1 -0
  409. package/dist/status-GQZAANKB.mjs +145 -0
  410. package/dist/status-GQZAANKB.mjs.map +1 -0
  411. package/dist/status-X4ZC2WQ2.js +145 -0
  412. package/dist/status-X4ZC2WQ2.js.map +1 -0
  413. package/dist/status-XKPRINDU.js +66 -0
  414. package/dist/status-XKPRINDU.js.map +1 -0
  415. package/dist/sync-M6MMO73Z.mjs +131 -0
  416. package/dist/sync-M6MMO73Z.mjs.map +1 -0
  417. package/dist/sync-UORYQVYI.js +131 -0
  418. package/dist/sync-UORYQVYI.js.map +1 -0
  419. package/dist/update-2GBMUVNA.js +74 -0
  420. package/dist/update-2GBMUVNA.js.map +1 -0
  421. package/dist/update-2UQWJLVH.js +50 -0
  422. package/dist/update-2UQWJLVH.js.map +1 -0
  423. package/dist/update-2ZXMIFOX.js +64 -0
  424. package/dist/update-2ZXMIFOX.js.map +1 -0
  425. package/dist/update-4VNJCTED.js +47 -0
  426. package/dist/update-4VNJCTED.js.map +1 -0
  427. package/dist/update-AQ7XKPY7.mjs +60 -0
  428. package/dist/update-AQ7XKPY7.mjs.map +1 -0
  429. package/dist/update-ASXLKSJG.mjs +47 -0
  430. package/dist/update-ASXLKSJG.mjs.map +1 -0
  431. package/dist/update-DPXJXXHW.js +76 -0
  432. package/dist/update-DPXJXXHW.js.map +1 -0
  433. package/dist/update-DQZUG22S.js +60 -0
  434. package/dist/update-DQZUG22S.js.map +1 -0
  435. package/dist/update-FSC33GPL.js +70 -0
  436. package/dist/update-FSC33GPL.js.map +1 -0
  437. package/dist/update-HBGBYK6N.js +73 -0
  438. package/dist/update-HBGBYK6N.js.map +1 -0
  439. package/dist/update-IRPDKEH3.js +80 -0
  440. package/dist/update-IRPDKEH3.js.map +1 -0
  441. package/dist/update-IVWQ63V4.js +63 -0
  442. package/dist/update-IVWQ63V4.js.map +1 -0
  443. package/dist/update-KXVULES5.mjs +73 -0
  444. package/dist/update-KXVULES5.mjs.map +1 -0
  445. package/dist/update-MCO3C4MF.mjs +76 -0
  446. package/dist/update-MCO3C4MF.mjs.map +1 -0
  447. package/dist/update-ONUSCD7N.js +47 -0
  448. package/dist/update-ONUSCD7N.js.map +1 -0
  449. package/dist/update-PRPVHRHO.mjs +80 -0
  450. package/dist/update-PRPVHRHO.mjs.map +1 -0
  451. package/dist/update-QT7OOZ27.mjs +47 -0
  452. package/dist/update-QT7OOZ27.mjs.map +1 -0
  453. package/dist/update-RAF3FLXI.mjs +74 -0
  454. package/dist/update-RAF3FLXI.mjs.map +1 -0
  455. package/dist/update-RWLYZTKO.mjs +70 -0
  456. package/dist/update-RWLYZTKO.mjs.map +1 -0
  457. package/dist/update-WLIYEPTG.mjs +64 -0
  458. package/dist/update-WLIYEPTG.mjs.map +1 -0
  459. package/dist/update-XKCCJUWT.mjs +50 -0
  460. package/dist/update-XKCCJUWT.mjs.map +1 -0
  461. package/dist/update-XQ4V6RRT.mjs +63 -0
  462. package/dist/update-XQ4V6RRT.mjs.map +1 -0
  463. package/dist/upload-O3X3HBCC.js +79 -0
  464. package/dist/upload-O3X3HBCC.js.map +1 -0
  465. package/dist/upload-V5HNSSDT.mjs +79 -0
  466. package/dist/upload-V5HNSSDT.mjs.map +1 -0
  467. package/dist/versions-C3HXAFPH.js +84 -0
  468. package/dist/versions-C3HXAFPH.js.map +1 -0
  469. package/dist/versions-HHXBKXHA.mjs +84 -0
  470. package/dist/versions-HHXBKXHA.mjs.map +1 -0
  471. package/package.json +1 -1
  472. package/dist/add-D2HMJK6J.mjs +0 -146
  473. package/dist/add-D2HMJK6J.mjs.map +0 -1
  474. package/dist/add-LD7Y3OQJ.js +0 -146
  475. package/dist/add-LD7Y3OQJ.js.map +0 -1
  476. package/dist/assign-GBGURLRB.js +0 -52
  477. package/dist/assign-GBGURLRB.js.map +0 -1
  478. package/dist/assign-QNWAAUSW.mjs +0 -52
  479. package/dist/assign-QNWAAUSW.mjs.map +0 -1
  480. package/dist/chunk-2LKH7HKO.js +0 -51
  481. package/dist/chunk-2LKH7HKO.js.map +0 -1
  482. package/dist/chunk-3ABCXA7Q.mjs +0 -101
  483. package/dist/chunk-4FFXJR7B.js +0 -42
  484. package/dist/chunk-4FFXJR7B.js.map +0 -1
  485. package/dist/chunk-5CPABRWB.mjs +0 -68
  486. package/dist/chunk-6NVMVVY3.js +0 -63
  487. package/dist/chunk-6NVMVVY3.js.map +0 -1
  488. package/dist/chunk-6YOODI4E.mjs +0 -27
  489. package/dist/chunk-7G6VZNKU.mjs +0 -76
  490. package/dist/chunk-AIV32ZAH.js +0 -54
  491. package/dist/chunk-AIV32ZAH.js.map +0 -1
  492. package/dist/chunk-AN2NF2FO.mjs +0 -70
  493. package/dist/chunk-BGSGCSLT.js +0 -63
  494. package/dist/chunk-BGSGCSLT.js.map +0 -1
  495. package/dist/chunk-BRBFTP25.mjs +0 -51
  496. package/dist/chunk-C3ASNRX5.mjs +0 -42
  497. package/dist/chunk-DQAE734E.js +0 -80
  498. package/dist/chunk-DQAE734E.js.map +0 -1
  499. package/dist/chunk-F2GVZ3PK.mjs +0 -66
  500. package/dist/chunk-FPNXFYXA.mjs +0 -63
  501. package/dist/chunk-FPNXFYXA.mjs.map +0 -1
  502. package/dist/chunk-G3SI5WO3.mjs +0 -63
  503. package/dist/chunk-IFHIS7NO.mjs +0 -80
  504. package/dist/chunk-ILU7DFFC.mjs +0 -663
  505. package/dist/chunk-ILU7DFFC.mjs.map +0 -1
  506. package/dist/chunk-INNMPLUT.js +0 -296
  507. package/dist/chunk-INNMPLUT.js.map +0 -1
  508. package/dist/chunk-ITE5FJGZ.js +0 -53
  509. package/dist/chunk-ITE5FJGZ.js.map +0 -1
  510. package/dist/chunk-KWCI4DTZ.js +0 -663
  511. package/dist/chunk-KWCI4DTZ.js.map +0 -1
  512. package/dist/chunk-MAJGKAHG.js +0 -15
  513. package/dist/chunk-MAJGKAHG.js.map +0 -1
  514. package/dist/chunk-MLCPN2AP.js +0 -101
  515. package/dist/chunk-MLCPN2AP.js.map +0 -1
  516. package/dist/chunk-NAW5BKCY.mjs +0 -85
  517. package/dist/chunk-O6QQ27GQ.js +0 -334
  518. package/dist/chunk-O6QQ27GQ.js.map +0 -1
  519. package/dist/chunk-PM6QYGUE.mjs +0 -33
  520. package/dist/chunk-PM6QYGUE.mjs.map +0 -1
  521. package/dist/chunk-QJMBCUFD.mjs +0 -353
  522. package/dist/chunk-R3UGXXY6.js +0 -66
  523. package/dist/chunk-R3UGXXY6.js.map +0 -1
  524. package/dist/chunk-RSAKFSPM.js +0 -888
  525. package/dist/chunk-RSAKFSPM.js.map +0 -1
  526. package/dist/chunk-SCEGLDVI.js +0 -27
  527. package/dist/chunk-SCEGLDVI.js.map +0 -1
  528. package/dist/chunk-SEOPPODT.js +0 -353
  529. package/dist/chunk-SEOPPODT.js.map +0 -1
  530. package/dist/chunk-TGVOKENR.js +0 -54
  531. package/dist/chunk-TGVOKENR.js.map +0 -1
  532. package/dist/chunk-TJJJV3CI.js +0 -85
  533. package/dist/chunk-TJJJV3CI.js.map +0 -1
  534. package/dist/chunk-TOGBUNQC.mjs +0 -296
  535. package/dist/chunk-TOGBUNQC.mjs.map +0 -1
  536. package/dist/chunk-U2V5IVSB.mjs +0 -196
  537. package/dist/chunk-VB366QFL.js +0 -68
  538. package/dist/chunk-VB366QFL.js.map +0 -1
  539. package/dist/chunk-VDRY4UC2.mjs +0 -53
  540. package/dist/chunk-X7ZWFNXL.js +0 -33
  541. package/dist/chunk-X7ZWFNXL.js.map +0 -1
  542. package/dist/chunk-XIT4XG7L.js +0 -196
  543. package/dist/chunk-XIT4XG7L.js.map +0 -1
  544. package/dist/chunk-XRZSZSZN.mjs +0 -54
  545. package/dist/chunk-Y47NPYKY.mjs +0 -15
  546. package/dist/chunk-Y6O4YPT7.mjs +0 -888
  547. package/dist/chunk-ZOM375W3.mjs +0 -54
  548. package/dist/chunk-ZPQHAUNW.js +0 -76
  549. package/dist/chunk-ZPQHAUNW.js.map +0 -1
  550. package/dist/chunk-ZSMJ2UTX.js +0 -70
  551. package/dist/chunk-ZSMJ2UTX.js.map +0 -1
  552. package/dist/chunk-ZTLHGFWB.mjs +0 -334
  553. package/dist/create-27RWBCI2.js +0 -21
  554. package/dist/create-27RWBCI2.js.map +0 -1
  555. package/dist/create-2ZS5HBIL.js +0 -41
  556. package/dist/create-2ZS5HBIL.js.map +0 -1
  557. package/dist/create-3WL4LOSV.js +0 -64
  558. package/dist/create-3WL4LOSV.js.map +0 -1
  559. package/dist/create-6E7HDRIB.js +0 -46
  560. package/dist/create-6E7HDRIB.js.map +0 -1
  561. package/dist/create-BROFUHX5.mjs +0 -81
  562. package/dist/create-BROFUHX5.mjs.map +0 -1
  563. package/dist/create-BUF6A65T.js +0 -86
  564. package/dist/create-BUF6A65T.js.map +0 -1
  565. package/dist/create-CEWMY3NQ.mjs +0 -41
  566. package/dist/create-CEWMY3NQ.mjs.map +0 -1
  567. package/dist/create-CLO6LDAG.js +0 -50
  568. package/dist/create-CLO6LDAG.js.map +0 -1
  569. package/dist/create-E7PQGUD6.js +0 -40
  570. package/dist/create-E7PQGUD6.js.map +0 -1
  571. package/dist/create-EOURY3P6.mjs +0 -64
  572. package/dist/create-EOURY3P6.mjs.map +0 -1
  573. package/dist/create-F57RBIVJ.mjs +0 -70
  574. package/dist/create-F57RBIVJ.mjs.map +0 -1
  575. package/dist/create-GZ32AMFQ.mjs +0 -47
  576. package/dist/create-GZ32AMFQ.mjs.map +0 -1
  577. package/dist/create-HSWEIF5L.js +0 -70
  578. package/dist/create-HSWEIF5L.js.map +0 -1
  579. package/dist/create-HYVLF3J5.mjs +0 -86
  580. package/dist/create-HYVLF3J5.mjs.map +0 -1
  581. package/dist/create-IDQ6NVTH.mjs +0 -40
  582. package/dist/create-IDQ6NVTH.mjs.map +0 -1
  583. package/dist/create-J54IMJ3L.js +0 -84
  584. package/dist/create-J54IMJ3L.js.map +0 -1
  585. package/dist/create-LF2NFL3L.mjs +0 -83
  586. package/dist/create-MTIZWFVF.js +0 -81
  587. package/dist/create-MTIZWFVF.js.map +0 -1
  588. package/dist/create-OANDCIXY.js +0 -48
  589. package/dist/create-OANDCIXY.js.map +0 -1
  590. package/dist/create-R225D2G7.js +0 -47
  591. package/dist/create-R225D2G7.js.map +0 -1
  592. package/dist/create-T4MIBP7R.mjs +0 -50
  593. package/dist/create-T4MIBP7R.mjs.map +0 -1
  594. package/dist/create-TNDZSZSQ.mjs +0 -46
  595. package/dist/create-TNDZSZSQ.mjs.map +0 -1
  596. package/dist/create-UTHQO5WC.mjs +0 -21
  597. package/dist/create-WRYWWR4G.js +0 -83
  598. package/dist/create-WRYWWR4G.js.map +0 -1
  599. package/dist/create-XGISFVYH.mjs +0 -84
  600. package/dist/create-XGISFVYH.mjs.map +0 -1
  601. package/dist/create-YOIVZH5L.mjs +0 -48
  602. package/dist/create-YOIVZH5L.mjs.map +0 -1
  603. package/dist/delete-2IGWCVH3.js +0 -46
  604. package/dist/delete-2IGWCVH3.js.map +0 -1
  605. package/dist/delete-2KV5D4OA.js +0 -37
  606. package/dist/delete-2KV5D4OA.js.map +0 -1
  607. package/dist/delete-3GJWWSSC.mjs +0 -37
  608. package/dist/delete-3GJWWSSC.mjs.map +0 -1
  609. package/dist/delete-3RUX5A7B.js +0 -57
  610. package/dist/delete-3RUX5A7B.js.map +0 -1
  611. package/dist/delete-3WELQNWF.js +0 -46
  612. package/dist/delete-3WELQNWF.js.map +0 -1
  613. package/dist/delete-6PRSI33C.mjs +0 -55
  614. package/dist/delete-6PRSI33C.mjs.map +0 -1
  615. package/dist/delete-A75VPRRT.js +0 -46
  616. package/dist/delete-A75VPRRT.js.map +0 -1
  617. package/dist/delete-BCPXJQYW.mjs +0 -46
  618. package/dist/delete-BCPXJQYW.mjs.map +0 -1
  619. package/dist/delete-CPCFZ6HW.js +0 -55
  620. package/dist/delete-CPCFZ6HW.js.map +0 -1
  621. package/dist/delete-FSPHUXP2.mjs +0 -57
  622. package/dist/delete-FSPHUXP2.mjs.map +0 -1
  623. package/dist/delete-I2AHSWMQ.js +0 -42
  624. package/dist/delete-I2AHSWMQ.js.map +0 -1
  625. package/dist/delete-I5YSAVIY.mjs +0 -46
  626. package/dist/delete-I5YSAVIY.mjs.map +0 -1
  627. package/dist/delete-JOPWUYVF.js +0 -39
  628. package/dist/delete-JOPWUYVF.js.map +0 -1
  629. package/dist/delete-L4CGL6IJ.mjs +0 -46
  630. package/dist/delete-L4CGL6IJ.mjs.map +0 -1
  631. package/dist/delete-L4QHNIOA.mjs +0 -39
  632. package/dist/delete-L4QHNIOA.mjs.map +0 -1
  633. package/dist/delete-LWAGDLJK.mjs +0 -42
  634. package/dist/delete-LWAGDLJK.mjs.map +0 -1
  635. package/dist/delete-NGPJHUIC.js +0 -57
  636. package/dist/delete-NGPJHUIC.js.map +0 -1
  637. package/dist/delete-P7GEL4JW.mjs +0 -37
  638. package/dist/delete-P7GEL4JW.mjs.map +0 -1
  639. package/dist/delete-RUPTAH4Y.js +0 -59
  640. package/dist/delete-RUPTAH4Y.js.map +0 -1
  641. package/dist/delete-SCZBYTCC.mjs +0 -57
  642. package/dist/delete-SCZBYTCC.mjs.map +0 -1
  643. package/dist/delete-STQSYFS7.mjs +0 -36
  644. package/dist/delete-STQSYFS7.mjs.map +0 -1
  645. package/dist/delete-T34PXCCB.js +0 -46
  646. package/dist/delete-T34PXCCB.js.map +0 -1
  647. package/dist/delete-TD3QOGGY.js +0 -37
  648. package/dist/delete-TD3QOGGY.js.map +0 -1
  649. package/dist/delete-TDHMH4LD.js +0 -36
  650. package/dist/delete-TDHMH4LD.js.map +0 -1
  651. package/dist/delete-UKCIBVK2.mjs +0 -59
  652. package/dist/delete-UKCIBVK2.mjs.map +0 -1
  653. package/dist/delete-Z7MWMJQ4.mjs +0 -46
  654. package/dist/delete-Z7MWMJQ4.mjs.map +0 -1
  655. package/dist/download-AV7HZ2MQ.mjs +0 -98
  656. package/dist/download-AV7HZ2MQ.mjs.map +0 -1
  657. package/dist/download-BN4UGPCS.js +0 -98
  658. package/dist/download-BN4UGPCS.js.map +0 -1
  659. package/dist/duplicate-2ZAYE3PH.mjs +0 -43
  660. package/dist/duplicate-2ZAYE3PH.mjs.map +0 -1
  661. package/dist/duplicate-KQFXXMPO.js +0 -43
  662. package/dist/duplicate-KQFXXMPO.js.map +0 -1
  663. package/dist/export-2BEGDP7P.js +0 -96
  664. package/dist/export-2BEGDP7P.js.map +0 -1
  665. package/dist/export-JLMGQO6B.mjs +0 -96
  666. package/dist/export-JLMGQO6B.mjs.map +0 -1
  667. package/dist/get-237C2DPN.js +0 -69
  668. package/dist/get-237C2DPN.js.map +0 -1
  669. package/dist/get-2DEPSMAA.js +0 -49
  670. package/dist/get-2DEPSMAA.js.map +0 -1
  671. package/dist/get-2OWWEV6Z.js +0 -65
  672. package/dist/get-2OWWEV6Z.js.map +0 -1
  673. package/dist/get-6KC43QJL.mjs +0 -65
  674. package/dist/get-6KC43QJL.mjs.map +0 -1
  675. package/dist/get-7U7LFQ3J.js +0 -50
  676. package/dist/get-7U7LFQ3J.js.map +0 -1
  677. package/dist/get-AU3XLE62.mjs +0 -143
  678. package/dist/get-AU3XLE62.mjs.map +0 -1
  679. package/dist/get-BGUSGZFV.mjs +0 -70
  680. package/dist/get-BGUSGZFV.mjs.map +0 -1
  681. package/dist/get-CFO4NMDA.js +0 -66
  682. package/dist/get-CFO4NMDA.js.map +0 -1
  683. package/dist/get-G43MO7WD.js +0 -83
  684. package/dist/get-G43MO7WD.js.map +0 -1
  685. package/dist/get-GHDQDWQP.mjs +0 -92
  686. package/dist/get-GHDQDWQP.mjs.map +0 -1
  687. package/dist/get-H42IKDCT.mjs +0 -64
  688. package/dist/get-H42IKDCT.mjs.map +0 -1
  689. package/dist/get-I3KOZE7L.js +0 -65
  690. package/dist/get-I3KOZE7L.js.map +0 -1
  691. package/dist/get-JNRGQQGH.mjs +0 -83
  692. package/dist/get-JNRGQQGH.mjs.map +0 -1
  693. package/dist/get-KCVBXOT6.mjs +0 -61
  694. package/dist/get-KCVBXOT6.mjs.map +0 -1
  695. package/dist/get-LJC3RDXI.mjs +0 -50
  696. package/dist/get-LJC3RDXI.mjs.map +0 -1
  697. package/dist/get-N3AODJG2.mjs +0 -49
  698. package/dist/get-N3AODJG2.mjs.map +0 -1
  699. package/dist/get-OGDN3INE.mjs +0 -50
  700. package/dist/get-OGDN3INE.mjs.map +0 -1
  701. package/dist/get-OLJWYXZY.js +0 -54
  702. package/dist/get-OLJWYXZY.js.map +0 -1
  703. package/dist/get-P6IYDB6P.js +0 -70
  704. package/dist/get-P6IYDB6P.js.map +0 -1
  705. package/dist/get-PAOQRO54.mjs +0 -69
  706. package/dist/get-PAOQRO54.mjs.map +0 -1
  707. package/dist/get-PUW6KGMU.js +0 -64
  708. package/dist/get-PUW6KGMU.js.map +0 -1
  709. package/dist/get-RCLWQRH2.mjs +0 -66
  710. package/dist/get-RCLWQRH2.mjs.map +0 -1
  711. package/dist/get-RXEM2RTF.mjs +0 -65
  712. package/dist/get-RXEM2RTF.mjs.map +0 -1
  713. package/dist/get-S6ETQCN4.mjs +0 -54
  714. package/dist/get-S6ETQCN4.mjs.map +0 -1
  715. package/dist/get-SQH2YN24.js +0 -50
  716. package/dist/get-SQH2YN24.js.map +0 -1
  717. package/dist/get-WTKYK6XB.js +0 -61
  718. package/dist/get-WTKYK6XB.js.map +0 -1
  719. package/dist/get-YYYA7HME.js +0 -92
  720. package/dist/get-YYYA7HME.js.map +0 -1
  721. package/dist/get-ZT4XYXFT.js +0 -143
  722. package/dist/get-ZT4XYXFT.js.map +0 -1
  723. package/dist/implementation-BEnuAoj9.d.mts +0 -710
  724. package/dist/implementation-Cpmr6P6w.d.ts +0 -710
  725. package/dist/list-2AC4KXDP.mjs +0 -76
  726. package/dist/list-2AC4KXDP.mjs.map +0 -1
  727. package/dist/list-2YYG4CTH.mjs +0 -80
  728. package/dist/list-2YYG4CTH.mjs.map +0 -1
  729. package/dist/list-3NHZ65V3.mjs +0 -80
  730. package/dist/list-3NHZ65V3.mjs.map +0 -1
  731. package/dist/list-4BAN5MYK.js +0 -81
  732. package/dist/list-4BAN5MYK.js.map +0 -1
  733. package/dist/list-4YOOWN5B.js +0 -88
  734. package/dist/list-4YOOWN5B.js.map +0 -1
  735. package/dist/list-5VEHVIMB.mjs +0 -78
  736. package/dist/list-5VEHVIMB.mjs.map +0 -1
  737. package/dist/list-67RISY7G.js +0 -76
  738. package/dist/list-67RISY7G.js.map +0 -1
  739. package/dist/list-7C2ZSN7W.mjs +0 -76
  740. package/dist/list-7C2ZSN7W.mjs.map +0 -1
  741. package/dist/list-7NPKGDDO.js +0 -98
  742. package/dist/list-7NPKGDDO.js.map +0 -1
  743. package/dist/list-C5BX5UJJ.mjs +0 -51
  744. package/dist/list-C5BX5UJJ.mjs.map +0 -1
  745. package/dist/list-CIR5SW4A.js +0 -73
  746. package/dist/list-CIR5SW4A.js.map +0 -1
  747. package/dist/list-DL3CO2T6.mjs +0 -109
  748. package/dist/list-DL3CO2T6.mjs.map +0 -1
  749. package/dist/list-EQVZD6A4.js +0 -74
  750. package/dist/list-EQVZD6A4.js.map +0 -1
  751. package/dist/list-FXTE2EFI.js +0 -80
  752. package/dist/list-FXTE2EFI.js.map +0 -1
  753. package/dist/list-GNY2VVKX.mjs +0 -76
  754. package/dist/list-GNY2VVKX.mjs.map +0 -1
  755. package/dist/list-IJGB3LJL.mjs +0 -77
  756. package/dist/list-IJGB3LJL.mjs.map +0 -1
  757. package/dist/list-KNMP675C.js +0 -77
  758. package/dist/list-KNMP675C.js.map +0 -1
  759. package/dist/list-L3TEKT63.js +0 -80
  760. package/dist/list-L3TEKT63.js.map +0 -1
  761. package/dist/list-L7ZOEU7Y.js +0 -78
  762. package/dist/list-L7ZOEU7Y.js.map +0 -1
  763. package/dist/list-LVRKMQQ5.mjs +0 -73
  764. package/dist/list-LVRKMQQ5.mjs.map +0 -1
  765. package/dist/list-MP2VHTHT.js +0 -51
  766. package/dist/list-MP2VHTHT.js.map +0 -1
  767. package/dist/list-ND3JM5IH.js +0 -76
  768. package/dist/list-ND3JM5IH.js.map +0 -1
  769. package/dist/list-QJHASMD6.mjs +0 -76
  770. package/dist/list-QJHASMD6.mjs.map +0 -1
  771. package/dist/list-RJ3RPZLQ.mjs +0 -81
  772. package/dist/list-RJ3RPZLQ.mjs.map +0 -1
  773. package/dist/list-ULQ6FHTS.js +0 -76
  774. package/dist/list-ULQ6FHTS.js.map +0 -1
  775. package/dist/list-V5CQM2OA.mjs +0 -88
  776. package/dist/list-V5CQM2OA.mjs.map +0 -1
  777. package/dist/list-WA6VJCGM.mjs +0 -78
  778. package/dist/list-WA6VJCGM.mjs.map +0 -1
  779. package/dist/list-WEYK2WYR.mjs +0 -74
  780. package/dist/list-WEYK2WYR.mjs.map +0 -1
  781. package/dist/list-XCJFWJIT.js +0 -78
  782. package/dist/list-XCJFWJIT.js.map +0 -1
  783. package/dist/list-XFIMUEX6.js +0 -76
  784. package/dist/list-XFIMUEX6.js.map +0 -1
  785. package/dist/list-Y2VLJZLB.js +0 -109
  786. package/dist/list-Y2VLJZLB.js.map +0 -1
  787. package/dist/list-YRWFRH4K.mjs +0 -98
  788. package/dist/list-YRWFRH4K.mjs.map +0 -1
  789. package/dist/login-DHKZCF5K.mjs +0 -131
  790. package/dist/login-L664DW4K.js +0 -131
  791. package/dist/login-L664DW4K.js.map +0 -1
  792. package/dist/pull-PAKPDYVA.js +0 -25
  793. package/dist/pull-PAKPDYVA.js.map +0 -1
  794. package/dist/pull-PV2C7HRL.mjs +0 -25
  795. package/dist/push-H3YRE6MK.js +0 -25
  796. package/dist/push-H3YRE6MK.js.map +0 -1
  797. package/dist/push-VKINMWTC.mjs +0 -25
  798. package/dist/query-NKJWNWSC.mjs +0 -120
  799. package/dist/query-NKJWNWSC.mjs.map +0 -1
  800. package/dist/query-PRNVLK2T.js +0 -120
  801. package/dist/query-PRNVLK2T.js.map +0 -1
  802. package/dist/records-add-55433MYY.js +0 -96
  803. package/dist/records-add-55433MYY.js.map +0 -1
  804. package/dist/records-add-6CO2LISZ.mjs +0 -96
  805. package/dist/records-add-6CO2LISZ.mjs.map +0 -1
  806. package/dist/records-delete-D3HMLTWM.mjs +0 -44
  807. package/dist/records-delete-D3HMLTWM.mjs.map +0 -1
  808. package/dist/records-delete-HB2QOJQY.js +0 -44
  809. package/dist/records-delete-HB2QOJQY.js.map +0 -1
  810. package/dist/records-list-7AU73F7X.js +0 -87
  811. package/dist/records-list-7AU73F7X.js.map +0 -1
  812. package/dist/records-list-JRT4QH3J.mjs +0 -87
  813. package/dist/records-list-JRT4QH3J.mjs.map +0 -1
  814. package/dist/records-update-NRBSIQRB.js +0 -51
  815. package/dist/records-update-NRBSIQRB.js.map +0 -1
  816. package/dist/records-update-US4EAF3H.mjs +0 -51
  817. package/dist/records-update-US4EAF3H.mjs.map +0 -1
  818. package/dist/remove-IRF3TB5F.js +0 -113
  819. package/dist/remove-IRF3TB5F.js.map +0 -1
  820. package/dist/remove-RQ6AL3OA.mjs +0 -113
  821. package/dist/remove-RQ6AL3OA.mjs.map +0 -1
  822. package/dist/rename-DYDMZGJB.js +0 -40
  823. package/dist/rename-DYDMZGJB.js.map +0 -1
  824. package/dist/rename-KER7LFRW.mjs +0 -40
  825. package/dist/rename-KER7LFRW.mjs.map +0 -1
  826. package/dist/restore-AVURXGC6.mjs +0 -66
  827. package/dist/restore-AVURXGC6.mjs.map +0 -1
  828. package/dist/restore-UYSUQPDL.js +0 -66
  829. package/dist/restore-UYSUQPDL.js.map +0 -1
  830. package/dist/run-5S46DZ7C.mjs +0 -125
  831. package/dist/run-5S46DZ7C.mjs.map +0 -1
  832. package/dist/run-6ATKPV3Y.js +0 -138
  833. package/dist/run-6ATKPV3Y.js.map +0 -1
  834. package/dist/run-AYYSLUHA.mjs +0 -81
  835. package/dist/run-AYYSLUHA.mjs.map +0 -1
  836. package/dist/run-DIMJT36T.mjs +0 -138
  837. package/dist/run-DIMJT36T.mjs.map +0 -1
  838. package/dist/run-DKGEETT5.js +0 -135
  839. package/dist/run-DKGEETT5.js.map +0 -1
  840. package/dist/run-JMXDGZEZ.js +0 -125
  841. package/dist/run-JMXDGZEZ.js.map +0 -1
  842. package/dist/run-JSJBBZ6G.js +0 -81
  843. package/dist/run-JSJBBZ6G.js.map +0 -1
  844. package/dist/run-M7WLA2TD.js +0 -70
  845. package/dist/run-M7WLA2TD.js.map +0 -1
  846. package/dist/run-S2ZH6R5M.mjs +0 -70
  847. package/dist/run-S2ZH6R5M.mjs.map +0 -1
  848. package/dist/run-ZNBGGKT3.mjs +0 -135
  849. package/dist/run-ZNBGGKT3.mjs.map +0 -1
  850. package/dist/search-DBJZEHM6.js +0 -106
  851. package/dist/search-DBJZEHM6.js.map +0 -1
  852. package/dist/search-VQCBRFWA.mjs +0 -106
  853. package/dist/search-VQCBRFWA.mjs.map +0 -1
  854. package/dist/set-34IVBUU2.js +0 -57
  855. package/dist/set-34IVBUU2.js.map +0 -1
  856. package/dist/set-UTNA64M4.mjs +0 -57
  857. package/dist/set-UTNA64M4.mjs.map +0 -1
  858. package/dist/status-EJHLRVWU.mjs +0 -65
  859. package/dist/status-EJHLRVWU.mjs.map +0 -1
  860. package/dist/status-KZL7H47O.js +0 -142
  861. package/dist/status-KZL7H47O.js.map +0 -1
  862. package/dist/status-RZV6ERKS.mjs +0 -142
  863. package/dist/status-RZV6ERKS.mjs.map +0 -1
  864. package/dist/status-TA7X23BU.js +0 -65
  865. package/dist/status-TA7X23BU.js.map +0 -1
  866. package/dist/sync-CXUHXPFM.js +0 -130
  867. package/dist/sync-CXUHXPFM.js.map +0 -1
  868. package/dist/sync-P24OW72O.mjs +0 -130
  869. package/dist/sync-P24OW72O.mjs.map +0 -1
  870. package/dist/update-2JQMSSXG.js +0 -76
  871. package/dist/update-2JQMSSXG.js.map +0 -1
  872. package/dist/update-2TVWVSSW.mjs +0 -46
  873. package/dist/update-2TVWVSSW.mjs.map +0 -1
  874. package/dist/update-2ZBBEMEO.js +0 -69
  875. package/dist/update-2ZBBEMEO.js.map +0 -1
  876. package/dist/update-42WGLHFS.mjs +0 -69
  877. package/dist/update-42WGLHFS.mjs.map +0 -1
  878. package/dist/update-452EKO6R.js +0 -46
  879. package/dist/update-452EKO6R.js.map +0 -1
  880. package/dist/update-46CDVSAD.mjs +0 -72
  881. package/dist/update-46CDVSAD.mjs.map +0 -1
  882. package/dist/update-4KPAJILS.mjs +0 -59
  883. package/dist/update-4KPAJILS.mjs.map +0 -1
  884. package/dist/update-7HV6GU4W.js +0 -69
  885. package/dist/update-7HV6GU4W.js.map +0 -1
  886. package/dist/update-D2LX4OPB.mjs +0 -63
  887. package/dist/update-D2LX4OPB.mjs.map +0 -1
  888. package/dist/update-FGYBNIOY.js +0 -63
  889. package/dist/update-FGYBNIOY.js.map +0 -1
  890. package/dist/update-FKBP2ADV.mjs +0 -76
  891. package/dist/update-FKBP2ADV.mjs.map +0 -1
  892. package/dist/update-IEKUHCWX.mjs +0 -46
  893. package/dist/update-IEKUHCWX.mjs.map +0 -1
  894. package/dist/update-IGBTFZXF.js +0 -56
  895. package/dist/update-IGBTFZXF.js.map +0 -1
  896. package/dist/update-ISOYX5BV.mjs +0 -49
  897. package/dist/update-ISOYX5BV.mjs.map +0 -1
  898. package/dist/update-IYRDXFLY.js +0 -73
  899. package/dist/update-IYRDXFLY.js.map +0 -1
  900. package/dist/update-K43ZJE2J.js +0 -49
  901. package/dist/update-K43ZJE2J.js.map +0 -1
  902. package/dist/update-K4U7WT3D.mjs +0 -56
  903. package/dist/update-K4U7WT3D.mjs.map +0 -1
  904. package/dist/update-N3J6XATO.js +0 -72
  905. package/dist/update-N3J6XATO.js.map +0 -1
  906. package/dist/update-UH6UYRF6.js +0 -59
  907. package/dist/update-UH6UYRF6.js.map +0 -1
  908. package/dist/update-UISZBZMY.js +0 -46
  909. package/dist/update-UISZBZMY.js.map +0 -1
  910. package/dist/update-VV6ZZAXT.mjs +0 -69
  911. package/dist/update-VV6ZZAXT.mjs.map +0 -1
  912. package/dist/update-Y66ODDX4.mjs +0 -73
  913. package/dist/update-Y66ODDX4.mjs.map +0 -1
  914. package/dist/upload-2NSHLTT5.js +0 -78
  915. package/dist/upload-2NSHLTT5.js.map +0 -1
  916. package/dist/upload-IVC6VXS2.mjs +0 -78
  917. package/dist/upload-IVC6VXS2.mjs.map +0 -1
  918. package/dist/versions-FKSM3CJZ.js +0 -83
  919. package/dist/versions-FKSM3CJZ.js.map +0 -1
  920. package/dist/versions-FOSEXYB5.mjs +0 -83
  921. package/dist/versions-FOSEXYB5.mjs.map +0 -1
  922. /package/dist/{chunk-5CPABRWB.mjs.map → chunk-257C3DFN.mjs.map} +0 -0
  923. /package/dist/{chunk-VDRY4UC2.mjs.map → chunk-2IBXN2UI.mjs.map} +0 -0
  924. /package/dist/{chunk-U2V5IVSB.mjs.map → chunk-36CN3DNU.mjs.map} +0 -0
  925. /package/dist/{chunk-G3SI5WO3.mjs.map → chunk-5V4TJHYH.mjs.map} +0 -0
  926. /package/dist/{chunk-ZOM375W3.mjs.map → chunk-BIAEFD56.mjs.map} +0 -0
  927. /package/dist/{chunk-7G6VZNKU.mjs.map → chunk-DDM6RZL6.mjs.map} +0 -0
  928. /package/dist/{chunk-ZTLHGFWB.mjs.map → chunk-FYV43PSH.mjs.map} +0 -0
  929. /package/dist/{chunk-BRBFTP25.mjs.map → chunk-NFARSAL7.mjs.map} +0 -0
  930. /package/dist/{chunk-Y47NPYKY.mjs.map → chunk-NHFJYJQY.mjs.map} +0 -0
  931. /package/dist/{chunk-C3ASNRX5.mjs.map → chunk-QSCT6GWB.mjs.map} +0 -0
  932. /package/dist/{chunk-3ABCXA7Q.mjs.map → chunk-T7D2GUDO.mjs.map} +0 -0
  933. /package/dist/{chunk-AN2NF2FO.mjs.map → chunk-VVZTY5MI.mjs.map} +0 -0
  934. /package/dist/{chunk-Y6O4YPT7.mjs.map → chunk-W27ODKHX.mjs.map} +0 -0
  935. /package/dist/{chunk-XRZSZSZN.mjs.map → chunk-WO2JP6VF.mjs.map} +0 -0
  936. /package/dist/{chunk-NAW5BKCY.mjs.map → chunk-XEJXLBC7.mjs.map} +0 -0
  937. /package/dist/{chunk-QJMBCUFD.mjs.map → chunk-XMVWGE2B.mjs.map} +0 -0
  938. /package/dist/{chunk-F2GVZ3PK.mjs.map → chunk-YGUS5AZR.mjs.map} +0 -0
  939. /package/dist/{chunk-6YOODI4E.mjs.map → chunk-ZA6AGQLU.mjs.map} +0 -0
  940. /package/dist/{chunk-IFHIS7NO.mjs.map → chunk-ZRTWLTE6.mjs.map} +0 -0
  941. /package/dist/{create-LF2NFL3L.mjs.map → create-2YCDG2JE.mjs.map} +0 -0
  942. /package/dist/{create-UTHQO5WC.mjs.map → create-V3AYJ5CK.mjs.map} +0 -0
  943. /package/dist/{login-DHKZCF5K.mjs.map → login-43IWV5ZX.mjs.map} +0 -0
  944. /package/dist/{pull-PV2C7HRL.mjs.map → pull-AZPRK3GN.mjs.map} +0 -0
  945. /package/dist/{push-VKINMWTC.mjs.map → push-6KWCSO2D.mjs.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","../src/client-sdk/services/experiments/experiment.ts","../src/client-sdk/services/experiments/humanReadableId.ts","../src/client-sdk/services/experiments/errors/experiment.error.ts","../src/client-sdk/services/experiments/printSummary.ts","../src/client-sdk/services/experiments/platformErrors.ts","../src/client-sdk/services/experiments/experiments.facade.ts","../src/client-sdk/services/evaluations/evaluations.facade.ts","../src/client-sdk/services/evaluations/errors.ts","../src/client-sdk/services/triggers/triggers-api.service.ts","../src/client-sdk/services/graphs/graphs-api.service.ts","../src/client-sdk/services/simulation-runs/simulation-runs-api.service.ts","../src/client-sdk/services/monitors/monitors-api.service.ts","../src/client-sdk/services/secrets/secrets-api.service.ts","../src/client-sdk/services/traces/types.ts","../src/client-sdk/services/traces/tracing/tracer.ts","../src/client-sdk/services/traces/service.ts","../src/client-sdk/services/traces/facade.ts","../src/client-sdk/index.ts","../src/index.ts"],"names":["tracer"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","sourcesContent":[null,"/**\n * Experiment - Main class for running batch experiments\n *\n * Provides a clean API for running experiments over datasets with:\n * - Automatic tracing per iteration\n * - Parallel execution with concurrency control\n * - Batched result sending\n * - Built-in evaluator support\n * - Multi-target comparison with withTarget() context isolation\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { trace, SpanStatusCode, ROOT_CONTEXT } from \"@opentelemetry/api\";\nimport { createLangWatchSpan } from \"@/observability-sdk/span/implementation\";\nimport type { LangWatchSpan } from \"@/observability-sdk/span/types\";\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { ensureSetup } from \"@/observability-sdk/setup/node\";\nimport { generateHumanReadableId } from \"./humanReadableId\";\nimport {\n ExperimentInitError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./errors\";\nimport type {\n Batch,\n BatchEntry,\n EvaluationResult,\n TargetInfo,\n TargetMetadata,\n ExperimentInitOptions,\n LogOptions,\n EvaluateOptions,\n RunOptions,\n RunCallback,\n RunContext,\n ExperimentInitResponse,\n LogResultsRequest,\n RunEvaluatorResponse,\n TargetCallback,\n TargetResult,\n TargetExecutionContext,\n TargetContext,\n} from \"./types\";\nimport { printSummary } from \"./printSummary\";\n\nconst DEFAULT_CONCURRENCY = 4;\nconst DEBOUNCE_INTERVAL_MS = 1000;\n\n// Slim projections retained across the lifetime of an Experiment for\n// printSummary() — deliberately excludes large fields (inputs, tracebacks,\n// outputs) so running thousands of items doesn't unbound memory.\ntype SummaryEvaluation = Pick<\n EvaluationResult,\n \"name\" | \"evaluator\" | \"status\" | \"passed\" | \"score\" | \"cost\" | \"target_id\"\n>;\ntype SummaryEntry = Pick<BatchEntry, \"duration\" | \"error\" | \"cost\" | \"target_id\">;\n\n/**\n * AsyncLocalStorage for iteration context isolation.\n * This stores the current item and index for each iteration,\n * preventing race conditions in concurrent execution.\n */\ntype IterationContext = {\n index: number;\n item: unknown;\n};\nconst iterationContextStorage = new AsyncLocalStorage<IterationContext>();\n\n/**\n * AsyncLocalStorage for target context isolation.\n * This allows log() calls inside withTarget() to automatically\n * infer the target without explicit specification.\n */\nconst targetContextStorage = new AsyncLocalStorage<TargetExecutionContext>();\n\n/**\n * Experiment session for running batch experiments\n */\nexport class Experiment {\n readonly name: string;\n readonly runId: string;\n readonly experimentSlug: string;\n\n private readonly apiClient: LangwatchApiClient;\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly logger: Logger;\n private readonly concurrency: number;\n\n private initialized = false;\n private createdAtMs: number;\n private total = 0;\n private progress = 0;\n\n // Batching state\n private batch: Batch = { dataset: [], evaluations: [], targets: [] };\n private lastSentMs = 0;\n private pendingFlush: Promise<void> | null = null;\n private flushTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Cumulative record for printSummary() — never cleared, mirrors batch.\n // Store only the fields printSummary() needs, not the full payloads —\n // inputs/tracebacks/outputs can be large and don't belong in retained summary state.\n private cumulativeEvaluations: SummaryEvaluation[] = [];\n private cumulativeEntries: SummaryEntry[] = [];\n private runUrl = \"\";\n\n // Target registry\n private targets = new Map<string, TargetInfo>();\n\n // Current iteration context (for log/evaluate calls)\n private currentTraceId: string | null = null;\n private currentIndex: number | null = null;\n\n // Track whether withTarget() was used in the current iteration\n // If so, we don't create dataset entries in executeItem()\n // Note: This is now checked via iterationContextStorage to be thread-safe\n private iterationUsedWithTarget = new Map<number, boolean>();\n\n // Track whether withTarget() has EVER been used in this evaluation\n // Once set to true, we stop creating iteration-level traces\n private evaluationUsesTargets = false;\n\n private constructor(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n runId?: string;\n concurrency?: number;\n }\n ) {\n this.name = name;\n this.experimentSlug = name;\n this.runId = options.runId ?? generateHumanReadableId();\n this.apiClient = options.apiClient;\n this.endpoint = options.endpoint;\n this.apiKey = options.apiKey;\n this.logger = options.logger;\n this.concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n this.createdAtMs = Date.now();\n }\n\n /**\n * Initialize an evaluation session\n */\n static async init(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n } & ExperimentInitOptions\n ): Promise<Experiment> {\n // Ensure observability is set up for proper tracing\n ensureSetup();\n\n const experiment = new Experiment(name, options);\n await experiment.initialize();\n return experiment;\n }\n\n /**\n * Initialize the evaluation by creating/getting the experiment\n */\n private async initialize(): Promise<void> {\n if (!this.apiKey) {\n throw new ExperimentInitError(\n \"API key is required. Set LANGWATCH_API_KEY or pass apiKey to LangWatch constructor.\"\n );\n }\n\n try {\n const response = await fetch(`${this.endpoint}/api/experiment/init`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Token\": this.apiKey,\n },\n body: JSON.stringify({\n experiment_name: this.name,\n experiment_slug: this.experimentSlug,\n experiment_type: \"BATCH_EVALUATION_V2\",\n }),\n });\n\n if (response.status === 401) {\n throw new ExperimentInitError(\"Invalid API key\");\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new ExperimentInitError(`Failed to initialize experiment: ${text}`);\n }\n\n const data = (await response.json()) as ExperimentInitResponse;\n (this as { experimentSlug: string }).experimentSlug = data.slug;\n\n const encodedRunId = encodeURIComponent(this.runId);\n this.runUrl = `${this.endpoint.replace(/\\/$/, \"\")}${data.path}?runId=${encodedRunId}`;\n console.log(`Follow results at: ${this.runUrl}`);\n\n this.initialized = true;\n } catch (error) {\n if (error instanceof ExperimentInitError) {\n throw error;\n }\n throw new ExperimentInitError(\n `Failed to initialize evaluation: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Run evaluation over a dataset with a callback\n *\n * @param dataset - Array of items to evaluate\n * @param callback - Function called for each item with { item, index, span }\n * @param options - Concurrency options\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index, span }) => {\n * const response = await myAgent(item.question);\n * evaluation.log('accuracy', { index, score: 0.95 });\n * }, { concurrency: 4 });\n * ```\n */\n async run<T>(\n dataset: T[],\n callback: RunCallback<T>,\n options?: RunOptions\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const concurrency = options?.concurrency ?? this.concurrency;\n this.total = dataset.length;\n this.progress = 0;\n\n const tracer = trace.getTracer(\"langwatch\");\n\n // Process items with concurrency control\n const executing = new Set<Promise<void>>();\n\n for (let index = 0; index < dataset.length; index++) {\n const item = dataset[index] as T;\n\n const itemPromise = this.executeItem(tracer, item, index, callback);\n\n executing.add(itemPromise);\n void itemPromise.finally(() => executing.delete(itemPromise));\n\n // Wait if we've hit concurrency limit\n if (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n }\n\n // Wait for all remaining items\n await Promise.all(executing);\n\n // Flush OTEL spans so all child spans created inside callbacks are exported\n const provider = trace.getTracerProvider();\n const delegate = \"getDelegate\" in provider && typeof provider.getDelegate === \"function\"\n ? provider.getDelegate()\n : provider;\n if (delegate && \"forceFlush\" in delegate && typeof delegate.forceFlush === \"function\") {\n await delegate.forceFlush();\n }\n\n // Send final batch with finished timestamp\n await this.flush(true);\n }\n\n /**\n * Execute a single item in the dataset\n */\n private async executeItem<T>(\n tracer: ReturnType<typeof trace.getTracer>,\n item: T,\n index: number,\n callback: RunCallback<T>\n ): Promise<void> {\n const startTime = Date.now();\n let error: Error | undefined;\n let capturedTraceId: string | null = null;\n\n // Reset withTarget tracking for this iteration\n this.iterationUsedWithTarget.set(index, false);\n\n // Set up iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext: IterationContext = { index, item };\n\n // If evaluation uses targets, skip creating iteration-level traces\n // Each withTarget() call will create its own independent trace\n if (this.evaluationUsesTargets) {\n await iterationContextStorage.run(iterationContext, async () => {\n this.currentIndex = index;\n\n try {\n // Create a minimal span context for the callback\n const span = {\n setStatus: () => { /* no-op */ },\n recordException: () => { /* no-op */ },\n end: () => { /* no-op */ },\n } as unknown as LangWatchSpan;\n\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n this.currentIndex = null;\n }\n });\n } else {\n await iterationContextStorage.run(iterationContext, async () => {\n await tracer.startActiveSpan(\n \"evaluation.iteration\",\n {\n attributes: {\n \"langwatch.origin\": \"evaluation\",\n \"evaluation.run_id\": this.runId,\n \"evaluation.index\": index,\n },\n },\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const traceId = spanContext.traceId;\n\n // Set current context for log/evaluate calls\n this.currentTraceId = traceId;\n this.currentIndex = index;\n capturedTraceId = traceId;\n\n try {\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n span.end();\n this.currentTraceId = null;\n this.currentIndex = null;\n }\n }\n );\n });\n }\n\n // Only add a dataset entry if withTarget() was NOT used\n // When withTarget() is used, it creates its own dataset entries per target\n if (!this.iterationUsedWithTarget.get(index)) {\n const duration = Date.now() - startTime;\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(item),\n duration,\n error: error?.message ?? null,\n trace_id: capturedTraceId ?? this.getTraceIdFromContext(),\n };\n\n this.batch.dataset.push(entry);\n this.cumulativeEntries.push({\n duration: entry.duration,\n error: entry.error,\n cost: entry.cost,\n target_id: entry.target_id,\n });\n }\n\n // Clean up\n this.iterationUsedWithTarget.delete(index);\n\n this.progress++;\n\n // Debounced send\n this.scheduleSend();\n }\n\n /**\n * Log a custom metric result\n *\n * @param metric - Name of the metric\n * @param options - Metric options including index, score, passed, etc.\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Explicit target (outside withTarget)\n * evaluation.log('accuracy', { index, score: 0.95, target: 'gpt-4' });\n *\n * // Implicit target (inside withTarget)\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * evaluation.log('accuracy', { score: 0.95 }); // target and index auto-inferred\n * });\n * ```\n */\n log(metric: string, options: LogOptions): void {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data = {},\n score,\n passed,\n label,\n details,\n status = options.error ? \"error\" : \"processed\",\n duration,\n cost,\n error,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n // Register target if provided (explicit or from context)\n let targetId: string | undefined;\n if (target) {\n targetId = this.registerTarget(target, metadata);\n }\n\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n\n const result: EvaluationResult = {\n name: metric,\n evaluator: metric,\n trace_id: traceId,\n status,\n data,\n score: score ?? null,\n passed: passed ?? null,\n details: details ?? (error ? error.message : null),\n index,\n label: label ?? null,\n cost: cost ?? null,\n duration: duration ?? null,\n error_type: error ? error.name : null,\n traceback: error ? [error.stack ?? error.message] : null,\n target_id: targetId ?? null,\n };\n\n this.batch.evaluations.push(result);\n this.cumulativeEvaluations.push({\n name: result.name,\n evaluator: result.evaluator,\n status: result.status,\n passed: result.passed,\n score: result.score,\n cost: result.cost,\n target_id: result.target_id,\n });\n this.scheduleSend();\n }\n\n /**\n * Run a built-in evaluator\n *\n * @param evaluatorSlug - The evaluator identifier (e.g., 'ragas/faithfulness')\n * @param options - Evaluator options including data and settings\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Inside withTarget() - target and index auto-inferred\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * await evaluation.evaluate('ragas/faithfulness', {\n * data: { input, output, contexts },\n * });\n * });\n *\n * // Or explicit index/target\n * await evaluation.evaluate('ragas/faithfulness', {\n * index,\n * data: { input, output, contexts },\n * target: 'gpt-4',\n * });\n * ```\n */\n async evaluate(evaluatorSlug: string, options: EvaluateOptions): Promise<void> {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data,\n settings,\n name,\n asGuardrail = false,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n const startTime = Date.now();\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n const spanId = targetContext?.spanId ?? this.getSpanIdFromContext();\n\n try {\n const response = await fetch(\n `${this.endpoint}/api/evaluations/${evaluatorSlug}/evaluate`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Token\": this.apiKey,\n },\n body: JSON.stringify({\n trace_id: traceId ?? null,\n span_id: spanId ?? null,\n name: name ?? evaluatorSlug,\n data,\n settings,\n as_guardrail: asGuardrail,\n }),\n }\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new EvaluatorError(evaluatorSlug, text);\n }\n\n const result = (await response.json()) as RunEvaluatorResponse;\n const duration = Date.now() - startTime;\n\n // Log the result\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: result.status,\n score: result.score ?? undefined,\n passed: result.passed ?? undefined,\n details: result.details ?? undefined,\n label: result.label ?? undefined,\n duration,\n cost: result.cost?.amount,\n target,\n metadata,\n });\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (error instanceof EvaluatorError) {\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: error,\n target,\n metadata,\n });\n throw error;\n }\n\n const wrappedError = new EvaluatorError(\n evaluatorSlug,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n );\n\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: wrappedError,\n target,\n metadata,\n });\n\n throw wrappedError;\n }\n }\n\n /**\n * Execute code within a target context with automatic tracing\n *\n * Creates a new span for this target execution and sets up context\n * so that log() calls inside the callback automatically use this target.\n * Duration and output are captured automatically.\n *\n * This creates a dataset entry per target (like Evaluations V3), enabling\n * proper per-target latency and cost tracking.\n *\n * @param targetName - Unique identifier for the target\n * @param metadata - Optional metadata for comparison (e.g., { model: 'gpt-4' })\n * @param callback - Function to execute within the target context\n * @returns The callback result along with captured metrics\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index }) => {\n * // Compare GPT-4 and Claude on the same input\n * const [gpt4Result, claudeResult] = await Promise.all([\n * evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * const response = await openai.chat(item.question);\n * evaluation.log('quality', { score: 0.95 }); // target auto-inferred\n * return response;\n * }),\n * evaluation.withTarget('claude-3', { model: 'anthropic/claude-3' }, async () => {\n * const response = await anthropic.messages(item.question);\n * evaluation.log('quality', { score: 0.85 }); // target auto-inferred\n * return response;\n * }),\n * ]);\n * });\n * ```\n */\n async withTarget<R>(\n targetName: string,\n metadata: TargetMetadata | null,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n metadataOrCallback: TargetMetadata | null | TargetCallback<R>,\n maybeCallback?: TargetCallback<R>\n ): Promise<TargetResult<R>> {\n // Handle overloads\n const metadata =\n typeof metadataOrCallback === \"function\" ? null : metadataOrCallback;\n const callback =\n typeof metadataOrCallback === \"function\" ? metadataOrCallback : maybeCallback!;\n\n // On FIRST withTarget() call ever in this evaluation:\n // - Set flag to skip creating iteration-level traces going forward\n if (!this.evaluationUsesTargets) {\n this.evaluationUsesTargets = true;\n }\n\n // Get iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext = iterationContextStorage.getStore();\n const index = iterationContext?.index ?? this.currentIndex ?? 0;\n const currentItem = iterationContext?.item;\n\n // Mark that withTarget() was used - prevents executeItem from creating a dataset entry\n this.iterationUsedWithTarget.set(index, true);\n\n // Register target\n this.registerTarget(targetName, metadata ?? undefined);\n\n const tracer = trace.getTracer(\"langwatch\");\n const startTime = Date.now();\n let result: R | undefined;\n let traceId = \"\";\n let spanId = \"\";\n let callbackError: Error | undefined;\n\n // Create an INDEPENDENT root span using ROOT_CONTEXT\n // This ensures each target gets a unique trace_id, not shared with iteration\n await tracer.startActiveSpan(\n `evaluation.target.${targetName}`,\n {\n attributes: {\n \"langwatch.origin\": \"evaluation\",\n \"evaluation.run_id\": this.runId,\n \"evaluation.target\": targetName,\n \"evaluation.index\": index,\n },\n },\n ROOT_CONTEXT,\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const rawTraceId = spanContext.traceId;\n spanId = spanContext.spanId;\n\n // Check if this is a no-op trace (all zeros = no tracer configured)\n const isNoOpTrace = rawTraceId === \"00000000000000000000000000000000\";\n traceId = isNoOpTrace ? \"\" : rawTraceId;\n\n // Set up the target execution context\n const executionContext: TargetExecutionContext = {\n targetId: targetName,\n traceId,\n spanId,\n index,\n };\n\n try {\n // Run callback within AsyncLocalStorage context\n result = await targetContextStorage.run(executionContext, async () => {\n const ctx: TargetContext = { span, traceId, spanId };\n const callbackResult = callback(ctx);\n\n if (callbackResult && typeof (callbackResult as Promise<R>).then === \"function\") {\n return await callbackResult;\n }\n return callbackResult as R;\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n callbackError = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: callbackError.message,\n });\n span.recordException(callbackError);\n throw err;\n } finally {\n span.end();\n }\n }\n );\n\n const duration = Date.now() - startTime;\n\n // Serialize the result as \"predicted\" output (similar to Evaluations V3)\n let predicted: Record<string, unknown> | null = null;\n if (result !== undefined && result !== null) {\n predicted = typeof result === \"object\"\n ? (result as Record<string, unknown>)\n : { output: result };\n }\n\n // Create a dataset entry for this target execution (like Evaluations V3)\n // This captures per-target duration/latency properly\n // Use currentItem from iteration context (thread-safe), NOT shared instance variable\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(currentItem),\n duration,\n error: callbackError?.message ?? null,\n trace_id: traceId || null, // null if no tracer configured (no-op)\n target_id: targetName,\n predicted,\n };\n\n this.batch.dataset.push(entry);\n this.cumulativeEntries.push({\n duration: entry.duration,\n error: entry.error,\n cost: entry.cost,\n target_id: entry.target_id,\n });\n this.scheduleSend();\n\n return {\n result: result!,\n duration,\n traceId,\n spanId,\n };\n }\n\n /**\n * Register a target for multi-target comparison\n */\n private registerTarget(name: string, metadata?: TargetMetadata): string {\n const existing = this.targets.get(name);\n\n if (existing) {\n // Check for metadata conflict\n if (metadata) {\n const existingMeta = existing.metadata ?? {};\n if (JSON.stringify(existingMeta) !== JSON.stringify(metadata)) {\n throw new TargetMetadataConflictError(name, existingMeta, metadata);\n }\n }\n return name;\n }\n\n // Register new target\n const targetInfo: TargetInfo = {\n id: name,\n name,\n type: \"custom\",\n metadata: metadata ?? null,\n };\n\n this.targets.set(name, targetInfo);\n this.batch.targets.push(targetInfo);\n\n return name;\n }\n\n /**\n * Schedule a debounced send\n */\n private scheduleSend(): void {\n const now = Date.now();\n\n if (now - this.lastSentMs >= DEBOUNCE_INTERVAL_MS) {\n this.sendBatch();\n } else {\n this.flushTimeout ??= setTimeout(() => {\n this.flushTimeout = null;\n this.sendBatch();\n }, DEBOUNCE_INTERVAL_MS - (now - this.lastSentMs));\n }\n }\n\n /**\n * Print a CI-friendly summary and optionally exit with code 1 on failure.\n *\n * Mirrors `ExperimentRunResult.printSummary` for parity — SDK-driven experiments\n * can now fail CI builds the same way platform experiments do.\n *\n * @param exitOnFailure - If true (default), calls `process.exit(1)` when any evaluation failed.\n *\n * @example\n * ```typescript\n * const experiment = await langwatch.experiments.init(\"ci-quality-check\");\n * await experiment.run(dataset, async ({ item, index }) => {\n * const response = await myLLM(item.input);\n * await experiment.evaluate(\"ragas/faithfulness\", { index, data: { input: item.input, output: response } });\n * });\n * experiment.printSummary();\n * ```\n */\n printSummary(exitOnFailure = true): void {\n const evaluators = new Map<\n string,\n { passed: number; failed: number; scoreSum: number; scoreCount: number }\n >();\n let totalPassed = 0;\n let totalFailed = 0;\n let totalCost = 0;\n\n for (const e of this.cumulativeEvaluations) {\n const name = e.name ?? e.evaluator ?? \"unknown\";\n if (!evaluators.has(name)) {\n evaluators.set(name, { passed: 0, failed: 0, scoreSum: 0, scoreCount: 0 });\n }\n const stats = evaluators.get(name)!;\n // Evaluators that crashed come back as status:\"error\" with passed often null;\n // treat them as failures so CI doesn't silently succeed on evaluator crashes.\n if (e.status === \"error\" || e.passed === false) {\n stats.failed += 1;\n totalFailed += 1;\n } else if (e.passed === true) {\n stats.passed += 1;\n totalPassed += 1;\n }\n if (typeof e.score === \"number\") {\n stats.scoreSum += e.score;\n stats.scoreCount += 1;\n }\n if (typeof e.cost === \"number\") {\n totalCost += e.cost;\n }\n }\n\n const targets = new Map<\n string,\n { passed: number; failed: number; latencySum: number; latencyCount: number; cost: number }\n >();\n for (const entry of this.cumulativeEntries) {\n const tid = entry.target_id;\n if (!tid) continue;\n if (!targets.has(tid)) {\n targets.set(tid, { passed: 0, failed: 0, latencySum: 0, latencyCount: 0, cost: 0 });\n }\n const stats = targets.get(tid)!;\n if (typeof entry.duration === \"number\") {\n stats.latencySum += entry.duration;\n stats.latencyCount += 1;\n }\n if (typeof entry.cost === \"number\") {\n stats.cost += entry.cost;\n }\n }\n // Lazily seed target stats from evaluations too — a user can log an\n // evaluation with an explicit target_id without ever going through\n // withTarget(), in which case the per-target entry row may not carry\n // target_id. Without this, such a target would be silently dropped from\n // the per-target summary.\n for (const e of this.cumulativeEvaluations) {\n const tid = e.target_id;\n if (!tid) continue;\n if (!targets.has(tid)) {\n targets.set(tid, { passed: 0, failed: 0, latencySum: 0, latencyCount: 0, cost: 0 });\n }\n const stats = targets.get(tid)!;\n if (e.status === \"error\" || e.passed === false) stats.failed += 1;\n else if (e.passed === true) stats.passed += 1;\n if (typeof e.cost === \"number\") stats.cost += e.cost;\n }\n\n const total = totalPassed + totalFailed;\n const passRate = total > 0 ? (totalPassed / total) * 100 : 0;\n\n // Wall-clock duration from init — summing entry durations over-counts\n // under concurrent withTarget() calls (each target produces its own entry).\n const duration = Math.max(0, Date.now() - this.createdAtMs);\n\n // Count entries whose target/loop execution errored out — distinct from\n // evaluator failures but must also trigger CI exit.\n let failedCells = 0;\n for (const entry of this.cumulativeEntries) {\n if (typeof entry.cost === \"number\") totalCost += entry.cost;\n if (entry.error) failedCells += 1;\n }\n\n const hasFailures = totalFailed > 0 || failedCells > 0;\n\n printSummary({\n runId: this.runId,\n status: hasFailures ? \"failed\" : \"completed\",\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl: this.runUrl,\n summary: {\n runId: this.runId,\n totalCells: this.cumulativeEntries.length || total,\n completedCells: Math.max(0, (this.cumulativeEntries.length || total) - failedCells),\n failedCells,\n duration,\n runUrl: this.runUrl,\n totalPassed,\n totalFailed,\n passRate,\n totalCost,\n targets: Array.from(targets.entries()).map(([targetId, s]) => ({\n targetId,\n name: targetId,\n passed: s.passed,\n failed: s.failed,\n avgLatency: s.latencyCount > 0 ? s.latencySum / s.latencyCount : 0,\n totalCost: s.cost,\n })),\n evaluators: Array.from(evaluators.entries()).map(([name, s]) => ({\n evaluatorId: name,\n name,\n passed: s.passed,\n failed: s.failed,\n passRate: s.passed + s.failed > 0 ? (s.passed / (s.passed + s.failed)) * 100 : 0,\n avgScore: s.scoreCount > 0 ? s.scoreSum / s.scoreCount : undefined,\n })),\n },\n });\n\n if (exitOnFailure && hasFailures) {\n process.exit(1);\n }\n }\n\n /**\n * Send current batch to the API\n */\n private sendBatch(finished = false): void {\n if (\n this.batch.dataset.length === 0 &&\n this.batch.evaluations.length === 0 &&\n this.batch.targets.length === 0 &&\n !finished\n ) {\n return;\n }\n\n const body: LogResultsRequest = {\n experiment_slug: this.experimentSlug,\n name: this.name,\n run_id: this.runId,\n dataset: this.batch.dataset.map((entry) => ({\n index: entry.index,\n entry: entry.entry,\n duration: entry.duration,\n error: entry.error,\n trace_id: entry.trace_id,\n target_id: entry.target_id ?? null,\n cost: entry.cost ?? null,\n // Only include predicted if it's defined (omit entirely when null/undefined)\n ...(entry.predicted !== undefined && entry.predicted !== null\n ? { predicted: entry.predicted }\n : {}),\n })),\n evaluations: this.batch.evaluations.map((e) => ({\n name: e.name,\n evaluator: e.evaluator,\n trace_id: e.trace_id,\n status: e.status,\n inputs: e.data,\n score: e.score,\n passed: e.passed,\n details: e.details,\n index: e.index,\n label: e.label,\n cost: e.cost,\n duration: e.duration,\n target_id: e.target_id,\n })),\n targets: this.batch.targets,\n progress: this.progress,\n total: this.total,\n timestamps: {\n created_at: this.createdAtMs,\n finished_at: finished ? Date.now() : null,\n },\n };\n\n // Fire and forget (with error logging)\n this.pendingFlush = fetch(`${this.endpoint}/api/evaluations/batch/log_results`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (!response.ok) {\n this.logger.error(`Failed to send batch: ${response.status}`);\n }\n })\n .catch((error) => {\n this.logger.error(\"Failed to send batch:\", error);\n });\n\n // Clear batch\n this.batch = { dataset: [], evaluations: [], targets: [] };\n this.lastSentMs = Date.now();\n }\n\n /**\n * Flush all pending data\n */\n private async flush(finished = false): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n this.sendBatch(finished);\n\n if (this.pendingFlush) {\n await this.pendingFlush;\n }\n }\n\n /**\n * Serialize a dataset item for the API\n */\n private serializeItem(item: unknown): unknown {\n if (item === null || item === undefined) {\n return item;\n }\n\n if (typeof item === \"object\") {\n // Handle objects with toJSON method\n if (\"toJSON\" in item && typeof (item as { toJSON: unknown }).toJSON === \"function\") {\n return (item as { toJSON: () => unknown }).toJSON();\n }\n // Return as-is, JSON.stringify will handle it\n return item;\n }\n\n return item;\n }\n\n /**\n * Get trace ID from current OpenTelemetry context\n */\n private getTraceIdFromContext(): string {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().traceId;\n }\n return \"\";\n }\n\n /**\n * Get span ID from current OpenTelemetry context\n */\n private getSpanIdFromContext(): string | null {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().spanId;\n }\n return null;\n }\n}\n","/**\n * Human-readable ID generator\n *\n * Generates memorable, human-readable identifiers using adjective-adjective-noun combinations.\n * Similar to Docker container names, Heroku app names, etc.\n */\n\nconst ADJECTIVES = [\n \"swift\", \"bright\", \"calm\", \"eager\", \"bold\", \"keen\", \"warm\", \"cool\", \"wise\", \"fair\",\n \"glad\", \"kind\", \"neat\", \"pure\", \"safe\", \"true\", \"vast\", \"wild\", \"zesty\", \"agile\",\n \"brave\", \"crisp\", \"dense\", \"epic\", \"fresh\", \"grand\", \"happy\", \"ideal\", \"jolly\", \"lively\",\n \"merry\", \"noble\", \"proud\", \"quick\", \"rapid\", \"sharp\", \"smart\", \"solid\", \"sunny\", \"vivid\",\n \"gentle\", \"silent\", \"cosmic\", \"golden\", \"silver\", \"ancient\", \"modern\", \"mighty\", \"humble\",\n];\n\nconst NOUNS = [\n \"fox\", \"owl\", \"bee\", \"elk\", \"hawk\", \"lynx\", \"wolf\", \"bear\", \"deer\", \"dove\",\n \"eagle\", \"finch\", \"heron\", \"koala\", \"lemur\", \"moose\", \"otter\", \"panda\", \"raven\", \"robin\",\n \"seal\", \"swan\", \"tiger\", \"whale\", \"zebra\", \"atlas\", \"bloom\", \"cloud\", \"delta\", \"ember\",\n \"flame\", \"grove\", \"haven\", \"iris\", \"jade\", \"leaf\", \"moon\", \"nova\", \"ocean\", \"peak\",\n \"river\", \"spark\", \"storm\", \"tide\", \"wave\", \"comet\", \"prism\", \"coral\",\n];\n\n/**\n * Generate a human-readable ID with 3 words like \"swift-bright-fox\"\n * Uses adjective-adjective-noun pattern for ~125,000 combinations.\n */\nexport const generateHumanReadableId = (separator = \"-\"): string => {\n // Pick two different adjectives\n const adj1Index = Math.floor(Math.random() * ADJECTIVES.length);\n let adj2Index = Math.floor(Math.random() * ADJECTIVES.length);\n if (adj2Index === adj1Index) {\n adj2Index = (adj2Index + 1) % ADJECTIVES.length;\n }\n\n const adjective1 = ADJECTIVES[adj1Index]!;\n const adjective2 = ADJECTIVES[adj2Index]!;\n const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]!;\n\n return `${adjective1}${separator}${adjective2}${separator}${noun}`;\n};\n","/**\n * Errors for the Experiments API\n */\n\n/**\n * Base error for experiment-related issues\n */\nexport class ExperimentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExperimentError\";\n }\n}\n\n/**\n * Thrown when initialization fails\n */\nexport class ExperimentInitError extends ExperimentError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"ExperimentInitError\";\n }\n}\n\n/**\n * Thrown when API calls fail\n */\nexport class ExperimentApiError extends ExperimentError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"ExperimentApiError\";\n }\n}\n\n/**\n * Thrown when target metadata conflicts\n */\nexport class TargetMetadataConflictError extends ExperimentError {\n constructor(\n public readonly targetName: string,\n public readonly existingMetadata: Record<string, unknown>,\n public readonly newMetadata: Record<string, unknown>\n ) {\n super(\n `Target '${targetName}' was previously registered with different metadata.\\n` +\n `Original: ${JSON.stringify(existingMetadata)}\\n` +\n `New: ${JSON.stringify(newMetadata)}\\n` +\n `If you want to use different metadata, please use a different target name.`\n );\n this.name = \"TargetMetadataConflictError\";\n }\n}\n\n/**\n * Thrown when an evaluator call fails\n */\nexport class EvaluatorError extends ExperimentError {\n constructor(\n public readonly evaluatorSlug: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(`Evaluator '${evaluatorSlug}' failed: ${message}`);\n this.name = \"EvaluatorError\";\n }\n}\n","import type { ExperimentRunResult } from \"./platformTypes\";\n\n/**\n * Print a CI-friendly summary of experiment results to stdout.\n *\n * Shared between platform runs (`langwatch.experiments.run`) and SDK-driven\n * experiments (`langwatch.experiments.init` → `experiment.printSummary()`).\n */\nexport function printSummary(result: Omit<ExperimentRunResult, \"printSummary\" | \"toString\">): void {\n const { runId, status, passed, failed, passRate, duration, runUrl, summary } = result;\n\n console.log(\"\\n\" + \"═\".repeat(60));\n console.log(\" EXPERIMENT RESULTS\");\n console.log(\"═\".repeat(60));\n console.log(` Run ID: ${runId}`);\n console.log(` Status: ${status.toUpperCase()}`);\n console.log(` Duration: ${(duration / 1000).toFixed(1)}s`);\n console.log(\"─\".repeat(60));\n console.log(` Passed: ${passed}`);\n console.log(` Failed: ${failed}`);\n console.log(` Pass Rate: ${passRate.toFixed(1)}%`);\n if (summary.totalCost) {\n console.log(` Total Cost: $${summary.totalCost.toFixed(4)}`);\n }\n\n if (summary.targets && summary.targets.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" TARGETS:\");\n for (const target of summary.targets) {\n console.log(` ${target.name}: ${target.passed} passed, ${target.failed} failed`);\n if (target.avgLatency) {\n console.log(` Avg latency: ${target.avgLatency.toFixed(0)}ms`);\n }\n if (target.totalCost) {\n console.log(` Total cost: $${target.totalCost.toFixed(4)}`);\n }\n }\n }\n\n if (summary.evaluators && summary.evaluators.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" EVALUATORS:\");\n for (const evaluator of summary.evaluators) {\n console.log(` ${evaluator.name}: ${evaluator.passRate.toFixed(1)}% pass rate`);\n if (evaluator.avgScore !== undefined) {\n console.log(` Avg score: ${evaluator.avgScore.toFixed(2)}`);\n }\n }\n }\n\n console.log(\"─\".repeat(60));\n console.log(` View details: ${runUrl}`);\n console.log(\"═\".repeat(60) + \"\\n\");\n}\n","/**\n * Error classes for platform experiments API (Experiments Workbench)\n */\n\n/**\n * Base error for experiment operations\n */\nexport class ExperimentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExperimentsError\";\n }\n}\n\n/**\n * Error when experiment is not found\n */\nexport class ExperimentNotFoundError extends ExperimentsError {\n constructor(slug: string) {\n super(`Experiment not found: ${slug}`);\n this.name = \"ExperimentNotFoundError\";\n }\n}\n\n/**\n * Error when experiment run times out\n */\nexport class ExperimentTimeoutError extends ExperimentsError {\n readonly runId: string;\n readonly progress: number;\n readonly total: number;\n\n constructor(runId: string, progress: number, total: number) {\n super(`Experiment run timed out: ${runId} (${progress}/${total} completed)`);\n this.name = \"ExperimentTimeoutError\";\n this.runId = runId;\n this.progress = progress;\n this.total = total;\n }\n}\n\n/**\n * Error when experiment run fails\n */\nexport class ExperimentRunFailedError extends ExperimentsError {\n readonly runId: string;\n readonly errorMessage: string;\n\n constructor(runId: string, errorMessage: string) {\n super(`Experiment run failed: ${errorMessage}`);\n this.name = \"ExperimentRunFailedError\";\n this.runId = runId;\n this.errorMessage = errorMessage;\n }\n}\n\n/**\n * Error from the experiments API\n */\nexport class ExperimentsApiError extends ExperimentsError {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"ExperimentsApiError\";\n this.statusCode = statusCode;\n }\n}\n","/**\n * ExperimentsFacade - Entry point for the experiments API\n *\n * Provides:\n * - `init()` method to create experiment sessions (SDK-defined experiments)\n * - `run()` method to execute platform-configured experiments (Experiments Workbench)\n */\n\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { Experiment } from \"./experiment\";\nimport type { ExperimentInitOptions } from \"./types\";\nimport type {\n ExperimentRunResult,\n RunExperimentOptions,\n ExperimentRunSummary,\n} from \"./platformTypes\";\nimport {\n ExperimentsApiError,\n ExperimentNotFoundError,\n ExperimentTimeoutError,\n ExperimentRunFailedError,\n} from \"./platformErrors\";\nimport { printSummary } from \"./printSummary\";\n\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_TIMEOUT = 600000; // 10 minutes\n\ntype ExperimentsFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n};\n\n/**\n * Facade for creating experiment sessions and running platform-configured experiments\n */\nexport class ExperimentsFacade {\n private readonly config: ExperimentsFacadeConfig;\n\n constructor(config: ExperimentsFacadeConfig) {\n this.config = config;\n }\n\n /**\n * Initialize a new experiment session (SDK-defined)\n *\n * @param name - Name of the experiment (used as slug)\n * @param options - Optional configuration\n * @returns An initialized Experiment instance\n *\n * @example\n * ```typescript\n * const experiment = await langwatch.experiments.init('my-experiment');\n *\n * await experiment.run(dataset, async ({ item, index }) => {\n * const response = await myAgent(item.question);\n * experiment.log('accuracy', { index, score: 0.95 });\n * });\n * ```\n */\n async init(name: string, options?: ExperimentInitOptions): Promise<Experiment> {\n return Experiment.init(name, {\n apiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n ...options,\n });\n }\n\n /**\n * Run a platform-configured experiment (Experiments Workbench)\n *\n * This runs an experiment that was configured in the LangWatch platform.\n * The method automatically prints a summary and exits with code 1 on failure\n * (unless `exitOnFailure: false` is passed).\n *\n * @param slug - The slug of the experiment (found in the experiment URL)\n * @param options - Optional configuration\n * @returns The experiment results including pass rate and summary\n *\n * @example\n * ```typescript\n * import { LangWatch } from \"langwatch\";\n *\n * const langwatch = new LangWatch();\n *\n * const result = await langwatch.experiments.run(\"my-experiment-slug\");\n * result.printSummary();\n * ```\n */\n async run(slug: string, options?: RunExperimentOptions): Promise<ExperimentRunResult> {\n this.config.logger.info(`Running platform experiment: ${slug}`);\n const result = await this.runWithPolling(slug, options);\n return result;\n }\n\n /**\n * Run an experiment and wait for completion using polling\n */\n private async runWithPolling(\n slug: string,\n options: RunExperimentOptions = {}\n ): Promise<ExperimentRunResult> {\n const pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n // Start the run\n const startResponse = await this.startRun(slug);\n const { runId } = startResponse;\n\n // Use the run URL from API but replace domain with configured endpoint\n const apiRunUrl = startResponse.runUrl ?? \"\";\n const runUrl = apiRunUrl ? this.replaceUrlDomain(apiRunUrl, this.config.endpoint) : \"\";\n\n console.log(`Started experiment run: ${runId}`);\n if (runUrl) {\n console.log(`Follow live: ${runUrl}`);\n }\n\n const total = startResponse.total;\n let lastProgress = 0;\n\n // Print initial progress\n if (total > 0) {\n process.stdout.write(`Progress: 0/${total} (0%)`);\n }\n options.onProgress?.(0, total);\n\n const startTime = Date.now();\n\n // Poll until complete\n while (true) {\n if (Date.now() - startTime > timeout) {\n console.log(); // Newline after progress\n const finalStatus = await this.getRunStatus(runId);\n throw new ExperimentTimeoutError(runId, finalStatus.progress, finalStatus.total);\n }\n\n await this.sleep(pollInterval);\n\n const status = await this.getRunStatus(runId);\n const progress = status.progress;\n\n // Update progress display if changed\n if (progress !== lastProgress && status.total > 0) {\n const percentage = Math.round((progress / status.total) * 100);\n process.stdout.write(`\\rProgress: ${progress}/${status.total} (${percentage}%)`);\n lastProgress = progress;\n }\n\n options.onProgress?.(status.progress, status.total);\n\n if (status.status === \"completed\") {\n console.log(); // Newline after progress\n const summary = status.summary!;\n return this.buildResult(runId, \"completed\", summary, runUrl ?? \"\");\n }\n\n if (status.status === \"failed\") {\n console.log(); // Newline after progress\n throw new ExperimentRunFailedError(runId, status.error ?? \"Unknown error\");\n }\n\n if (status.status === \"stopped\") {\n console.log(); // Newline after progress\n return this.buildResult(runId, \"stopped\", status.summary ?? {\n runId,\n totalCells: status.total,\n completedCells: status.progress,\n failedCells: 0,\n duration: Date.now() - startTime,\n }, runUrl ?? \"\");\n }\n }\n }\n\n /**\n * Start an experiment run\n */\n private async startRun(slug: string): Promise<{ runId: string; total: number; runUrl?: string }> {\n const response = await this.config.langwatchApiClient.POST(\n \"/api/evaluations/v3/{slug}/run\",\n {\n params: {\n path: { slug },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new ExperimentNotFoundError(slug);\n }\n\n if (status === 401) {\n throw new ExperimentsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to start experiment: ${slug}`;\n throw new ExperimentsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as { runId: string; total: number; runUrl?: string };\n }\n\n /**\n * Get the status of a run\n */\n private async getRunStatus(runId: string): Promise<{\n status: string;\n progress: number;\n total: number;\n summary?: ExperimentRunSummary;\n error?: string;\n }> {\n const response = await this.config.langwatchApiClient.GET(\n \"/api/evaluations/v3/runs/{runId}\",\n {\n params: {\n path: { runId },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new ExperimentsApiError(`Run not found: ${runId}`, 404);\n }\n\n if (status === 401) {\n throw new ExperimentsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to get run status: ${runId}`;\n throw new ExperimentsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as {\n status: string;\n progress: number;\n total: number;\n summary?: ExperimentRunSummary;\n error?: string;\n };\n }\n\n /**\n * Build the result object from API response\n */\n private buildResult(\n runId: string,\n status: \"completed\" | \"failed\" | \"stopped\",\n summary: ExperimentRunSummary,\n runUrl: string\n ): ExperimentRunResult {\n const completedCells = summary.completedCells ?? 0;\n const failedCells = summary.failedCells ?? 0;\n const duration = summary.duration ?? 0;\n\n const totalPassed = summary.totalPassed ?? completedCells - failedCells;\n const totalFailed = summary.totalFailed ?? failedCells;\n const passRate = summary.passRate ??\n (completedCells > 0 ? (totalPassed / completedCells) * 100 : 0);\n\n const result: ExperimentRunResult = {\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl,\n summary,\n printSummary: (exitOnFailure = true) => {\n printSummary({\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl: summary.runUrl ?? runUrl,\n summary,\n });\n\n if (exitOnFailure && totalFailed > 0) {\n process.exit(1);\n }\n },\n toString: () =>\n `ExperimentRunResult { status: ${status.toUpperCase()}, passed: ${totalPassed}, failed: ${totalFailed}, passRate: ${passRate.toFixed(1)}%, duration: ${(duration / 1000).toFixed(1)}s }`,\n };\n\n // Custom Node.js inspect for console.log\n (result as Record<string | symbol, unknown>)[Symbol.for(\"nodejs.util.inspect.custom\")] =\n () => result.toString();\n\n return result;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Replace the domain of a URL with a new base URL, preserving the path\n */\n private replaceUrlDomain(url: string, newBase: string): string {\n if (!url) return url;\n\n try {\n const parsedUrl = new URL(url);\n const parsedNewBase = new URL(newBase);\n\n // Replace origin with new base, keep path/query/fragment\n return `${parsedNewBase.origin}${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`;\n } catch {\n // If URL parsing fails, return original\n return url;\n }\n }\n}\n","/**\n * EvaluationsFacade - Entry point for the Evaluations API (Online Evaluations / Guardrails)\n *\n * Provides an API for running evaluators and guardrails in real-time against LLM inputs/outputs.\n *\n * @example\n * ```typescript\n * const langwatch = new LangWatch({ apiKey: \"your-api-key\" });\n *\n * // Run a guardrail\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection\",\n * asGuardrail: true,\n * settings: {},\n * });\n *\n * if (!guardrail.passed) {\n * return \"I'm sorry, I can't do that.\";\n * }\n * ```\n */\n\nimport { trace, SpanStatusCode, context as otelContext } from \"@opentelemetry/api\";\nimport { createLangWatchSpan } from \"@/observability-sdk/span/implementation\";\nimport type {\n EvaluationResult,\n EvaluateOptions,\n EvaluateRequest,\n EvaluateResponse,\n} from \"./types\";\nimport {\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./errors\";\nimport type { Logger } from \"@/logger\";\n\ntype EvaluationsFacadeConfig = {\n endpoint: string;\n apiKey: string;\n logger: Logger;\n};\n\nexport class EvaluationsFacade {\n readonly #endpoint: string;\n readonly #apiKey: string;\n readonly #logger: Logger;\n\n constructor(config: EvaluationsFacadeConfig) {\n this.#endpoint = config.endpoint;\n this.#apiKey = config.apiKey;\n this.#logger = config.logger;\n }\n\n /**\n * Run an evaluator or guardrail against provided data\n *\n * Creates an OpenTelemetry span attached to the current trace context,\n * calls the LangWatch evaluation API, and returns the result.\n *\n * @param slug - The evaluator slug (e.g., \"presidio/pii_detection\", \"langevals/llm_boolean\")\n * @param options - Evaluation options including data, name, settings, and asGuardrail flag\n * @returns The evaluation result with status, passed, score, details, label, and cost\n *\n * @example\n * ```typescript\n * // Run as a guardrail (synchronous evaluation that can block responses)\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection Guardrail\",\n * asGuardrail: true,\n * });\n *\n * if (!guardrail.passed) {\n * console.log(\"PII detected:\", guardrail.details);\n * return \"Sorry, I cannot process that request.\";\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Run as an online evaluation (async scoring for monitoring)\n * const result = await langwatch.evaluations.evaluate(\"langevals/llm_boolean\", {\n * data: { input: question, output: response },\n * name: \"Quality Check\",\n * settings: { prompt: \"Check if the response answers the question.\" },\n * });\n *\n * console.log(\"Score:\", result.score);\n * console.log(\"Details:\", result.details);\n * ```\n */\n evaluate = async (\n slug: string,\n options: EvaluateOptions\n ): Promise<EvaluationResult> => {\n const { data, name, settings, asGuardrail } = options;\n const spanName = name ?? slug;\n const spanType = asGuardrail ? \"guardrail\" : \"evaluation\";\n\n // Get tracer and create a span attached to the current context\n const tracer = trace.getTracer(\"langwatch-evaluations\");\n\n // Get current trace/span IDs from active context\n const activeSpan = trace.getActiveSpan();\n const traceId = activeSpan\n ? activeSpan.spanContext().traceId\n : undefined;\n const parentSpanId = activeSpan\n ? activeSpan.spanContext().spanId\n : undefined;\n\n // Start the evaluation span\n const otelSpan = tracer.startSpan(\n spanName,\n {\n attributes: {\n \"langwatch.span.type\": spanType,\n },\n },\n otelContext.active()\n );\n\n const langwatchSpan = createLangWatchSpan(otelSpan);\n\n // Set span input\n langwatchSpan.setType(spanType);\n langwatchSpan.setInput({\n data,\n ...(settings && { settings }),\n });\n\n try {\n // Build request payload\n const requestBody: EvaluateRequest = {\n trace_id: traceId ?? null,\n span_id: parentSpanId ?? null,\n name: name ?? null,\n data,\n settings,\n as_guardrail: asGuardrail,\n };\n\n // Call the evaluation API\n const url = `${this.#endpoint}/api/evaluations/${slug}/evaluate`;\n\n this.#logger.debug(`Calling evaluation API: ${url}`);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Token\": this.#apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n if (response.status === 404) {\n throw new EvaluatorNotFoundError(slug);\n }\n\n throw new EvaluationsApiError(\n `Evaluation API returned ${response.status}: ${errorText}`,\n response.status\n );\n }\n\n const responseData = (await response.json()) as EvaluateResponse;\n\n // Map response to result\n const result: EvaluationResult = {\n status: responseData.status,\n ...(responseData.passed !== null && responseData.passed !== undefined && { passed: responseData.passed }),\n ...(responseData.score !== null && responseData.score !== undefined && { score: responseData.score }),\n ...(responseData.details !== null && responseData.details !== undefined && { details: responseData.details }),\n ...(responseData.label !== null && responseData.label !== undefined && { label: responseData.label }),\n ...(responseData.cost !== null && responseData.cost !== undefined && { cost: responseData.cost }),\n };\n\n // Update span with output\n langwatchSpan.setOutput({\n type: asGuardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: result,\n });\n\n // Set span status based on result\n if (result.status === \"error\") {\n otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: result.details ?? \"Evaluation failed\",\n });\n } else {\n otelSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return result;\n } catch (error) {\n // Handle errors\n const errorResult: EvaluationResult = {\n status: \"error\",\n details: error instanceof Error ? error.message : String(error),\n };\n\n // For guardrails, default to passed=true on error to avoid blocking\n if (asGuardrail) {\n errorResult.passed = true;\n }\n\n // Update span with error\n langwatchSpan.setOutput({\n type: asGuardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: errorResult,\n });\n\n otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorResult.details,\n });\n\n if (error instanceof Error) {\n otelSpan.recordException(error);\n }\n\n // Re-throw known errors\n if (\n error instanceof EvaluatorNotFoundError ||\n error instanceof EvaluationsApiError ||\n error instanceof EvaluatorCallError\n ) {\n throw error;\n }\n\n // Wrap unknown errors\n throw new EvaluatorCallError(\n slug,\n error instanceof Error ? error.message : String(error)\n );\n } finally {\n // Always end the span\n otelSpan.end();\n }\n };\n}\n","/**\n * Error classes for the Evaluations API\n */\n\n/**\n * Base error for evaluation operations\n */\nexport class EvaluationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EvaluationError\";\n }\n}\n\n/**\n * Error when an evaluator call fails\n */\nexport class EvaluatorCallError extends EvaluationError {\n readonly evaluatorSlug: string;\n readonly statusCode?: number;\n\n constructor(evaluatorSlug: string, message: string, statusCode?: number) {\n super(`Evaluator '${evaluatorSlug}' failed: ${message}`);\n this.name = \"EvaluatorCallError\";\n this.evaluatorSlug = evaluatorSlug;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error when evaluator is not found\n */\nexport class EvaluatorNotFoundError extends EvaluationError {\n readonly evaluatorSlug: string;\n\n constructor(evaluatorSlug: string) {\n super(`Evaluator not found: ${evaluatorSlug}`);\n this.name = \"EvaluatorNotFoundError\";\n this.evaluatorSlug = evaluatorSlug;\n }\n}\n\n/**\n * Error from the evaluations API\n */\nexport class EvaluationsApiError extends EvaluationError {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"EvaluationsApiError\";\n this.statusCode = statusCode;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type TriggerResponse = NonNullable<\n paths[\"/api/triggers\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreateTriggerBody = NonNullable<\n paths[\"/api/triggers\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdateTriggerBody = NonNullable<\n paths[\"/api/triggers/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type TriggerDeleteResponse =\n paths[\"/api/triggers/{id}\"][\"delete\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class TriggersApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"TriggersApiError\";\n }\n}\n\nexport class TriggersApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new TriggersApiError(message, operation, error);\n }\n\n async getAll(): Promise<TriggerResponse[]> {\n const { data, error } = await this.apiClient.GET(\"/api/triggers\");\n if (error) this.handleApiError(\"list triggers\", error);\n return data;\n }\n\n async get(id: string): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/triggers/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`get trigger \"${id}\"`, error);\n return data;\n }\n\n async create(params: CreateTriggerBody): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.POST(\"/api/triggers\", {\n body: params,\n });\n if (error) this.handleApiError(\"create trigger\", error);\n return data;\n }\n\n async update(id: string, params: UpdateTriggerBody): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.PATCH(\"/api/triggers/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update trigger \"${id}\"`, error);\n return data;\n }\n\n async delete(id: string): Promise<TriggerDeleteResponse> {\n const { data, error } = await this.apiClient.DELETE(\"/api/triggers/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`delete trigger \"${id}\"`, error);\n return data;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type GraphResponse = NonNullable<\n paths[\"/api/graphs\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreateGraphBody = NonNullable<\n paths[\"/api/graphs\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdateGraphBody = NonNullable<\n paths[\"/api/graphs/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type GraphDeleteResponse =\n paths[\"/api/graphs/{id}\"][\"delete\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class GraphsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"GraphsApiError\";\n }\n}\n\nexport class GraphsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new GraphsApiError(message, operation, error);\n }\n\n async getAll(dashboardId?: string): Promise<GraphResponse[]> {\n const { data, error } = await this.apiClient.GET(\"/api/graphs\", {\n params: { query: { dashboardId } },\n });\n if (error) this.handleApiError(\"list graphs\", error);\n return data;\n }\n\n async get(id: string): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/graphs/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`get graph \"${id}\"`, error);\n return data;\n }\n\n async create(params: CreateGraphBody): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.POST(\"/api/graphs\", {\n body: params,\n });\n if (error) this.handleApiError(\"create graph\", error);\n return data;\n }\n\n async update(id: string, params: UpdateGraphBody): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.PATCH(\"/api/graphs/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update graph \"${id}\"`, error);\n return data;\n }\n\n async delete(id: string): Promise<GraphDeleteResponse> {\n const { data, error } = await this.apiClient.DELETE(\"/api/graphs/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`delete graph \"${id}\"`, error);\n return data;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type SimulationRunsListResponse =\n paths[\"/api/simulation-runs\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunResponse =\n paths[\"/api/simulation-runs/{scenarioRunId}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunsBatchesListResponse =\n paths[\"/api/simulation-runs/batches/list\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunsListParams = NonNullable<\n paths[\"/api/simulation-runs\"][\"get\"][\"parameters\"][\"query\"]\n>;\n\nexport type SimulationRunsBatchesListParams =\n paths[\"/api/simulation-runs/batches/list\"][\"get\"][\"parameters\"][\"query\"];\n\nexport class SimulationRunsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"SimulationRunsApiError\";\n }\n}\n\nexport class SimulationRunsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new SimulationRunsApiError(message, operation, error);\n }\n\n async getAll(params?: SimulationRunsListParams): Promise<SimulationRunsListResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/simulation-runs\", {\n params: { query: params },\n });\n if (error) this.handleApiError(\"list simulation runs\", error);\n return data;\n }\n\n async get(scenarioRunId: string): Promise<SimulationRunResponse> {\n const { data, error } = await this.apiClient.GET(\n \"/api/simulation-runs/{scenarioRunId}\",\n {\n params: { path: { scenarioRunId } },\n },\n );\n if (error)\n this.handleApiError(`get simulation run \"${scenarioRunId}\"`, error);\n return data;\n }\n\n async listBatches(\n params: SimulationRunsBatchesListParams,\n ): Promise<SimulationRunsBatchesListResponse> {\n const { data, error } = await this.apiClient.GET(\n \"/api/simulation-runs/batches/list\",\n {\n params: { query: params },\n },\n );\n if (error) this.handleApiError(\"list simulation run batches\", error);\n return data;\n }\n}\n","import { DEFAULT_ENDPOINT } from \"@/internal/constants\";\nimport { formatApiErrorMessage } from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport interface MonitorResponse {\n id: string;\n name: string;\n slug: string;\n checkType: string;\n enabled: boolean;\n executionMode: string;\n sample: number;\n level: string;\n evaluatorId: string | null;\n preconditions: unknown[];\n parameters: Record<string, unknown>;\n mappings: Record<string, unknown>;\n threadIdleTimeout: number | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateMonitorBody {\n name: string;\n checkType: string;\n executionMode?: string;\n sample?: number;\n level?: string;\n preconditions?: unknown[];\n parameters?: Record<string, unknown>;\n mappings?: Record<string, unknown>;\n}\n\nexport interface UpdateMonitorBody {\n name?: string;\n enabled?: boolean;\n executionMode?: string;\n sample?: number;\n preconditions?: unknown[];\n parameters?: Record<string, unknown>;\n mappings?: Record<string, unknown>;\n}\n\nexport interface MonitorDeleteResponse {\n id: string;\n deleted: boolean;\n}\n\nexport class MonitorsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"MonitorsApiError\";\n }\n}\n\nexport class MonitorsApiService {\n private readonly apiKey: string;\n private readonly endpoint: string;\n\n constructor(config?: { apiKey?: string; endpoint?: string }) {\n this.apiKey = config?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n this.endpoint = config?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n }\n\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(`${this.endpoint}${path}`, {\n ...options,\n headers: {\n \"X-Auth-Token\": this.apiKey,\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let parsed: unknown = errorText;\n try {\n parsed = JSON.parse(errorText);\n } catch {\n // leave as raw text\n }\n const message = formatApiErrorMessage({ error: parsed, options: { status: response.status } });\n throw new MonitorsApiError(\n `HTTP ${response.status}: ${message}`,\n options?.method ?? \"GET\",\n parsed,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAll(): Promise<MonitorResponse[]> {\n return this.request<MonitorResponse[]>(\"/api/monitors\");\n }\n\n async get(id: string): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}`);\n }\n\n async create(body: CreateMonitorBody): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(\"/api/monitors\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async update(id: string, body: UpdateMonitorBody): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}`, {\n method: \"PATCH\",\n body: JSON.stringify(body),\n });\n }\n\n async toggle(id: string, enabled: boolean): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}/toggle`, {\n method: \"POST\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n async delete(id: string): Promise<MonitorDeleteResponse> {\n return this.request<MonitorDeleteResponse>(`/api/monitors/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n }\n}\n","import { DEFAULT_ENDPOINT } from \"@/internal/constants\";\nimport { formatApiErrorMessage } from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport interface SecretResponse {\n id: string;\n projectId: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SecretDeleteResponse {\n id: string;\n deleted: boolean;\n}\n\nexport class SecretsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"SecretsApiError\";\n }\n}\n\nexport class SecretsApiService {\n private readonly apiKey: string;\n private readonly endpoint: string;\n\n constructor(config?: { apiKey?: string; endpoint?: string }) {\n this.apiKey = config?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n this.endpoint = config?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n }\n\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(`${this.endpoint}${path}`, {\n ...options,\n headers: {\n \"X-Auth-Token\": this.apiKey,\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let parsed: unknown = errorText;\n try {\n parsed = JSON.parse(errorText);\n } catch {\n // leave as raw text\n }\n const message = formatApiErrorMessage({ error: parsed, options: { status: response.status } });\n throw new SecretsApiError(\n `HTTP ${response.status}: ${message}`,\n options?.method ?? \"GET\",\n parsed,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAll(): Promise<SecretResponse[]> {\n return this.request<SecretResponse[]>(\"/api/secrets\");\n }\n\n async get(id: string): Promise<SecretResponse> {\n return this.request<SecretResponse>(`/api/secrets/${encodeURIComponent(id)}`);\n }\n\n async create(body: { name: string; value: string }): Promise<SecretResponse> {\n return this.request<SecretResponse>(\"/api/secrets\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async update(id: string, body: { value: string }): Promise<SecretResponse> {\n return this.request<SecretResponse>(`/api/secrets/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n });\n }\n\n async delete(id: string): Promise<SecretDeleteResponse> {\n return this.request<SecretDeleteResponse>(`/api/secrets/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\n\nexport interface GetTraceParams {\n includeSpans?: boolean;\n}\n\nexport type GetTraceResponse = NonNullable<\n paths[\"/api/trace/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Custom error class for Traces API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class TracesError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"TracesError\";\n }\n}\n","import { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\nimport { getLangWatchTracer } from \"@/observability-sdk/tracer\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.traces`, LANGWATCH_SDK_VERSION);\n","import { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type GetTraceParams, TracesError, type GetTraceResponse } from \"./types\";\nimport { tracer } from \"./tracing\";\n\n/**\n * Service for managing trace resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - Retrieving trace data\n * - Error handling with contextual information\n *\n * All methods return trace response objects directly.\n */\nexport class TracesService {\n private config: InternalConfig;\n\n constructor(config: InternalConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as TracesService,\n tracer,\n );\n }\n\n /**\n * Handles API errors by throwing a TracesError with operation context.\n * @param operation Description of the operation being performed.\n * @param error The error object returned from the API client.\n * @throws {TracesError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error ?? error?.message ?? \"Unknown error occurred\";\n throw new TracesError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Retrieves a trace by its ID.\n * @param traceId The trace's unique identifier.\n * @param params Optional parameters for the request.\n * @returns The trace response object.\n * @throws {TracesError} If the API call fails.\n */\n async get(\n traceId: string,\n params?: GetTraceParams,\n ): Promise<GetTraceResponse> {\n const { data, error } = await this.config.langwatchApiClient.GET(\"/api/trace/{id}\", {\n params: {\n path: {\n id: traceId,\n },\n },\n query: params,\n });\n\n if (error) {\n this.handleApiError(\"get trace\", error);\n }\n\n return data;\n }\n}\n","import { type InternalConfig } from \"../../types\";\nimport { TracesService } from \"./service\";\nimport { type GetTraceParams, type GetTraceResponse } from \"./types\";\n\nexport class TracesFacade {\n readonly #service: TracesService;\n\n constructor(config: InternalConfig) {\n this.#service = new TracesService(config);\n }\n\n async get(traceId: string, params?: GetTraceParams): Promise<GetTraceResponse> {\n return this.#service.get(traceId, params);\n }\n}\n","import { PromptsFacade, PromptsApiService } from \"./services/prompts\";\nexport { FetchPolicy, type GetPromptOptions } from \"./services/prompts\";\nexport type {\n Dataset,\n DatasetEntry,\n DatasetMetadata,\n DatasetColumnType,\n DatasetListItem,\n Pagination,\n PaginatedResponse,\n GetDatasetOptions,\n ListDatasetsOptions,\n ListDatasetsApiResponse,\n ListRecordsOptions,\n ListRecordsApiResponse,\n CreateDatasetOptions,\n UpdateDatasetOptions,\n CreateFromUploadResponse,\n BatchCreateRecordsResponse,\n DeleteRecordsResponse,\n UploadResponse,\n DatasetRecordResponse,\n} from \"./services/datasets\";\nexport { DatasetError, DatasetNotFoundError, DatasetApiError, DatasetValidationError, DatasetPlanLimitError } from \"./services/datasets\";\nexport type { ExperimentRunResult, RunExperimentOptions } from \"./services/experiments\";\nexport {\n ExperimentsError,\n ExperimentNotFoundError,\n ExperimentTimeoutError,\n ExperimentRunFailedError,\n ExperimentsApiError,\n} from \"./services/experiments\";\nexport type { EvaluationResult, EvaluateOptions, EvaluationStatus, EvaluationCost } from \"./services/evaluations\";\nexport {\n EvaluationError,\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./services/evaluations\";\nexport { EvaluatorsApiService, EvaluatorsApiError } from \"./services/evaluators\";\nexport { ScenariosApiService, ScenariosApiError } from \"./services/scenarios\";\nexport { SuitesApiService, SuitesApiError } from \"./services/suites\";\nexport { WorkflowsApiService, WorkflowsApiError } from \"./services/workflows/workflows-api.service\";\nexport { AgentsApiService, AgentsApiError } from \"./services/agents/agents-api.service\";\nexport { AnnotationsApiService, AnnotationsApiError } from \"./services/annotations/annotations-api.service\";\nexport { DashboardsApiService, DashboardsApiError } from \"./services/dashboards/dashboards-api.service\";\nexport { ModelProvidersApiService, ModelProvidersApiError } from \"./services/model-providers/model-providers-api.service\";\nexport { AnalyticsApiService, AnalyticsApiError } from \"./services/analytics/analytics-api.service\";\nexport { TriggersApiService, TriggersApiError } from \"./services/triggers\";\nexport { GraphsApiService, GraphsApiError } from \"./services/graphs\";\nexport { SimulationRunsApiService, SimulationRunsApiError } from \"./services/simulation-runs\";\nexport { TracesApiService, TracesApiError } from \"./services/traces/traces-api.service\";\nexport { MonitorsApiService, MonitorsApiError } from \"./services/monitors\";\nexport { SecretsApiService, SecretsApiError } from \"./services/secrets\";\nimport { LocalPromptsService } from \"./services/prompts/local-prompts.service\";\nimport { ExperimentsFacade } from \"./services/experiments\";\nimport { DatasetsFacade } from \"./services/datasets\";\nimport { EvaluationsFacade } from \"./services/evaluations\";\nimport { EvaluatorsApiService } from \"./services/evaluators\";\nimport { ScenariosApiService } from \"./services/scenarios\";\nimport { SuitesApiService } from \"./services/suites\";\nimport { WorkflowsApiService } from \"./services/workflows/workflows-api.service\";\nimport { AgentsApiService } from \"./services/agents/agents-api.service\";\nimport { AnnotationsApiService } from \"./services/annotations/annotations-api.service\";\nimport { DashboardsApiService } from \"./services/dashboards/dashboards-api.service\";\nimport { ModelProvidersApiService } from \"./services/model-providers/model-providers-api.service\";\nimport { AnalyticsApiService } from \"./services/analytics/analytics-api.service\";\nimport { TriggersApiService } from \"./services/triggers\";\nimport { GraphsApiService } from \"./services/graphs\";\nimport { SimulationRunsApiService } from \"./services/simulation-runs\";\nimport { MonitorsApiService } from \"./services/monitors\";\nimport { SecretsApiService } from \"./services/secrets\";\nimport { type InternalConfig } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"../internal/api/client\";\nimport { type Logger, NoOpLogger } from \"../logger\";\nimport { TracesFacade } from \"./services/traces/facade\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\nexport interface LangWatchConstructorOptions {\n apiKey?: string;\n endpoint?: string;\n options?: {\n logger?: Logger;\n };\n}\n\nexport class LangWatch {\n private readonly config: InternalConfig & { endpoint: string; apiKey: string };\n\n readonly prompts: PromptsFacade;\n readonly traces: TracesFacade;\n readonly datasets: DatasetsFacade;\n\n /**\n * Run experiments on LangWatch platform or via SDK.\n *\n * Platform experiments (CI/CD):\n * ```typescript\n * const result = await langwatch.experiments.run(\"my-experiment-slug\");\n * result.printSummary();\n * ```\n *\n * SDK-defined experiments:\n * ```typescript\n * const experiment = await langwatch.experiments.init(\"my-experiment\");\n * // ... run evaluators using experiment.evaluate()\n * ```\n */\n readonly experiments: ExperimentsFacade;\n\n /**\n * Run evaluators and guardrails in real-time (Online Evaluations).\n *\n * @example\n * ```typescript\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection\",\n * asGuardrail: true,\n * });\n *\n * if (!guardrail.passed) {\n * return \"I'm sorry, I can't do that.\";\n * }\n * ```\n */\n readonly evaluations: EvaluationsFacade;\n\n readonly evaluators: EvaluatorsApiService;\n readonly scenarios: ScenariosApiService;\n readonly suites: SuitesApiService;\n readonly workflows: WorkflowsApiService;\n readonly agents: AgentsApiService;\n readonly annotations: AnnotationsApiService;\n readonly dashboards: DashboardsApiService;\n readonly modelProviders: ModelProvidersApiService;\n readonly analytics: AnalyticsApiService;\n readonly triggers: TriggersApiService;\n readonly graphs: GraphsApiService;\n readonly simulationRuns: SimulationRunsApiService;\n readonly monitors: MonitorsApiService;\n readonly secrets: SecretsApiService;\n\n constructor(options: LangWatchConstructorOptions = {}) {\n const apiKey = options.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = options.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n this.config = this.#createInternalConfig({\n apiKey,\n endpoint,\n options: options.options,\n });\n\n this.prompts = new PromptsFacade({\n promptsApiService: new PromptsApiService(this.config),\n localPromptsService: new LocalPromptsService(),\n ...this.config,\n });\n this.traces = new TracesFacade(this.config);\n\n this.experiments = new ExperimentsFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n });\n\n this.datasets = new DatasetsFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n logger: this.config.logger,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n });\n\n this.evaluations = new EvaluationsFacade({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n });\n\n this.evaluators = new EvaluatorsApiService(this.config);\n this.scenarios = new ScenariosApiService(this.config);\n this.suites = new SuitesApiService(this.config);\n this.workflows = new WorkflowsApiService(this.config);\n this.agents = new AgentsApiService(this.config);\n this.annotations = new AnnotationsApiService(this.config);\n this.dashboards = new DashboardsApiService(this.config);\n this.modelProviders = new ModelProvidersApiService(this.config);\n this.analytics = new AnalyticsApiService(this.config);\n this.triggers = new TriggersApiService(this.config);\n this.graphs = new GraphsApiService(this.config);\n this.simulationRuns = new SimulationRunsApiService(this.config);\n this.monitors = new MonitorsApiService({ apiKey, endpoint });\n this.secrets = new SecretsApiService({ apiKey, endpoint });\n }\n\n get apiClient(): LangwatchApiClient {\n return this.config.langwatchApiClient;\n }\n\n #createInternalConfig({\n apiKey,\n endpoint,\n options,\n }: {\n apiKey: string;\n endpoint: string;\n options?: LangWatchConstructorOptions[\"options\"];\n }): InternalConfig & { endpoint: string; apiKey: string } {\n return {\n logger: options?.logger ?? new NoOpLogger(),\n langwatchApiClient: createLangWatchApiClient(apiKey, endpoint),\n endpoint,\n apiKey,\n };\n }\n}\n","import { ConsoleLogger, NoOpLogger } from \"./logger\";\n\nexport {\n getLangWatchTracer,\n getLangWatchLogger,\n attributes,\n} from \"./observability-sdk\";\n\nexport {\n FilterableBatchSpanProcessor,\n type SpanProcessingExcludeRule,\n} from \"./observability-sdk/processors\";\nexport { LangWatchExporter } from \"./observability-sdk/exporters\";\nexport { LangWatch, FetchPolicy, type GetPromptOptions } from \"./client-sdk\";\n\n// Experiments API exports\nexport {\n Experiment,\n ExperimentsFacade,\n type EvaluationStatus as ExperimentEvaluationStatus,\n type TargetType,\n type TargetMetadata,\n type TargetInfo,\n type EvaluationResult as ExperimentEvaluationResult,\n type ExperimentInitOptions,\n type LogOptions,\n type EvaluateOptions as ExperimentEvaluateOptions,\n type RunOptions,\n type RunCallback,\n type RunContext,\n ExperimentError,\n ExperimentInitError,\n ExperimentApiError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./client-sdk/services/experiments\";\n\n// Evaluators API exports\nexport {\n EvaluatorsApiService,\n type EvaluatorResponse,\n type EvaluatorField,\n type CreateEvaluatorBody,\n EvaluatorsApiError,\n} from \"./client-sdk/services/evaluators\";\n\n// Dataset API exports\nexport {\n DatasetsFacade,\n DatasetError,\n DatasetNotFoundError,\n DatasetApiError,\n DatasetValidationError,\n DatasetPlanLimitError,\n type Dataset,\n type DatasetEntry,\n type DatasetMetadata,\n type DatasetColumnType,\n type DatasetListItem,\n type Pagination,\n type PaginatedResponse,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type CreateFromUploadResponse,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./client-sdk/services/datasets\";\n\n// Evaluations API exports (Online Evaluations / Guardrails)\nexport {\n EvaluationsFacade,\n type EvaluationResult,\n type EvaluateOptions,\n type EvaluationStatus,\n type EvaluationCost,\n EvaluationError,\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./client-sdk/services/evaluations\";\n\nexport const logger = {\n ConsoleLogger,\n NoOpLogger,\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","../src/client-sdk/services/experiments/experiment.ts","../src/client-sdk/services/experiments/humanReadableId.ts","../src/client-sdk/services/experiments/errors/experiment.error.ts","../src/client-sdk/services/experiments/printSummary.ts","../src/client-sdk/services/experiments/platformErrors.ts","../src/client-sdk/services/experiments/experiments.facade.ts","../src/client-sdk/services/evaluations/evaluations.facade.ts","../src/client-sdk/services/evaluations/errors.ts","../src/client-sdk/services/triggers/triggers-api.service.ts","../src/client-sdk/services/graphs/graphs-api.service.ts","../src/client-sdk/services/simulation-runs/simulation-runs-api.service.ts","../src/client-sdk/services/monitors/monitors-api.service.ts","../src/client-sdk/services/secrets/secrets-api.service.ts","../src/client-sdk/services/traces/types.ts","../src/client-sdk/services/traces/tracing/tracer.ts","../src/client-sdk/services/traces/service.ts","../src/client-sdk/services/traces/facade.ts","../src/client-sdk/index.ts","../src/index.ts"],"names":["tracer"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","sourcesContent":[null,"/**\n * Experiment - Main class for running batch experiments\n *\n * Provides a clean API for running experiments over datasets with:\n * - Automatic tracing per iteration\n * - Parallel execution with concurrency control\n * - Batched result sending\n * - Built-in evaluator support\n * - Multi-target comparison with withTarget() context isolation\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { trace, SpanStatusCode, ROOT_CONTEXT } from \"@opentelemetry/api\";\nimport { createLangWatchSpan } from \"@/observability-sdk/span/implementation\";\nimport type { LangWatchSpan } from \"@/observability-sdk/span/types\";\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { ensureSetup } from \"@/observability-sdk/setup/node\";\nimport { generateHumanReadableId } from \"./humanReadableId\";\nimport {\n ExperimentInitError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./errors\";\nimport type {\n Batch,\n BatchEntry,\n EvaluationResult,\n TargetInfo,\n TargetMetadata,\n ExperimentInitOptions,\n LogOptions,\n EvaluateOptions,\n RunOptions,\n RunCallback,\n RunContext,\n ExperimentInitResponse,\n LogResultsRequest,\n RunEvaluatorResponse,\n TargetCallback,\n TargetResult,\n TargetExecutionContext,\n TargetContext,\n} from \"./types\";\nimport { printSummary } from \"./printSummary\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\n\nconst DEFAULT_CONCURRENCY = 4;\nconst DEBOUNCE_INTERVAL_MS = 1000;\n\n// Slim projections retained across the lifetime of an Experiment for\n// printSummary() — deliberately excludes large fields (inputs, tracebacks,\n// outputs) so running thousands of items doesn't unbound memory.\ntype SummaryEvaluation = Pick<\n EvaluationResult,\n \"name\" | \"evaluator\" | \"status\" | \"passed\" | \"score\" | \"cost\" | \"target_id\"\n>;\ntype SummaryEntry = Pick<BatchEntry, \"duration\" | \"error\" | \"cost\" | \"target_id\">;\n\n/**\n * AsyncLocalStorage for iteration context isolation.\n * This stores the current item and index for each iteration,\n * preventing race conditions in concurrent execution.\n */\ntype IterationContext = {\n index: number;\n item: unknown;\n};\nconst iterationContextStorage = new AsyncLocalStorage<IterationContext>();\n\n/**\n * AsyncLocalStorage for target context isolation.\n * This allows log() calls inside withTarget() to automatically\n * infer the target without explicit specification.\n */\nconst targetContextStorage = new AsyncLocalStorage<TargetExecutionContext>();\n\n/**\n * Experiment session for running batch experiments\n */\nexport class Experiment {\n readonly name: string;\n readonly runId: string;\n readonly experimentSlug: string;\n\n private readonly apiClient: LangwatchApiClient;\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly logger: Logger;\n private readonly concurrency: number;\n\n private initialized = false;\n private createdAtMs: number;\n private total = 0;\n private progress = 0;\n\n // Batching state\n private batch: Batch = { dataset: [], evaluations: [], targets: [] };\n private lastSentMs = 0;\n private pendingFlush: Promise<void> | null = null;\n private flushTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Cumulative record for printSummary() — never cleared, mirrors batch.\n // Store only the fields printSummary() needs, not the full payloads —\n // inputs/tracebacks/outputs can be large and don't belong in retained summary state.\n private cumulativeEvaluations: SummaryEvaluation[] = [];\n private cumulativeEntries: SummaryEntry[] = [];\n private runUrl = \"\";\n\n // Target registry\n private targets = new Map<string, TargetInfo>();\n\n // Current iteration context (for log/evaluate calls)\n private currentTraceId: string | null = null;\n private currentIndex: number | null = null;\n\n // Track whether withTarget() was used in the current iteration\n // If so, we don't create dataset entries in executeItem()\n // Note: This is now checked via iterationContextStorage to be thread-safe\n private iterationUsedWithTarget = new Map<number, boolean>();\n\n // Track whether withTarget() has EVER been used in this evaluation\n // Once set to true, we stop creating iteration-level traces\n private evaluationUsesTargets = false;\n\n private constructor(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n runId?: string;\n concurrency?: number;\n }\n ) {\n this.name = name;\n this.experimentSlug = name;\n this.runId = options.runId ?? generateHumanReadableId();\n this.apiClient = options.apiClient;\n this.endpoint = options.endpoint;\n this.apiKey = options.apiKey;\n this.logger = options.logger;\n this.concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n this.createdAtMs = Date.now();\n }\n\n /**\n * Initialize an evaluation session\n */\n static async init(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n } & ExperimentInitOptions\n ): Promise<Experiment> {\n // Ensure observability is set up for proper tracing\n ensureSetup();\n\n const experiment = new Experiment(name, options);\n await experiment.initialize();\n return experiment;\n }\n\n /**\n * Initialize the evaluation by creating/getting the experiment\n */\n private async initialize(): Promise<void> {\n if (!this.apiKey) {\n throw new ExperimentInitError(\n \"API key is required. Set LANGWATCH_API_KEY or pass apiKey to LangWatch constructor.\"\n );\n }\n\n try {\n const response = await fetch(`${this.endpoint}/api/experiment/init`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildAuthHeaders({ apiKey: this.apiKey }),\n },\n body: JSON.stringify({\n experiment_name: this.name,\n experiment_slug: this.experimentSlug,\n experiment_type: \"BATCH_EVALUATION_V2\",\n }),\n });\n\n if (response.status === 401) {\n throw new ExperimentInitError(\"Invalid API key\");\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new ExperimentInitError(`Failed to initialize experiment: ${text}`);\n }\n\n const data = (await response.json()) as ExperimentInitResponse;\n (this as { experimentSlug: string }).experimentSlug = data.slug;\n\n const encodedRunId = encodeURIComponent(this.runId);\n this.runUrl = `${this.endpoint.replace(/\\/$/, \"\")}${data.path}?runId=${encodedRunId}`;\n console.log(`Follow results at: ${this.runUrl}`);\n\n this.initialized = true;\n } catch (error) {\n if (error instanceof ExperimentInitError) {\n throw error;\n }\n throw new ExperimentInitError(\n `Failed to initialize evaluation: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Run evaluation over a dataset with a callback\n *\n * @param dataset - Array of items to evaluate\n * @param callback - Function called for each item with { item, index, span }\n * @param options - Concurrency options\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index, span }) => {\n * const response = await myAgent(item.question);\n * evaluation.log('accuracy', { index, score: 0.95 });\n * }, { concurrency: 4 });\n * ```\n */\n async run<T>(\n dataset: T[],\n callback: RunCallback<T>,\n options?: RunOptions\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const concurrency = options?.concurrency ?? this.concurrency;\n this.total = dataset.length;\n this.progress = 0;\n\n const tracer = trace.getTracer(\"langwatch\");\n\n // Process items with concurrency control\n const executing = new Set<Promise<void>>();\n\n for (let index = 0; index < dataset.length; index++) {\n const item = dataset[index] as T;\n\n const itemPromise = this.executeItem(tracer, item, index, callback);\n\n executing.add(itemPromise);\n void itemPromise.finally(() => executing.delete(itemPromise));\n\n // Wait if we've hit concurrency limit\n if (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n }\n\n // Wait for all remaining items\n await Promise.all(executing);\n\n // Flush OTEL spans so all child spans created inside callbacks are exported\n const provider = trace.getTracerProvider();\n const delegate = \"getDelegate\" in provider && typeof provider.getDelegate === \"function\"\n ? provider.getDelegate()\n : provider;\n if (delegate && \"forceFlush\" in delegate && typeof delegate.forceFlush === \"function\") {\n await delegate.forceFlush();\n }\n\n // Send final batch with finished timestamp\n await this.flush(true);\n }\n\n /**\n * Execute a single item in the dataset\n */\n private async executeItem<T>(\n tracer: ReturnType<typeof trace.getTracer>,\n item: T,\n index: number,\n callback: RunCallback<T>\n ): Promise<void> {\n const startTime = Date.now();\n let error: Error | undefined;\n let capturedTraceId: string | null = null;\n\n // Reset withTarget tracking for this iteration\n this.iterationUsedWithTarget.set(index, false);\n\n // Set up iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext: IterationContext = { index, item };\n\n // If evaluation uses targets, skip creating iteration-level traces\n // Each withTarget() call will create its own independent trace\n if (this.evaluationUsesTargets) {\n await iterationContextStorage.run(iterationContext, async () => {\n this.currentIndex = index;\n\n try {\n // Create a minimal span context for the callback\n const span = {\n setStatus: () => { /* no-op */ },\n recordException: () => { /* no-op */ },\n end: () => { /* no-op */ },\n } as unknown as LangWatchSpan;\n\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n this.currentIndex = null;\n }\n });\n } else {\n await iterationContextStorage.run(iterationContext, async () => {\n await tracer.startActiveSpan(\n \"evaluation.iteration\",\n {\n attributes: {\n \"langwatch.origin\": \"evaluation\",\n \"evaluation.run_id\": this.runId,\n \"evaluation.index\": index,\n },\n },\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const traceId = spanContext.traceId;\n\n // Set current context for log/evaluate calls\n this.currentTraceId = traceId;\n this.currentIndex = index;\n capturedTraceId = traceId;\n\n try {\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n span.end();\n this.currentTraceId = null;\n this.currentIndex = null;\n }\n }\n );\n });\n }\n\n // Only add a dataset entry if withTarget() was NOT used\n // When withTarget() is used, it creates its own dataset entries per target\n if (!this.iterationUsedWithTarget.get(index)) {\n const duration = Date.now() - startTime;\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(item),\n duration,\n error: error?.message ?? null,\n trace_id: capturedTraceId ?? this.getTraceIdFromContext(),\n };\n\n this.batch.dataset.push(entry);\n this.cumulativeEntries.push({\n duration: entry.duration,\n error: entry.error,\n cost: entry.cost,\n target_id: entry.target_id,\n });\n }\n\n // Clean up\n this.iterationUsedWithTarget.delete(index);\n\n this.progress++;\n\n // Debounced send\n this.scheduleSend();\n }\n\n /**\n * Log a custom metric result\n *\n * @param metric - Name of the metric\n * @param options - Metric options including index, score, passed, etc.\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Explicit target (outside withTarget)\n * evaluation.log('accuracy', { index, score: 0.95, target: 'gpt-4' });\n *\n * // Implicit target (inside withTarget)\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * evaluation.log('accuracy', { score: 0.95 }); // target and index auto-inferred\n * });\n * ```\n */\n log(metric: string, options: LogOptions): void {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data = {},\n score,\n passed,\n label,\n details,\n status = options.error ? \"error\" : \"processed\",\n duration,\n cost,\n error,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n // Register target if provided (explicit or from context)\n let targetId: string | undefined;\n if (target) {\n targetId = this.registerTarget(target, metadata);\n }\n\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n\n const result: EvaluationResult = {\n name: metric,\n evaluator: metric,\n trace_id: traceId,\n status,\n data,\n score: score ?? null,\n passed: passed ?? null,\n details: details ?? (error ? error.message : null),\n index,\n label: label ?? null,\n cost: cost ?? null,\n duration: duration ?? null,\n error_type: error ? error.name : null,\n traceback: error ? [error.stack ?? error.message] : null,\n target_id: targetId ?? null,\n };\n\n this.batch.evaluations.push(result);\n this.cumulativeEvaluations.push({\n name: result.name,\n evaluator: result.evaluator,\n status: result.status,\n passed: result.passed,\n score: result.score,\n cost: result.cost,\n target_id: result.target_id,\n });\n this.scheduleSend();\n }\n\n /**\n * Run a built-in evaluator\n *\n * @param evaluatorSlug - The evaluator identifier (e.g., 'ragas/faithfulness')\n * @param options - Evaluator options including data and settings\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Inside withTarget() - target and index auto-inferred\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * await evaluation.evaluate('ragas/faithfulness', {\n * data: { input, output, contexts },\n * });\n * });\n *\n * // Or explicit index/target\n * await evaluation.evaluate('ragas/faithfulness', {\n * index,\n * data: { input, output, contexts },\n * target: 'gpt-4',\n * });\n * ```\n */\n async evaluate(evaluatorSlug: string, options: EvaluateOptions): Promise<void> {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data,\n settings,\n name,\n asGuardrail = false,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n const startTime = Date.now();\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n const spanId = targetContext?.spanId ?? this.getSpanIdFromContext();\n\n try {\n const response = await fetch(\n `${this.endpoint}/api/evaluations/${evaluatorSlug}/evaluate`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildAuthHeaders({ apiKey: this.apiKey }),\n },\n body: JSON.stringify({\n trace_id: traceId ?? null,\n span_id: spanId ?? null,\n name: name ?? evaluatorSlug,\n data,\n settings,\n as_guardrail: asGuardrail,\n }),\n }\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new EvaluatorError(evaluatorSlug, text);\n }\n\n const result = (await response.json()) as RunEvaluatorResponse;\n const duration = Date.now() - startTime;\n\n // Log the result\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: result.status,\n score: result.score ?? undefined,\n passed: result.passed ?? undefined,\n details: result.details ?? undefined,\n label: result.label ?? undefined,\n duration,\n cost: result.cost?.amount,\n target,\n metadata,\n });\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (error instanceof EvaluatorError) {\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: error,\n target,\n metadata,\n });\n throw error;\n }\n\n const wrappedError = new EvaluatorError(\n evaluatorSlug,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n );\n\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: wrappedError,\n target,\n metadata,\n });\n\n throw wrappedError;\n }\n }\n\n /**\n * Execute code within a target context with automatic tracing\n *\n * Creates a new span for this target execution and sets up context\n * so that log() calls inside the callback automatically use this target.\n * Duration and output are captured automatically.\n *\n * This creates a dataset entry per target (like Evaluations V3), enabling\n * proper per-target latency and cost tracking.\n *\n * @param targetName - Unique identifier for the target\n * @param metadata - Optional metadata for comparison (e.g., { model: 'gpt-4' })\n * @param callback - Function to execute within the target context\n * @returns The callback result along with captured metrics\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index }) => {\n * // Compare GPT-4 and Claude on the same input\n * const [gpt4Result, claudeResult] = await Promise.all([\n * evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * const response = await openai.chat(item.question);\n * evaluation.log('quality', { score: 0.95 }); // target auto-inferred\n * return response;\n * }),\n * evaluation.withTarget('claude-3', { model: 'anthropic/claude-3' }, async () => {\n * const response = await anthropic.messages(item.question);\n * evaluation.log('quality', { score: 0.85 }); // target auto-inferred\n * return response;\n * }),\n * ]);\n * });\n * ```\n */\n async withTarget<R>(\n targetName: string,\n metadata: TargetMetadata | null,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n metadataOrCallback: TargetMetadata | null | TargetCallback<R>,\n maybeCallback?: TargetCallback<R>\n ): Promise<TargetResult<R>> {\n // Handle overloads\n const metadata =\n typeof metadataOrCallback === \"function\" ? null : metadataOrCallback;\n const callback =\n typeof metadataOrCallback === \"function\" ? metadataOrCallback : maybeCallback!;\n\n // On FIRST withTarget() call ever in this evaluation:\n // - Set flag to skip creating iteration-level traces going forward\n if (!this.evaluationUsesTargets) {\n this.evaluationUsesTargets = true;\n }\n\n // Get iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext = iterationContextStorage.getStore();\n const index = iterationContext?.index ?? this.currentIndex ?? 0;\n const currentItem = iterationContext?.item;\n\n // Mark that withTarget() was used - prevents executeItem from creating a dataset entry\n this.iterationUsedWithTarget.set(index, true);\n\n // Register target\n this.registerTarget(targetName, metadata ?? undefined);\n\n const tracer = trace.getTracer(\"langwatch\");\n const startTime = Date.now();\n let result: R | undefined;\n let traceId = \"\";\n let spanId = \"\";\n let callbackError: Error | undefined;\n\n // Create an INDEPENDENT root span using ROOT_CONTEXT\n // This ensures each target gets a unique trace_id, not shared with iteration\n await tracer.startActiveSpan(\n `evaluation.target.${targetName}`,\n {\n attributes: {\n \"langwatch.origin\": \"evaluation\",\n \"evaluation.run_id\": this.runId,\n \"evaluation.target\": targetName,\n \"evaluation.index\": index,\n },\n },\n ROOT_CONTEXT,\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const rawTraceId = spanContext.traceId;\n spanId = spanContext.spanId;\n\n // Check if this is a no-op trace (all zeros = no tracer configured)\n const isNoOpTrace = rawTraceId === \"00000000000000000000000000000000\";\n traceId = isNoOpTrace ? \"\" : rawTraceId;\n\n // Set up the target execution context\n const executionContext: TargetExecutionContext = {\n targetId: targetName,\n traceId,\n spanId,\n index,\n };\n\n try {\n // Run callback within AsyncLocalStorage context\n result = await targetContextStorage.run(executionContext, async () => {\n const ctx: TargetContext = { span, traceId, spanId };\n const callbackResult = callback(ctx);\n\n if (callbackResult && typeof (callbackResult as Promise<R>).then === \"function\") {\n return await callbackResult;\n }\n return callbackResult as R;\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n callbackError = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: callbackError.message,\n });\n span.recordException(callbackError);\n throw err;\n } finally {\n span.end();\n }\n }\n );\n\n const duration = Date.now() - startTime;\n\n // Serialize the result as \"predicted\" output (similar to Evaluations V3)\n let predicted: Record<string, unknown> | null = null;\n if (result !== undefined && result !== null) {\n predicted = typeof result === \"object\"\n ? (result as Record<string, unknown>)\n : { output: result };\n }\n\n // Create a dataset entry for this target execution (like Evaluations V3)\n // This captures per-target duration/latency properly\n // Use currentItem from iteration context (thread-safe), NOT shared instance variable\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(currentItem),\n duration,\n error: callbackError?.message ?? null,\n trace_id: traceId || null, // null if no tracer configured (no-op)\n target_id: targetName,\n predicted,\n };\n\n this.batch.dataset.push(entry);\n this.cumulativeEntries.push({\n duration: entry.duration,\n error: entry.error,\n cost: entry.cost,\n target_id: entry.target_id,\n });\n this.scheduleSend();\n\n return {\n result: result!,\n duration,\n traceId,\n spanId,\n };\n }\n\n /**\n * Register a target for multi-target comparison\n */\n private registerTarget(name: string, metadata?: TargetMetadata): string {\n const existing = this.targets.get(name);\n\n if (existing) {\n // Check for metadata conflict\n if (metadata) {\n const existingMeta = existing.metadata ?? {};\n if (JSON.stringify(existingMeta) !== JSON.stringify(metadata)) {\n throw new TargetMetadataConflictError(name, existingMeta, metadata);\n }\n }\n return name;\n }\n\n // Register new target\n const targetInfo: TargetInfo = {\n id: name,\n name,\n type: \"custom\",\n metadata: metadata ?? null,\n };\n\n this.targets.set(name, targetInfo);\n this.batch.targets.push(targetInfo);\n\n return name;\n }\n\n /**\n * Schedule a debounced send\n */\n private scheduleSend(): void {\n const now = Date.now();\n\n if (now - this.lastSentMs >= DEBOUNCE_INTERVAL_MS) {\n this.sendBatch();\n } else {\n this.flushTimeout ??= setTimeout(() => {\n this.flushTimeout = null;\n this.sendBatch();\n }, DEBOUNCE_INTERVAL_MS - (now - this.lastSentMs));\n }\n }\n\n /**\n * Print a CI-friendly summary and optionally exit with code 1 on failure.\n *\n * Mirrors `ExperimentRunResult.printSummary` for parity — SDK-driven experiments\n * can now fail CI builds the same way platform experiments do.\n *\n * @param exitOnFailure - If true (default), calls `process.exit(1)` when any evaluation failed.\n *\n * @example\n * ```typescript\n * const experiment = await langwatch.experiments.init(\"ci-quality-check\");\n * await experiment.run(dataset, async ({ item, index }) => {\n * const response = await myLLM(item.input);\n * await experiment.evaluate(\"ragas/faithfulness\", { index, data: { input: item.input, output: response } });\n * });\n * experiment.printSummary();\n * ```\n */\n printSummary(exitOnFailure = true): void {\n const evaluators = new Map<\n string,\n { passed: number; failed: number; scoreSum: number; scoreCount: number }\n >();\n let totalPassed = 0;\n let totalFailed = 0;\n let totalCost = 0;\n\n for (const e of this.cumulativeEvaluations) {\n const name = e.name ?? e.evaluator ?? \"unknown\";\n if (!evaluators.has(name)) {\n evaluators.set(name, { passed: 0, failed: 0, scoreSum: 0, scoreCount: 0 });\n }\n const stats = evaluators.get(name)!;\n // Evaluators that crashed come back as status:\"error\" with passed often null;\n // treat them as failures so CI doesn't silently succeed on evaluator crashes.\n if (e.status === \"error\" || e.passed === false) {\n stats.failed += 1;\n totalFailed += 1;\n } else if (e.passed === true) {\n stats.passed += 1;\n totalPassed += 1;\n }\n if (typeof e.score === \"number\") {\n stats.scoreSum += e.score;\n stats.scoreCount += 1;\n }\n if (typeof e.cost === \"number\") {\n totalCost += e.cost;\n }\n }\n\n const targets = new Map<\n string,\n { passed: number; failed: number; latencySum: number; latencyCount: number; cost: number }\n >();\n for (const entry of this.cumulativeEntries) {\n const tid = entry.target_id;\n if (!tid) continue;\n if (!targets.has(tid)) {\n targets.set(tid, { passed: 0, failed: 0, latencySum: 0, latencyCount: 0, cost: 0 });\n }\n const stats = targets.get(tid)!;\n if (typeof entry.duration === \"number\") {\n stats.latencySum += entry.duration;\n stats.latencyCount += 1;\n }\n if (typeof entry.cost === \"number\") {\n stats.cost += entry.cost;\n }\n }\n // Lazily seed target stats from evaluations too — a user can log an\n // evaluation with an explicit target_id without ever going through\n // withTarget(), in which case the per-target entry row may not carry\n // target_id. Without this, such a target would be silently dropped from\n // the per-target summary.\n for (const e of this.cumulativeEvaluations) {\n const tid = e.target_id;\n if (!tid) continue;\n if (!targets.has(tid)) {\n targets.set(tid, { passed: 0, failed: 0, latencySum: 0, latencyCount: 0, cost: 0 });\n }\n const stats = targets.get(tid)!;\n if (e.status === \"error\" || e.passed === false) stats.failed += 1;\n else if (e.passed === true) stats.passed += 1;\n if (typeof e.cost === \"number\") stats.cost += e.cost;\n }\n\n const total = totalPassed + totalFailed;\n const passRate = total > 0 ? (totalPassed / total) * 100 : 0;\n\n // Wall-clock duration from init — summing entry durations over-counts\n // under concurrent withTarget() calls (each target produces its own entry).\n const duration = Math.max(0, Date.now() - this.createdAtMs);\n\n // Count entries whose target/loop execution errored out — distinct from\n // evaluator failures but must also trigger CI exit.\n let failedCells = 0;\n for (const entry of this.cumulativeEntries) {\n if (typeof entry.cost === \"number\") totalCost += entry.cost;\n if (entry.error) failedCells += 1;\n }\n\n const hasFailures = totalFailed > 0 || failedCells > 0;\n\n printSummary({\n runId: this.runId,\n status: hasFailures ? \"failed\" : \"completed\",\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl: this.runUrl,\n summary: {\n runId: this.runId,\n totalCells: this.cumulativeEntries.length || total,\n completedCells: Math.max(0, (this.cumulativeEntries.length || total) - failedCells),\n failedCells,\n duration,\n runUrl: this.runUrl,\n totalPassed,\n totalFailed,\n passRate,\n totalCost,\n targets: Array.from(targets.entries()).map(([targetId, s]) => ({\n targetId,\n name: targetId,\n passed: s.passed,\n failed: s.failed,\n avgLatency: s.latencyCount > 0 ? s.latencySum / s.latencyCount : 0,\n totalCost: s.cost,\n })),\n evaluators: Array.from(evaluators.entries()).map(([name, s]) => ({\n evaluatorId: name,\n name,\n passed: s.passed,\n failed: s.failed,\n passRate: s.passed + s.failed > 0 ? (s.passed / (s.passed + s.failed)) * 100 : 0,\n avgScore: s.scoreCount > 0 ? s.scoreSum / s.scoreCount : undefined,\n })),\n },\n });\n\n if (exitOnFailure && hasFailures) {\n process.exit(1);\n }\n }\n\n /**\n * Send current batch to the API\n */\n private sendBatch(finished = false): void {\n if (\n this.batch.dataset.length === 0 &&\n this.batch.evaluations.length === 0 &&\n this.batch.targets.length === 0 &&\n !finished\n ) {\n return;\n }\n\n const body: LogResultsRequest = {\n experiment_slug: this.experimentSlug,\n name: this.name,\n run_id: this.runId,\n dataset: this.batch.dataset.map((entry) => ({\n index: entry.index,\n entry: entry.entry,\n duration: entry.duration,\n error: entry.error,\n trace_id: entry.trace_id,\n target_id: entry.target_id ?? null,\n cost: entry.cost ?? null,\n // Only include predicted if it's defined (omit entirely when null/undefined)\n ...(entry.predicted !== undefined && entry.predicted !== null\n ? { predicted: entry.predicted }\n : {}),\n })),\n evaluations: this.batch.evaluations.map((e) => ({\n name: e.name,\n evaluator: e.evaluator,\n trace_id: e.trace_id,\n status: e.status,\n inputs: e.data,\n score: e.score,\n passed: e.passed,\n details: e.details,\n index: e.index,\n label: e.label,\n cost: e.cost,\n duration: e.duration,\n target_id: e.target_id,\n })),\n targets: this.batch.targets,\n progress: this.progress,\n total: this.total,\n timestamps: {\n created_at: this.createdAtMs,\n finished_at: finished ? Date.now() : null,\n },\n };\n\n // Fire and forget (with error logging)\n this.pendingFlush = fetch(`${this.endpoint}/api/evaluations/batch/log_results`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildAuthHeaders({ apiKey: this.apiKey }),\n },\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (!response.ok) {\n this.logger.error(`Failed to send batch: ${response.status}`);\n }\n })\n .catch((error) => {\n this.logger.error(\"Failed to send batch:\", error);\n });\n\n // Clear batch\n this.batch = { dataset: [], evaluations: [], targets: [] };\n this.lastSentMs = Date.now();\n }\n\n /**\n * Flush all pending data\n */\n private async flush(finished = false): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n this.sendBatch(finished);\n\n if (this.pendingFlush) {\n await this.pendingFlush;\n }\n }\n\n /**\n * Serialize a dataset item for the API\n */\n private serializeItem(item: unknown): unknown {\n if (item === null || item === undefined) {\n return item;\n }\n\n if (typeof item === \"object\") {\n // Handle objects with toJSON method\n if (\"toJSON\" in item && typeof (item as { toJSON: unknown }).toJSON === \"function\") {\n return (item as { toJSON: () => unknown }).toJSON();\n }\n // Return as-is, JSON.stringify will handle it\n return item;\n }\n\n return item;\n }\n\n /**\n * Get trace ID from current OpenTelemetry context\n */\n private getTraceIdFromContext(): string {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().traceId;\n }\n return \"\";\n }\n\n /**\n * Get span ID from current OpenTelemetry context\n */\n private getSpanIdFromContext(): string | null {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().spanId;\n }\n return null;\n }\n}\n","/**\n * Human-readable ID generator\n *\n * Generates memorable, human-readable identifiers using adjective-adjective-noun combinations.\n * Similar to Docker container names, Heroku app names, etc.\n */\n\nconst ADJECTIVES = [\n \"swift\", \"bright\", \"calm\", \"eager\", \"bold\", \"keen\", \"warm\", \"cool\", \"wise\", \"fair\",\n \"glad\", \"kind\", \"neat\", \"pure\", \"safe\", \"true\", \"vast\", \"wild\", \"zesty\", \"agile\",\n \"brave\", \"crisp\", \"dense\", \"epic\", \"fresh\", \"grand\", \"happy\", \"ideal\", \"jolly\", \"lively\",\n \"merry\", \"noble\", \"proud\", \"quick\", \"rapid\", \"sharp\", \"smart\", \"solid\", \"sunny\", \"vivid\",\n \"gentle\", \"silent\", \"cosmic\", \"golden\", \"silver\", \"ancient\", \"modern\", \"mighty\", \"humble\",\n];\n\nconst NOUNS = [\n \"fox\", \"owl\", \"bee\", \"elk\", \"hawk\", \"lynx\", \"wolf\", \"bear\", \"deer\", \"dove\",\n \"eagle\", \"finch\", \"heron\", \"koala\", \"lemur\", \"moose\", \"otter\", \"panda\", \"raven\", \"robin\",\n \"seal\", \"swan\", \"tiger\", \"whale\", \"zebra\", \"atlas\", \"bloom\", \"cloud\", \"delta\", \"ember\",\n \"flame\", \"grove\", \"haven\", \"iris\", \"jade\", \"leaf\", \"moon\", \"nova\", \"ocean\", \"peak\",\n \"river\", \"spark\", \"storm\", \"tide\", \"wave\", \"comet\", \"prism\", \"coral\",\n];\n\n/**\n * Generate a human-readable ID with 3 words like \"swift-bright-fox\"\n * Uses adjective-adjective-noun pattern for ~125,000 combinations.\n */\nexport const generateHumanReadableId = (separator = \"-\"): string => {\n // Pick two different adjectives\n const adj1Index = Math.floor(Math.random() * ADJECTIVES.length);\n let adj2Index = Math.floor(Math.random() * ADJECTIVES.length);\n if (adj2Index === adj1Index) {\n adj2Index = (adj2Index + 1) % ADJECTIVES.length;\n }\n\n const adjective1 = ADJECTIVES[adj1Index]!;\n const adjective2 = ADJECTIVES[adj2Index]!;\n const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]!;\n\n return `${adjective1}${separator}${adjective2}${separator}${noun}`;\n};\n","/**\n * Errors for the Experiments API\n */\n\n/**\n * Base error for experiment-related issues\n */\nexport class ExperimentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExperimentError\";\n }\n}\n\n/**\n * Thrown when initialization fails\n */\nexport class ExperimentInitError extends ExperimentError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"ExperimentInitError\";\n }\n}\n\n/**\n * Thrown when API calls fail\n */\nexport class ExperimentApiError extends ExperimentError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"ExperimentApiError\";\n }\n}\n\n/**\n * Thrown when target metadata conflicts\n */\nexport class TargetMetadataConflictError extends ExperimentError {\n constructor(\n public readonly targetName: string,\n public readonly existingMetadata: Record<string, unknown>,\n public readonly newMetadata: Record<string, unknown>\n ) {\n super(\n `Target '${targetName}' was previously registered with different metadata.\\n` +\n `Original: ${JSON.stringify(existingMetadata)}\\n` +\n `New: ${JSON.stringify(newMetadata)}\\n` +\n `If you want to use different metadata, please use a different target name.`\n );\n this.name = \"TargetMetadataConflictError\";\n }\n}\n\n/**\n * Thrown when an evaluator call fails\n */\nexport class EvaluatorError extends ExperimentError {\n constructor(\n public readonly evaluatorSlug: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(`Evaluator '${evaluatorSlug}' failed: ${message}`);\n this.name = \"EvaluatorError\";\n }\n}\n","import type { ExperimentRunResult } from \"./platformTypes\";\n\n/**\n * Print a CI-friendly summary of experiment results to stdout.\n *\n * Shared between platform runs (`langwatch.experiments.run`) and SDK-driven\n * experiments (`langwatch.experiments.init` → `experiment.printSummary()`).\n */\nexport function printSummary(result: Omit<ExperimentRunResult, \"printSummary\" | \"toString\">): void {\n const { runId, status, passed, failed, passRate, duration, runUrl, summary } = result;\n\n console.log(\"\\n\" + \"═\".repeat(60));\n console.log(\" EXPERIMENT RESULTS\");\n console.log(\"═\".repeat(60));\n console.log(` Run ID: ${runId}`);\n console.log(` Status: ${status.toUpperCase()}`);\n console.log(` Duration: ${(duration / 1000).toFixed(1)}s`);\n console.log(\"─\".repeat(60));\n console.log(` Passed: ${passed}`);\n console.log(` Failed: ${failed}`);\n console.log(` Pass Rate: ${passRate.toFixed(1)}%`);\n if (summary.totalCost) {\n console.log(` Total Cost: $${summary.totalCost.toFixed(4)}`);\n }\n\n if (summary.targets && summary.targets.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" TARGETS:\");\n for (const target of summary.targets) {\n console.log(` ${target.name}: ${target.passed} passed, ${target.failed} failed`);\n if (target.avgLatency) {\n console.log(` Avg latency: ${target.avgLatency.toFixed(0)}ms`);\n }\n if (target.totalCost) {\n console.log(` Total cost: $${target.totalCost.toFixed(4)}`);\n }\n }\n }\n\n if (summary.evaluators && summary.evaluators.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" EVALUATORS:\");\n for (const evaluator of summary.evaluators) {\n console.log(` ${evaluator.name}: ${evaluator.passRate.toFixed(1)}% pass rate`);\n if (evaluator.avgScore !== undefined) {\n console.log(` Avg score: ${evaluator.avgScore.toFixed(2)}`);\n }\n }\n }\n\n console.log(\"─\".repeat(60));\n console.log(` View details: ${runUrl}`);\n console.log(\"═\".repeat(60) + \"\\n\");\n}\n","/**\n * Error classes for platform experiments API (Experiments Workbench)\n */\n\n/**\n * Base error for experiment operations\n */\nexport class ExperimentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExperimentsError\";\n }\n}\n\n/**\n * Error when experiment is not found\n */\nexport class ExperimentNotFoundError extends ExperimentsError {\n constructor(slug: string) {\n super(`Experiment not found: ${slug}`);\n this.name = \"ExperimentNotFoundError\";\n }\n}\n\n/**\n * Error when experiment run times out\n */\nexport class ExperimentTimeoutError extends ExperimentsError {\n readonly runId: string;\n readonly progress: number;\n readonly total: number;\n\n constructor(runId: string, progress: number, total: number) {\n super(`Experiment run timed out: ${runId} (${progress}/${total} completed)`);\n this.name = \"ExperimentTimeoutError\";\n this.runId = runId;\n this.progress = progress;\n this.total = total;\n }\n}\n\n/**\n * Error when experiment run fails\n */\nexport class ExperimentRunFailedError extends ExperimentsError {\n readonly runId: string;\n readonly errorMessage: string;\n\n constructor(runId: string, errorMessage: string) {\n super(`Experiment run failed: ${errorMessage}`);\n this.name = \"ExperimentRunFailedError\";\n this.runId = runId;\n this.errorMessage = errorMessage;\n }\n}\n\n/**\n * Error from the experiments API\n */\nexport class ExperimentsApiError extends ExperimentsError {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"ExperimentsApiError\";\n this.statusCode = statusCode;\n }\n}\n","/**\n * ExperimentsFacade - Entry point for the experiments API\n *\n * Provides:\n * - `init()` method to create experiment sessions (SDK-defined experiments)\n * - `run()` method to execute platform-configured experiments (Experiments Workbench)\n */\n\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { Experiment } from \"./experiment\";\nimport type { ExperimentInitOptions } from \"./types\";\nimport type {\n ExperimentRunResult,\n RunExperimentOptions,\n ExperimentRunSummary,\n} from \"./platformTypes\";\nimport {\n ExperimentsApiError,\n ExperimentNotFoundError,\n ExperimentTimeoutError,\n ExperimentRunFailedError,\n} from \"./platformErrors\";\nimport { printSummary } from \"./printSummary\";\n\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_TIMEOUT = 600000; // 10 minutes\n\ntype ExperimentsFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n};\n\n/**\n * Facade for creating experiment sessions and running platform-configured experiments\n */\nexport class ExperimentsFacade {\n private readonly config: ExperimentsFacadeConfig;\n\n constructor(config: ExperimentsFacadeConfig) {\n this.config = config;\n }\n\n /**\n * Initialize a new experiment session (SDK-defined)\n *\n * @param name - Name of the experiment (used as slug)\n * @param options - Optional configuration\n * @returns An initialized Experiment instance\n *\n * @example\n * ```typescript\n * const experiment = await langwatch.experiments.init('my-experiment');\n *\n * await experiment.run(dataset, async ({ item, index }) => {\n * const response = await myAgent(item.question);\n * experiment.log('accuracy', { index, score: 0.95 });\n * });\n * ```\n */\n async init(name: string, options?: ExperimentInitOptions): Promise<Experiment> {\n return Experiment.init(name, {\n apiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n ...options,\n });\n }\n\n /**\n * Run a platform-configured experiment (Experiments Workbench)\n *\n * This runs an experiment that was configured in the LangWatch platform.\n * The method automatically prints a summary and exits with code 1 on failure\n * (unless `exitOnFailure: false` is passed).\n *\n * @param slug - The slug of the experiment (found in the experiment URL)\n * @param options - Optional configuration\n * @returns The experiment results including pass rate and summary\n *\n * @example\n * ```typescript\n * import { LangWatch } from \"langwatch\";\n *\n * const langwatch = new LangWatch();\n *\n * const result = await langwatch.experiments.run(\"my-experiment-slug\");\n * result.printSummary();\n * ```\n */\n async run(slug: string, options?: RunExperimentOptions): Promise<ExperimentRunResult> {\n this.config.logger.info(`Running platform experiment: ${slug}`);\n const result = await this.runWithPolling(slug, options);\n return result;\n }\n\n /**\n * Run an experiment and wait for completion using polling\n */\n private async runWithPolling(\n slug: string,\n options: RunExperimentOptions = {}\n ): Promise<ExperimentRunResult> {\n const pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n // Start the run\n const startResponse = await this.startRun(slug);\n const { runId } = startResponse;\n\n // Use the run URL from API but replace domain with configured endpoint\n const apiRunUrl = startResponse.runUrl ?? \"\";\n const runUrl = apiRunUrl ? this.replaceUrlDomain(apiRunUrl, this.config.endpoint) : \"\";\n\n console.log(`Started experiment run: ${runId}`);\n if (runUrl) {\n console.log(`Follow live: ${runUrl}`);\n }\n\n const total = startResponse.total;\n let lastProgress = 0;\n\n // Print initial progress\n if (total > 0) {\n process.stdout.write(`Progress: 0/${total} (0%)`);\n }\n options.onProgress?.(0, total);\n\n const startTime = Date.now();\n\n // Poll until complete\n while (true) {\n if (Date.now() - startTime > timeout) {\n console.log(); // Newline after progress\n const finalStatus = await this.getRunStatus(runId);\n throw new ExperimentTimeoutError(runId, finalStatus.progress, finalStatus.total);\n }\n\n await this.sleep(pollInterval);\n\n const status = await this.getRunStatus(runId);\n const progress = status.progress;\n\n // Update progress display if changed\n if (progress !== lastProgress && status.total > 0) {\n const percentage = Math.round((progress / status.total) * 100);\n process.stdout.write(`\\rProgress: ${progress}/${status.total} (${percentage}%)`);\n lastProgress = progress;\n }\n\n options.onProgress?.(status.progress, status.total);\n\n if (status.status === \"completed\") {\n console.log(); // Newline after progress\n const summary = status.summary!;\n return this.buildResult(runId, \"completed\", summary, runUrl ?? \"\");\n }\n\n if (status.status === \"failed\") {\n console.log(); // Newline after progress\n throw new ExperimentRunFailedError(runId, status.error ?? \"Unknown error\");\n }\n\n if (status.status === \"stopped\") {\n console.log(); // Newline after progress\n return this.buildResult(runId, \"stopped\", status.summary ?? {\n runId,\n totalCells: status.total,\n completedCells: status.progress,\n failedCells: 0,\n duration: Date.now() - startTime,\n }, runUrl ?? \"\");\n }\n }\n }\n\n /**\n * Start an experiment run\n */\n private async startRun(slug: string): Promise<{ runId: string; total: number; runUrl?: string }> {\n const response = await this.config.langwatchApiClient.POST(\n \"/api/evaluations/v3/{slug}/run\",\n {\n params: {\n path: { slug },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new ExperimentNotFoundError(slug);\n }\n\n if (status === 401) {\n throw new ExperimentsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to start experiment: ${slug}`;\n throw new ExperimentsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as { runId: string; total: number; runUrl?: string };\n }\n\n /**\n * Get the status of a run\n */\n private async getRunStatus(runId: string): Promise<{\n status: string;\n progress: number;\n total: number;\n summary?: ExperimentRunSummary;\n error?: string;\n }> {\n const response = await this.config.langwatchApiClient.GET(\n \"/api/evaluations/v3/runs/{runId}\",\n {\n params: {\n path: { runId },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new ExperimentsApiError(`Run not found: ${runId}`, 404);\n }\n\n if (status === 401) {\n throw new ExperimentsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to get run status: ${runId}`;\n throw new ExperimentsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as {\n status: string;\n progress: number;\n total: number;\n summary?: ExperimentRunSummary;\n error?: string;\n };\n }\n\n /**\n * Build the result object from API response\n */\n private buildResult(\n runId: string,\n status: \"completed\" | \"failed\" | \"stopped\",\n summary: ExperimentRunSummary,\n runUrl: string\n ): ExperimentRunResult {\n const completedCells = summary.completedCells ?? 0;\n const failedCells = summary.failedCells ?? 0;\n const duration = summary.duration ?? 0;\n\n const totalPassed = summary.totalPassed ?? completedCells - failedCells;\n const totalFailed = summary.totalFailed ?? failedCells;\n const passRate = summary.passRate ??\n (completedCells > 0 ? (totalPassed / completedCells) * 100 : 0);\n\n const result: ExperimentRunResult = {\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl,\n summary,\n printSummary: (exitOnFailure = true) => {\n printSummary({\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl: summary.runUrl ?? runUrl,\n summary,\n });\n\n if (exitOnFailure && totalFailed > 0) {\n process.exit(1);\n }\n },\n toString: () =>\n `ExperimentRunResult { status: ${status.toUpperCase()}, passed: ${totalPassed}, failed: ${totalFailed}, passRate: ${passRate.toFixed(1)}%, duration: ${(duration / 1000).toFixed(1)}s }`,\n };\n\n // Custom Node.js inspect for console.log\n (result as Record<string | symbol, unknown>)[Symbol.for(\"nodejs.util.inspect.custom\")] =\n () => result.toString();\n\n return result;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Replace the domain of a URL with a new base URL, preserving the path\n */\n private replaceUrlDomain(url: string, newBase: string): string {\n if (!url) return url;\n\n try {\n const parsedUrl = new URL(url);\n const parsedNewBase = new URL(newBase);\n\n // Replace origin with new base, keep path/query/fragment\n return `${parsedNewBase.origin}${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`;\n } catch {\n // If URL parsing fails, return original\n return url;\n }\n }\n}\n","/**\n * EvaluationsFacade - Entry point for the Evaluations API (Online Evaluations / Guardrails)\n *\n * Provides an API for running evaluators and guardrails in real-time against LLM inputs/outputs.\n *\n * @example\n * ```typescript\n * const langwatch = new LangWatch({ apiKey: \"your-api-key\" });\n *\n * // Run a guardrail\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection\",\n * asGuardrail: true,\n * settings: {},\n * });\n *\n * if (!guardrail.passed) {\n * return \"I'm sorry, I can't do that.\";\n * }\n * ```\n */\n\nimport { trace, SpanStatusCode, context as otelContext } from \"@opentelemetry/api\";\nimport { createLangWatchSpan } from \"@/observability-sdk/span/implementation\";\nimport type {\n EvaluationResult,\n EvaluateOptions,\n EvaluateRequest,\n EvaluateResponse,\n} from \"./types\";\nimport {\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./errors\";\nimport type { Logger } from \"@/logger\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\n\ntype EvaluationsFacadeConfig = {\n endpoint: string;\n apiKey: string;\n logger: Logger;\n};\n\nexport class EvaluationsFacade {\n readonly #endpoint: string;\n readonly #apiKey: string;\n readonly #logger: Logger;\n\n constructor(config: EvaluationsFacadeConfig) {\n this.#endpoint = config.endpoint;\n this.#apiKey = config.apiKey;\n this.#logger = config.logger;\n }\n\n /**\n * Run an evaluator or guardrail against provided data\n *\n * Creates an OpenTelemetry span attached to the current trace context,\n * calls the LangWatch evaluation API, and returns the result.\n *\n * @param slug - The evaluator slug (e.g., \"presidio/pii_detection\", \"langevals/llm_boolean\")\n * @param options - Evaluation options including data, name, settings, and asGuardrail flag\n * @returns The evaluation result with status, passed, score, details, label, and cost\n *\n * @example\n * ```typescript\n * // Run as a guardrail (synchronous evaluation that can block responses)\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection Guardrail\",\n * asGuardrail: true,\n * });\n *\n * if (!guardrail.passed) {\n * console.log(\"PII detected:\", guardrail.details);\n * return \"Sorry, I cannot process that request.\";\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Run as an online evaluation (async scoring for monitoring)\n * const result = await langwatch.evaluations.evaluate(\"langevals/llm_boolean\", {\n * data: { input: question, output: response },\n * name: \"Quality Check\",\n * settings: { prompt: \"Check if the response answers the question.\" },\n * });\n *\n * console.log(\"Score:\", result.score);\n * console.log(\"Details:\", result.details);\n * ```\n */\n evaluate = async (\n slug: string,\n options: EvaluateOptions\n ): Promise<EvaluationResult> => {\n const { data, name, settings, asGuardrail } = options;\n const spanName = name ?? slug;\n const spanType = asGuardrail ? \"guardrail\" : \"evaluation\";\n\n // Get tracer and create a span attached to the current context\n const tracer = trace.getTracer(\"langwatch-evaluations\");\n\n // Get current trace/span IDs from active context\n const activeSpan = trace.getActiveSpan();\n const traceId = activeSpan\n ? activeSpan.spanContext().traceId\n : undefined;\n const parentSpanId = activeSpan\n ? activeSpan.spanContext().spanId\n : undefined;\n\n // Start the evaluation span\n const otelSpan = tracer.startSpan(\n spanName,\n {\n attributes: {\n \"langwatch.span.type\": spanType,\n },\n },\n otelContext.active()\n );\n\n const langwatchSpan = createLangWatchSpan(otelSpan);\n\n // Set span input\n langwatchSpan.setType(spanType);\n langwatchSpan.setInput({\n data,\n ...(settings && { settings }),\n });\n\n try {\n // Build request payload\n const requestBody: EvaluateRequest = {\n trace_id: traceId ?? null,\n span_id: parentSpanId ?? null,\n name: name ?? null,\n data,\n settings,\n as_guardrail: asGuardrail,\n };\n\n // Call the evaluation API\n const url = `${this.#endpoint}/api/evaluations/${slug}/evaluate`;\n\n this.#logger.debug(`Calling evaluation API: ${url}`);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildAuthHeaders({ apiKey: this.#apiKey }),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n if (response.status === 404) {\n throw new EvaluatorNotFoundError(slug);\n }\n\n throw new EvaluationsApiError(\n `Evaluation API returned ${response.status}: ${errorText}`,\n response.status\n );\n }\n\n const responseData = (await response.json()) as EvaluateResponse;\n\n // Map response to result\n const result: EvaluationResult = {\n status: responseData.status,\n ...(responseData.passed !== null && responseData.passed !== undefined && { passed: responseData.passed }),\n ...(responseData.score !== null && responseData.score !== undefined && { score: responseData.score }),\n ...(responseData.details !== null && responseData.details !== undefined && { details: responseData.details }),\n ...(responseData.label !== null && responseData.label !== undefined && { label: responseData.label }),\n ...(responseData.cost !== null && responseData.cost !== undefined && { cost: responseData.cost }),\n };\n\n // Update span with output\n langwatchSpan.setOutput({\n type: asGuardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: result,\n });\n\n // Set span status based on result\n if (result.status === \"error\") {\n otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: result.details ?? \"Evaluation failed\",\n });\n } else {\n otelSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return result;\n } catch (error) {\n // Handle errors\n const errorResult: EvaluationResult = {\n status: \"error\",\n details: error instanceof Error ? error.message : String(error),\n };\n\n // For guardrails, default to passed=true on error to avoid blocking\n if (asGuardrail) {\n errorResult.passed = true;\n }\n\n // Update span with error\n langwatchSpan.setOutput({\n type: asGuardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: errorResult,\n });\n\n otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorResult.details,\n });\n\n if (error instanceof Error) {\n otelSpan.recordException(error);\n }\n\n // Re-throw known errors\n if (\n error instanceof EvaluatorNotFoundError ||\n error instanceof EvaluationsApiError ||\n error instanceof EvaluatorCallError\n ) {\n throw error;\n }\n\n // Wrap unknown errors\n throw new EvaluatorCallError(\n slug,\n error instanceof Error ? error.message : String(error)\n );\n } finally {\n // Always end the span\n otelSpan.end();\n }\n };\n}\n","/**\n * Error classes for the Evaluations API\n */\n\n/**\n * Base error for evaluation operations\n */\nexport class EvaluationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EvaluationError\";\n }\n}\n\n/**\n * Error when an evaluator call fails\n */\nexport class EvaluatorCallError extends EvaluationError {\n readonly evaluatorSlug: string;\n readonly statusCode?: number;\n\n constructor(evaluatorSlug: string, message: string, statusCode?: number) {\n super(`Evaluator '${evaluatorSlug}' failed: ${message}`);\n this.name = \"EvaluatorCallError\";\n this.evaluatorSlug = evaluatorSlug;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error when evaluator is not found\n */\nexport class EvaluatorNotFoundError extends EvaluationError {\n readonly evaluatorSlug: string;\n\n constructor(evaluatorSlug: string) {\n super(`Evaluator not found: ${evaluatorSlug}`);\n this.name = \"EvaluatorNotFoundError\";\n this.evaluatorSlug = evaluatorSlug;\n }\n}\n\n/**\n * Error from the evaluations API\n */\nexport class EvaluationsApiError extends EvaluationError {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"EvaluationsApiError\";\n this.statusCode = statusCode;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type TriggerResponse = NonNullable<\n paths[\"/api/triggers\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreateTriggerBody = NonNullable<\n paths[\"/api/triggers\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdateTriggerBody = NonNullable<\n paths[\"/api/triggers/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type TriggerDeleteResponse =\n paths[\"/api/triggers/{id}\"][\"delete\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class TriggersApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"TriggersApiError\";\n }\n}\n\nexport class TriggersApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new TriggersApiError(message, operation, error);\n }\n\n async getAll(): Promise<TriggerResponse[]> {\n const { data, error } = await this.apiClient.GET(\"/api/triggers\");\n if (error) this.handleApiError(\"list triggers\", error);\n return data;\n }\n\n async get(id: string): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/triggers/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`get trigger \"${id}\"`, error);\n return data;\n }\n\n async create(params: CreateTriggerBody): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.POST(\"/api/triggers\", {\n body: params,\n });\n if (error) this.handleApiError(\"create trigger\", error);\n return data;\n }\n\n async update(id: string, params: UpdateTriggerBody): Promise<TriggerResponse> {\n const { data, error } = await this.apiClient.PATCH(\"/api/triggers/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update trigger \"${id}\"`, error);\n return data;\n }\n\n async delete(id: string): Promise<TriggerDeleteResponse> {\n const { data, error } = await this.apiClient.DELETE(\"/api/triggers/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`delete trigger \"${id}\"`, error);\n return data;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type GraphResponse = NonNullable<\n paths[\"/api/graphs\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreateGraphBody = NonNullable<\n paths[\"/api/graphs\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdateGraphBody = NonNullable<\n paths[\"/api/graphs/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type GraphDeleteResponse =\n paths[\"/api/graphs/{id}\"][\"delete\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class GraphsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"GraphsApiError\";\n }\n}\n\nexport class GraphsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new GraphsApiError(message, operation, error);\n }\n\n async getAll(dashboardId?: string): Promise<GraphResponse[]> {\n const { data, error } = await this.apiClient.GET(\"/api/graphs\", {\n params: { query: { dashboardId } },\n });\n if (error) this.handleApiError(\"list graphs\", error);\n return data;\n }\n\n async get(id: string): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/graphs/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`get graph \"${id}\"`, error);\n return data;\n }\n\n async create(params: CreateGraphBody): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.POST(\"/api/graphs\", {\n body: params,\n });\n if (error) this.handleApiError(\"create graph\", error);\n return data;\n }\n\n async update(id: string, params: UpdateGraphBody): Promise<GraphResponse> {\n const { data, error } = await this.apiClient.PATCH(\"/api/graphs/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update graph \"${id}\"`, error);\n return data;\n }\n\n async delete(id: string): Promise<GraphDeleteResponse> {\n const { data, error } = await this.apiClient.DELETE(\"/api/graphs/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`delete graph \"${id}\"`, error);\n return data;\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport type { InternalConfig } from \"@/client-sdk/types\";\nimport {\n extractStatusFromResponse,\n formatApiErrorForOperation,\n} from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport type SimulationRunsListResponse =\n paths[\"/api/simulation-runs\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunResponse =\n paths[\"/api/simulation-runs/{scenarioRunId}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunsBatchesListResponse =\n paths[\"/api/simulation-runs/batches/list\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SimulationRunsListParams = NonNullable<\n paths[\"/api/simulation-runs\"][\"get\"][\"parameters\"][\"query\"]\n>;\n\nexport type SimulationRunsBatchesListParams =\n paths[\"/api/simulation-runs/batches/list\"][\"get\"][\"parameters\"][\"query\"];\n\nexport class SimulationRunsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"SimulationRunsApiError\";\n }\n}\n\nexport class SimulationRunsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n }\n\n private handleApiError(operation: string, error: unknown): never {\n const message = formatApiErrorForOperation({ operation: operation, error: error, options: {\n status: extractStatusFromResponse(error),\n } });\n throw new SimulationRunsApiError(message, operation, error);\n }\n\n async getAll(params?: SimulationRunsListParams): Promise<SimulationRunsListResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/simulation-runs\", {\n params: { query: params },\n });\n if (error) this.handleApiError(\"list simulation runs\", error);\n return data;\n }\n\n async get(scenarioRunId: string): Promise<SimulationRunResponse> {\n const { data, error } = await this.apiClient.GET(\n \"/api/simulation-runs/{scenarioRunId}\",\n {\n params: { path: { scenarioRunId } },\n },\n );\n if (error)\n this.handleApiError(`get simulation run \"${scenarioRunId}\"`, error);\n return data;\n }\n\n async listBatches(\n params: SimulationRunsBatchesListParams,\n ): Promise<SimulationRunsBatchesListResponse> {\n const { data, error } = await this.apiClient.GET(\n \"/api/simulation-runs/batches/list\",\n {\n params: { query: params },\n },\n );\n if (error) this.handleApiError(\"list simulation run batches\", error);\n return data;\n }\n}\n","import { DEFAULT_ENDPOINT } from \"@/internal/constants\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\nimport { formatApiErrorMessage } from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport interface MonitorResponse {\n id: string;\n name: string;\n slug: string;\n checkType: string;\n enabled: boolean;\n executionMode: string;\n sample: number;\n level: string;\n evaluatorId: string | null;\n preconditions: unknown[];\n parameters: Record<string, unknown>;\n mappings: Record<string, unknown>;\n threadIdleTimeout: number | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateMonitorBody {\n name: string;\n checkType: string;\n executionMode?: string;\n sample?: number;\n level?: string;\n preconditions?: unknown[];\n parameters?: Record<string, unknown>;\n mappings?: Record<string, unknown>;\n}\n\nexport interface UpdateMonitorBody {\n name?: string;\n enabled?: boolean;\n executionMode?: string;\n sample?: number;\n preconditions?: unknown[];\n parameters?: Record<string, unknown>;\n mappings?: Record<string, unknown>;\n}\n\nexport interface MonitorDeleteResponse {\n id: string;\n deleted: boolean;\n}\n\nexport class MonitorsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"MonitorsApiError\";\n }\n}\n\nexport class MonitorsApiService {\n private readonly apiKey: string;\n private readonly endpoint: string;\n\n constructor(config?: { apiKey?: string; endpoint?: string }) {\n this.apiKey = config?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n this.endpoint = config?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n }\n\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(`${this.endpoint}${path}`, {\n ...options,\n headers: {\n ...buildAuthHeaders({ apiKey: this.apiKey }),\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let parsed: unknown = errorText;\n try {\n parsed = JSON.parse(errorText);\n } catch {\n // leave as raw text\n }\n const message = formatApiErrorMessage({ error: parsed, options: { status: response.status } });\n throw new MonitorsApiError(\n `HTTP ${response.status}: ${message}`,\n options?.method ?? \"GET\",\n parsed,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAll(): Promise<MonitorResponse[]> {\n return this.request<MonitorResponse[]>(\"/api/monitors\");\n }\n\n async get(id: string): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}`);\n }\n\n async create(body: CreateMonitorBody): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(\"/api/monitors\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async update(id: string, body: UpdateMonitorBody): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}`, {\n method: \"PATCH\",\n body: JSON.stringify(body),\n });\n }\n\n async toggle(id: string, enabled: boolean): Promise<MonitorResponse> {\n return this.request<MonitorResponse>(`/api/monitors/${encodeURIComponent(id)}/toggle`, {\n method: \"POST\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n async delete(id: string): Promise<MonitorDeleteResponse> {\n return this.request<MonitorDeleteResponse>(`/api/monitors/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n }\n}\n","import { DEFAULT_ENDPOINT } from \"@/internal/constants\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\nimport { formatApiErrorMessage } from \"@/client-sdk/services/_shared/format-api-error\";\n\nexport interface SecretResponse {\n id: string;\n projectId: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SecretDeleteResponse {\n id: string;\n deleted: boolean;\n}\n\nexport class SecretsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"SecretsApiError\";\n }\n}\n\nexport class SecretsApiService {\n private readonly apiKey: string;\n private readonly endpoint: string;\n\n constructor(config?: { apiKey?: string; endpoint?: string }) {\n this.apiKey = config?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n this.endpoint = config?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n }\n\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(`${this.endpoint}${path}`, {\n ...options,\n headers: {\n ...buildAuthHeaders({ apiKey: this.apiKey }),\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let parsed: unknown = errorText;\n try {\n parsed = JSON.parse(errorText);\n } catch {\n // leave as raw text\n }\n const message = formatApiErrorMessage({ error: parsed, options: { status: response.status } });\n throw new SecretsApiError(\n `HTTP ${response.status}: ${message}`,\n options?.method ?? \"GET\",\n parsed,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAll(): Promise<SecretResponse[]> {\n return this.request<SecretResponse[]>(\"/api/secrets\");\n }\n\n async get(id: string): Promise<SecretResponse> {\n return this.request<SecretResponse>(`/api/secrets/${encodeURIComponent(id)}`);\n }\n\n async create(body: { name: string; value: string }): Promise<SecretResponse> {\n return this.request<SecretResponse>(\"/api/secrets\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async update(id: string, body: { value: string }): Promise<SecretResponse> {\n return this.request<SecretResponse>(`/api/secrets/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n });\n }\n\n async delete(id: string): Promise<SecretDeleteResponse> {\n return this.request<SecretDeleteResponse>(`/api/secrets/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\n\nexport interface GetTraceParams {\n includeSpans?: boolean;\n}\n\nexport type GetTraceResponse = NonNullable<\n paths[\"/api/trace/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Custom error class for Traces API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class TracesError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"TracesError\";\n }\n}\n","import { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\nimport { getLangWatchTracer } from \"@/observability-sdk/tracer\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.traces`, LANGWATCH_SDK_VERSION);\n","import { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type GetTraceParams, TracesError, type GetTraceResponse } from \"./types\";\nimport { tracer } from \"./tracing\";\n\n/**\n * Service for managing trace resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - Retrieving trace data\n * - Error handling with contextual information\n *\n * All methods return trace response objects directly.\n */\nexport class TracesService {\n private config: InternalConfig;\n\n constructor(config: InternalConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as TracesService,\n tracer,\n );\n }\n\n /**\n * Handles API errors by throwing a TracesError with operation context.\n * @param operation Description of the operation being performed.\n * @param error The error object returned from the API client.\n * @throws {TracesError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error ?? error?.message ?? \"Unknown error occurred\";\n throw new TracesError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Retrieves a trace by its ID.\n * @param traceId The trace's unique identifier.\n * @param params Optional parameters for the request.\n * @returns The trace response object.\n * @throws {TracesError} If the API call fails.\n */\n async get(\n traceId: string,\n params?: GetTraceParams,\n ): Promise<GetTraceResponse> {\n const { data, error } = await this.config.langwatchApiClient.GET(\"/api/trace/{id}\", {\n params: {\n path: {\n id: traceId,\n },\n },\n query: params,\n });\n\n if (error) {\n this.handleApiError(\"get trace\", error);\n }\n\n return data;\n }\n}\n","import { type InternalConfig } from \"../../types\";\nimport { TracesService } from \"./service\";\nimport { type GetTraceParams, type GetTraceResponse } from \"./types\";\n\nexport class TracesFacade {\n readonly #service: TracesService;\n\n constructor(config: InternalConfig) {\n this.#service = new TracesService(config);\n }\n\n async get(traceId: string, params?: GetTraceParams): Promise<GetTraceResponse> {\n return this.#service.get(traceId, params);\n }\n}\n","import { PromptsFacade, PromptsApiService } from \"./services/prompts\";\nexport { FetchPolicy, type GetPromptOptions } from \"./services/prompts\";\nexport type {\n Dataset,\n DatasetEntry,\n DatasetMetadata,\n DatasetColumnType,\n DatasetListItem,\n Pagination,\n PaginatedResponse,\n GetDatasetOptions,\n ListDatasetsOptions,\n ListDatasetsApiResponse,\n ListRecordsOptions,\n ListRecordsApiResponse,\n CreateDatasetOptions,\n UpdateDatasetOptions,\n CreateFromUploadResponse,\n BatchCreateRecordsResponse,\n DeleteRecordsResponse,\n UploadResponse,\n DatasetRecordResponse,\n} from \"./services/datasets\";\nexport { DatasetError, DatasetNotFoundError, DatasetApiError, DatasetValidationError, DatasetPlanLimitError } from \"./services/datasets\";\nexport type { ExperimentRunResult, RunExperimentOptions } from \"./services/experiments\";\nexport {\n ExperimentsError,\n ExperimentNotFoundError,\n ExperimentTimeoutError,\n ExperimentRunFailedError,\n ExperimentsApiError,\n} from \"./services/experiments\";\nexport type { EvaluationResult, EvaluateOptions, EvaluationStatus, EvaluationCost } from \"./services/evaluations\";\nexport {\n EvaluationError,\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./services/evaluations\";\nexport { EvaluatorsApiService, EvaluatorsApiError } from \"./services/evaluators\";\nexport { ScenariosApiService, ScenariosApiError } from \"./services/scenarios\";\nexport { SuitesApiService, SuitesApiError } from \"./services/suites\";\nexport { WorkflowsApiService, WorkflowsApiError } from \"./services/workflows/workflows-api.service\";\nexport { AgentsApiService, AgentsApiError } from \"./services/agents/agents-api.service\";\nexport { AnnotationsApiService, AnnotationsApiError } from \"./services/annotations/annotations-api.service\";\nexport { DashboardsApiService, DashboardsApiError } from \"./services/dashboards/dashboards-api.service\";\nexport { ModelProvidersApiService, ModelProvidersApiError } from \"./services/model-providers/model-providers-api.service\";\nexport { AnalyticsApiService, AnalyticsApiError } from \"./services/analytics/analytics-api.service\";\nexport { TriggersApiService, TriggersApiError } from \"./services/triggers\";\nexport { GraphsApiService, GraphsApiError } from \"./services/graphs\";\nexport { SimulationRunsApiService, SimulationRunsApiError } from \"./services/simulation-runs\";\nexport { TracesApiService, TracesApiError } from \"./services/traces/traces-api.service\";\nexport { MonitorsApiService, MonitorsApiError } from \"./services/monitors\";\nexport { SecretsApiService, SecretsApiError } from \"./services/secrets\";\nimport { LocalPromptsService } from \"./services/prompts/local-prompts.service\";\nimport { ExperimentsFacade } from \"./services/experiments\";\nimport { DatasetsFacade } from \"./services/datasets\";\nimport { EvaluationsFacade } from \"./services/evaluations\";\nimport { EvaluatorsApiService } from \"./services/evaluators\";\nimport { ScenariosApiService } from \"./services/scenarios\";\nimport { SuitesApiService } from \"./services/suites\";\nimport { WorkflowsApiService } from \"./services/workflows/workflows-api.service\";\nimport { AgentsApiService } from \"./services/agents/agents-api.service\";\nimport { AnnotationsApiService } from \"./services/annotations/annotations-api.service\";\nimport { DashboardsApiService } from \"./services/dashboards/dashboards-api.service\";\nimport { ModelProvidersApiService } from \"./services/model-providers/model-providers-api.service\";\nimport { AnalyticsApiService } from \"./services/analytics/analytics-api.service\";\nimport { TriggersApiService } from \"./services/triggers\";\nimport { GraphsApiService } from \"./services/graphs\";\nimport { SimulationRunsApiService } from \"./services/simulation-runs\";\nimport { MonitorsApiService } from \"./services/monitors\";\nimport { SecretsApiService } from \"./services/secrets\";\nimport { type InternalConfig } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"../internal/api/client\";\nimport { type Logger, NoOpLogger } from \"../logger\";\nimport { TracesFacade } from \"./services/traces/facade\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\nexport interface LangWatchConstructorOptions {\n apiKey?: string;\n endpoint?: string;\n options?: {\n logger?: Logger;\n };\n}\n\nexport class LangWatch {\n private readonly config: InternalConfig & { endpoint: string; apiKey: string };\n\n readonly prompts: PromptsFacade;\n readonly traces: TracesFacade;\n readonly datasets: DatasetsFacade;\n\n /**\n * Run experiments on LangWatch platform or via SDK.\n *\n * Platform experiments (CI/CD):\n * ```typescript\n * const result = await langwatch.experiments.run(\"my-experiment-slug\");\n * result.printSummary();\n * ```\n *\n * SDK-defined experiments:\n * ```typescript\n * const experiment = await langwatch.experiments.init(\"my-experiment\");\n * // ... run evaluators using experiment.evaluate()\n * ```\n */\n readonly experiments: ExperimentsFacade;\n\n /**\n * Run evaluators and guardrails in real-time (Online Evaluations).\n *\n * @example\n * ```typescript\n * const guardrail = await langwatch.evaluations.evaluate(\"presidio/pii_detection\", {\n * data: { input: userInput, output: generatedResponse },\n * name: \"PII Detection\",\n * asGuardrail: true,\n * });\n *\n * if (!guardrail.passed) {\n * return \"I'm sorry, I can't do that.\";\n * }\n * ```\n */\n readonly evaluations: EvaluationsFacade;\n\n readonly evaluators: EvaluatorsApiService;\n readonly scenarios: ScenariosApiService;\n readonly suites: SuitesApiService;\n readonly workflows: WorkflowsApiService;\n readonly agents: AgentsApiService;\n readonly annotations: AnnotationsApiService;\n readonly dashboards: DashboardsApiService;\n readonly modelProviders: ModelProvidersApiService;\n readonly analytics: AnalyticsApiService;\n readonly triggers: TriggersApiService;\n readonly graphs: GraphsApiService;\n readonly simulationRuns: SimulationRunsApiService;\n readonly monitors: MonitorsApiService;\n readonly secrets: SecretsApiService;\n\n constructor(options: LangWatchConstructorOptions = {}) {\n const apiKey = options.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = options.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n this.config = this.#createInternalConfig({\n apiKey,\n endpoint,\n options: options.options,\n });\n\n this.prompts = new PromptsFacade({\n promptsApiService: new PromptsApiService(this.config),\n localPromptsService: new LocalPromptsService(),\n ...this.config,\n });\n this.traces = new TracesFacade(this.config);\n\n this.experiments = new ExperimentsFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n });\n\n this.datasets = new DatasetsFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n logger: this.config.logger,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n });\n\n this.evaluations = new EvaluationsFacade({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n });\n\n this.evaluators = new EvaluatorsApiService(this.config);\n this.scenarios = new ScenariosApiService(this.config);\n this.suites = new SuitesApiService(this.config);\n this.workflows = new WorkflowsApiService(this.config);\n this.agents = new AgentsApiService(this.config);\n this.annotations = new AnnotationsApiService(this.config);\n this.dashboards = new DashboardsApiService(this.config);\n this.modelProviders = new ModelProvidersApiService(this.config);\n this.analytics = new AnalyticsApiService(this.config);\n this.triggers = new TriggersApiService(this.config);\n this.graphs = new GraphsApiService(this.config);\n this.simulationRuns = new SimulationRunsApiService(this.config);\n this.monitors = new MonitorsApiService({ apiKey, endpoint });\n this.secrets = new SecretsApiService({ apiKey, endpoint });\n }\n\n get apiClient(): LangwatchApiClient {\n return this.config.langwatchApiClient;\n }\n\n #createInternalConfig({\n apiKey,\n endpoint,\n options,\n }: {\n apiKey: string;\n endpoint: string;\n options?: LangWatchConstructorOptions[\"options\"];\n }): InternalConfig & { endpoint: string; apiKey: string } {\n return {\n logger: options?.logger ?? new NoOpLogger(),\n langwatchApiClient: createLangWatchApiClient(apiKey, endpoint),\n endpoint,\n apiKey,\n };\n }\n}\n","import { ConsoleLogger, NoOpLogger } from \"./logger\";\n\nexport {\n getLangWatchTracer,\n getLangWatchLogger,\n attributes,\n} from \"./observability-sdk\";\n\nexport {\n FilterableBatchSpanProcessor,\n type SpanProcessingExcludeRule,\n} from \"./observability-sdk/processors\";\nexport { LangWatchExporter } from \"./observability-sdk/exporters\";\nexport { LangWatch, FetchPolicy, type GetPromptOptions } from \"./client-sdk\";\n\n// Experiments API exports\nexport {\n Experiment,\n ExperimentsFacade,\n type EvaluationStatus as ExperimentEvaluationStatus,\n type TargetType,\n type TargetMetadata,\n type TargetInfo,\n type EvaluationResult as ExperimentEvaluationResult,\n type ExperimentInitOptions,\n type LogOptions,\n type EvaluateOptions as ExperimentEvaluateOptions,\n type RunOptions,\n type RunCallback,\n type RunContext,\n ExperimentError,\n ExperimentInitError,\n ExperimentApiError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./client-sdk/services/experiments\";\n\n// Evaluators API exports\nexport {\n EvaluatorsApiService,\n type EvaluatorResponse,\n type EvaluatorField,\n type CreateEvaluatorBody,\n EvaluatorsApiError,\n} from \"./client-sdk/services/evaluators\";\n\n// Dataset API exports\nexport {\n DatasetsFacade,\n DatasetError,\n DatasetNotFoundError,\n DatasetApiError,\n DatasetValidationError,\n DatasetPlanLimitError,\n type Dataset,\n type DatasetEntry,\n type DatasetMetadata,\n type DatasetColumnType,\n type DatasetListItem,\n type Pagination,\n type PaginatedResponse,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type CreateFromUploadResponse,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./client-sdk/services/datasets\";\n\n// Evaluations API exports (Online Evaluations / Guardrails)\nexport {\n EvaluationsFacade,\n type EvaluationResult,\n type EvaluateOptions,\n type EvaluationStatus,\n type EvaluationCost,\n EvaluationError,\n EvaluatorCallError,\n EvaluatorNotFoundError,\n EvaluationsApiError,\n} from \"./client-sdk/services/evaluations\";\n\nexport const logger = {\n ConsoleLogger,\n NoOpLogger,\n};\n"]}