langwatch 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-HDTFJTR3.mjs → add-7QFHK67E.mjs} +5 -5
- package/dist/{add-WJ3GGNII.js → add-EJSXUSD6.js} +8 -8
- package/dist/{add-WJ3GGNII.js.map → add-EJSXUSD6.js.map} +1 -1
- package/dist/{assign-DYJ67ZWP.js → assign-5UEB6AJU.js} +6 -6
- package/dist/{assign-DYJ67ZWP.js.map → assign-5UEB6AJU.js.map} +1 -1
- package/dist/{assign-4RE6OK5Z.mjs → assign-JCCQ5D7I.mjs} +5 -5
- package/dist/{chunk-R2N4RS3O.js → chunk-2BJPLPLU.js} +8 -8
- package/dist/{chunk-R2N4RS3O.js.map → chunk-2BJPLPLU.js.map} +1 -1
- package/dist/chunk-2OHGLTXZ.mjs +51 -0
- package/dist/chunk-2OHGLTXZ.mjs.map +1 -0
- package/dist/chunk-47F7UDHN.js +76 -0
- package/dist/chunk-47F7UDHN.js.map +1 -0
- package/dist/chunk-5PMWRY5J.js +80 -0
- package/dist/chunk-5PMWRY5J.js.map +1 -0
- package/dist/{chunk-AGHEWK62.mjs → chunk-7FD7BEJP.mjs} +6 -2
- package/dist/chunk-7FD7BEJP.mjs.map +1 -0
- package/dist/{chunk-K5RFDRTR.js → chunk-AK4YCKWK.js} +6 -6
- package/dist/{chunk-K5RFDRTR.js.map → chunk-AK4YCKWK.js.map} +1 -1
- package/dist/chunk-AMPLL3EP.js +70 -0
- package/dist/chunk-AMPLL3EP.js.map +1 -0
- package/dist/{chunk-FXOQFCAQ.js → chunk-CGFG5FCC.js} +4 -4
- package/dist/{chunk-FXOQFCAQ.js.map → chunk-CGFG5FCC.js.map} +1 -1
- package/dist/{chunk-AARKNSIH.mjs → chunk-COKOLKOR.mjs} +3 -3
- package/dist/chunk-CYRJSLKD.js +68 -0
- package/dist/chunk-CYRJSLKD.js.map +1 -0
- package/dist/{chunk-HV75NBGG.js → chunk-D2FHOR76.js} +2 -2
- package/dist/{chunk-HV75NBGG.js.map → chunk-D2FHOR76.js.map} +1 -1
- package/dist/{chunk-GYYRDOFU.js → chunk-DUG35J5N.js} +14 -14
- package/dist/{chunk-GYYRDOFU.js.map → chunk-DUG35J5N.js.map} +1 -1
- package/dist/{chunk-MUSWAQMZ.mjs → chunk-DWHR6QJK.mjs} +4 -4
- package/dist/{chunk-NKL37OJU.mjs → chunk-ESGWN42J.mjs} +2 -2
- package/dist/{chunk-BWMZJ4JY.js → chunk-FKIH4XCX.js} +8 -4
- package/dist/chunk-FKIH4XCX.js.map +1 -0
- package/dist/{chunk-FFNSKOV2.js → chunk-GLCAOVJA.js} +18 -3
- package/dist/chunk-GLCAOVJA.js.map +1 -0
- package/dist/chunk-HHRXMHVH.js +54 -0
- package/dist/chunk-HHRXMHVH.js.map +1 -0
- package/dist/{chunk-FYWUIW7K.js → chunk-HPQFHP6K.js} +4 -4
- package/dist/{chunk-FYWUIW7K.js.map → chunk-HPQFHP6K.js.map} +1 -1
- package/dist/{chunk-DRU3H2VX.mjs → chunk-I2LDJPTG.mjs} +17 -2
- package/dist/chunk-I2LDJPTG.mjs.map +1 -0
- package/dist/{chunk-QATD3MYQ.mjs → chunk-ILLEMTW3.mjs} +5 -5
- package/dist/{chunk-RFWYQPGX.js → chunk-JWF5KHWM.js} +11 -11
- package/dist/{chunk-RFWYQPGX.js.map → chunk-JWF5KHWM.js.map} +1 -1
- package/dist/{chunk-BORL2BGW.mjs → chunk-JYR4TXSB.mjs} +2 -2
- package/dist/chunk-KH64V3CL.mjs +54 -0
- package/dist/chunk-KH64V3CL.mjs.map +1 -0
- package/dist/chunk-KJSFJ5Z3.js +51 -0
- package/dist/chunk-KJSFJ5Z3.js.map +1 -0
- package/dist/{chunk-W6LLLSCE.mjs → chunk-L3IOXWDG.mjs} +6 -6
- package/dist/{chunk-QCUJJSWS.mjs → chunk-LN33ZL4Z.mjs} +2 -2
- package/dist/{chunk-QCUJJSWS.mjs.map → chunk-LN33ZL4Z.mjs.map} +1 -1
- package/dist/{chunk-6DI23E36.mjs → chunk-LULJYN3P.mjs} +2 -2
- package/dist/chunk-NIW2SFZZ.mjs +85 -0
- package/dist/chunk-NIW2SFZZ.mjs.map +1 -0
- package/dist/chunk-NMACMKQN.mjs +68 -0
- package/dist/chunk-NMACMKQN.mjs.map +1 -0
- package/dist/chunk-PO6XRHYW.mjs +80 -0
- package/dist/chunk-PO6XRHYW.mjs.map +1 -0
- package/dist/{chunk-6VJ2UBYR.mjs → chunk-QH3WUSKF.mjs} +2 -2
- package/dist/chunk-TCO73AV5.mjs +53 -0
- package/dist/chunk-TCO73AV5.mjs.map +1 -0
- package/dist/chunk-TQYUM3WH.mjs +70 -0
- package/dist/chunk-TQYUM3WH.mjs.map +1 -0
- package/dist/chunk-TV6ZXLE5.mjs +76 -0
- package/dist/chunk-TV6ZXLE5.mjs.map +1 -0
- package/dist/chunk-VMDYRBQ7.js +85 -0
- package/dist/chunk-VMDYRBQ7.js.map +1 -0
- package/dist/chunk-WE2PHCFS.js +53 -0
- package/dist/chunk-WE2PHCFS.js.map +1 -0
- package/dist/chunk-WLMXMXHE.js +54 -0
- package/dist/chunk-WLMXMXHE.js.map +1 -0
- package/dist/{chunk-U3QHT2XN.js → chunk-X7QBE6AA.js} +9 -9
- package/dist/{chunk-U3QHT2XN.js.map → chunk-X7QBE6AA.js.map} +1 -1
- package/dist/chunk-YTR56IZO.mjs +54 -0
- package/dist/chunk-YTR56IZO.mjs.map +1 -0
- package/dist/{chunk-TXLQ67D3.js → chunk-Z6MQQXMS.js} +4 -4
- package/dist/{chunk-TXLQ67D3.js.map → chunk-Z6MQQXMS.js.map} +1 -1
- package/dist/cli/index.js +354 -63
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +354 -63
- package/dist/cli/index.mjs.map +1 -1
- package/dist/create-45FMHT6B.mjs +78 -0
- package/dist/create-45FMHT6B.mjs.map +1 -0
- package/dist/create-4OA73B7I.mjs +44 -0
- package/dist/create-4OA73B7I.mjs.map +1 -0
- package/dist/create-4U5BPFCT.mjs +51 -0
- package/dist/create-4U5BPFCT.mjs.map +1 -0
- package/dist/{create-TH7EZWKS.mjs → create-ARJEJDYU.mjs} +6 -6
- package/dist/create-CQ7W2OAA.js +78 -0
- package/dist/create-CQ7W2OAA.js.map +1 -0
- package/dist/create-FI6HBFTB.mjs +63 -0
- package/dist/create-FI6HBFTB.mjs.map +1 -0
- package/dist/{create-NU7AQCFV.js → create-FYLUSZTP.js} +6 -6
- package/dist/{create-NU7AQCFV.js.map → create-FYLUSZTP.js.map} +1 -1
- package/dist/create-GGYYU5KM.mjs +51 -0
- package/dist/create-GGYYU5KM.mjs.map +1 -0
- package/dist/create-K5LFAS4E.mjs +61 -0
- package/dist/create-K5LFAS4E.mjs.map +1 -0
- package/dist/create-KAPF2AOL.js +44 -0
- package/dist/create-KAPF2AOL.js.map +1 -0
- package/dist/create-LWG7ZHEW.mjs +71 -0
- package/dist/create-LWG7ZHEW.mjs.map +1 -0
- package/dist/create-MXYMAFMF.js +71 -0
- package/dist/create-MXYMAFMF.js.map +1 -0
- package/dist/{create-TCQDVSGM.mjs → create-NFYHBFF5.mjs} +7 -4
- package/dist/create-NFYHBFF5.mjs.map +1 -0
- package/dist/create-OSAXTSUC.js +51 -0
- package/dist/create-OSAXTSUC.js.map +1 -0
- package/dist/create-RPHO5TZX.js +51 -0
- package/dist/create-RPHO5TZX.js.map +1 -0
- package/dist/create-RRI5ZTMI.mjs +51 -0
- package/dist/create-RRI5ZTMI.mjs.map +1 -0
- package/dist/create-UKLLNRXV.js +61 -0
- package/dist/create-UKLLNRXV.js.map +1 -0
- package/dist/create-UZ5NDYPV.js +88 -0
- package/dist/create-UZ5NDYPV.js.map +1 -0
- package/dist/create-WV2NQDV5.js +63 -0
- package/dist/create-WV2NQDV5.js.map +1 -0
- package/dist/{create-KRWNLZSG.js → create-XGD3GULQ.js} +9 -6
- package/dist/create-XGD3GULQ.js.map +1 -0
- package/dist/create-XZXVGMKU.js +51 -0
- package/dist/create-XZXVGMKU.js.map +1 -0
- package/dist/create-Z2XFL2HX.js +18 -0
- package/dist/{create-QWQSNPTO.js.map → create-Z2XFL2HX.js.map} +1 -1
- package/dist/{create-RAZZO2W2.mjs → create-Z7DUMMQ4.mjs} +5 -5
- package/dist/create-ZU4L3XOF.mjs +88 -0
- package/dist/create-ZU4L3XOF.mjs.map +1 -0
- package/dist/delete-22LDMLNG.mjs +61 -0
- package/dist/delete-22LDMLNG.mjs.map +1 -0
- package/dist/{delete-JDWOOZ3V.mjs → delete-2S67GS6A.mjs} +11 -7
- package/dist/delete-2S67GS6A.mjs.map +1 -0
- package/dist/delete-3WCCA5O2.mjs +44 -0
- package/dist/delete-3WCCA5O2.mjs.map +1 -0
- package/dist/delete-4QNGDUH6.js +44 -0
- package/dist/delete-4QNGDUH6.js.map +1 -0
- package/dist/{delete-JGQJZMYH.js → delete-555RUBQA.js} +6 -6
- package/dist/{delete-JGQJZMYH.js.map → delete-555RUBQA.js.map} +1 -1
- package/dist/delete-5NINT2KV.mjs +42 -0
- package/dist/delete-5NINT2KV.mjs.map +1 -0
- package/dist/delete-5VDH4Q3Z.js +44 -0
- package/dist/delete-5VDH4Q3Z.js.map +1 -0
- package/dist/delete-6JPJPG4B.js +38 -0
- package/dist/delete-6JPJPG4B.js.map +1 -0
- package/dist/delete-6ZD3ARMB.js +61 -0
- package/dist/delete-6ZD3ARMB.js.map +1 -0
- package/dist/delete-AOSVEVNL.mjs +44 -0
- package/dist/delete-AOSVEVNL.mjs.map +1 -0
- package/dist/{delete-OP2UOPWZ.js → delete-BLTSYYZQ.js} +13 -9
- package/dist/delete-BLTSYYZQ.js.map +1 -0
- package/dist/delete-CTE3RNKB.mjs +42 -0
- package/dist/delete-CTE3RNKB.mjs.map +1 -0
- package/dist/delete-HEF4DLSV.mjs +38 -0
- package/dist/delete-HEF4DLSV.mjs.map +1 -0
- package/dist/{delete-R65HWSNX.mjs → delete-I36NLS2V.mjs} +8 -5
- package/dist/delete-I36NLS2V.mjs.map +1 -0
- package/dist/delete-J2P2Y2BW.mjs +63 -0
- package/dist/delete-J2P2Y2BW.mjs.map +1 -0
- package/dist/delete-KIXZ73DF.mjs +38 -0
- package/dist/delete-KIXZ73DF.mjs.map +1 -0
- package/dist/delete-L3SU34X6.mjs +44 -0
- package/dist/delete-L3SU34X6.mjs.map +1 -0
- package/dist/delete-N6OZW65U.js +44 -0
- package/dist/delete-N6OZW65U.js.map +1 -0
- package/dist/delete-PPEXA2V4.js +42 -0
- package/dist/delete-PPEXA2V4.js.map +1 -0
- package/dist/{delete-5AYFLOXU.js → delete-PXGB35PF.js} +11 -8
- package/dist/delete-PXGB35PF.js.map +1 -0
- package/dist/delete-QVE52G3Q.mjs +42 -0
- package/dist/delete-QVE52G3Q.mjs.map +1 -0
- package/dist/delete-R5TSAZOU.js +42 -0
- package/dist/delete-R5TSAZOU.js.map +1 -0
- package/dist/{delete-JTABVSQ3.mjs → delete-RIHVCQ6G.mjs} +5 -5
- package/dist/delete-UWPOVLSO.js +38 -0
- package/dist/delete-UWPOVLSO.js.map +1 -0
- package/dist/delete-XKF7KO4Y.js +63 -0
- package/dist/delete-XKF7KO4Y.js.map +1 -0
- package/dist/delete-ZY2UCN3W.js +42 -0
- package/dist/delete-ZY2UCN3W.js.map +1 -0
- package/dist/{download-NJBXSCJA.js → download-2Q5T4WW2.js} +7 -7
- package/dist/{download-NJBXSCJA.js.map → download-2Q5T4WW2.js.map} +1 -1
- package/dist/{download-W6M43RXJ.mjs → download-7RBJ3GZM.mjs} +5 -5
- package/dist/duplicate-7N6B5PJD.mjs +48 -0
- package/dist/duplicate-7N6B5PJD.mjs.map +1 -0
- package/dist/duplicate-HZGUFROD.js +48 -0
- package/dist/duplicate-HZGUFROD.js.map +1 -0
- package/dist/export-PP5LG6Q7.js +91 -0
- package/dist/export-PP5LG6Q7.js.map +1 -0
- package/dist/export-TGKA6WA4.mjs +91 -0
- package/dist/export-TGKA6WA4.mjs.map +1 -0
- package/dist/get-2AXSP6AP.js +62 -0
- package/dist/get-2AXSP6AP.js.map +1 -0
- package/dist/get-6UQYEENU.mjs +55 -0
- package/dist/get-6UQYEENU.mjs.map +1 -0
- package/dist/get-73K7EOMU.mjs +53 -0
- package/dist/get-73K7EOMU.mjs.map +1 -0
- package/dist/{get-QNJG5KQI.mjs → get-7JYKMJXV.mjs} +9 -5
- package/dist/get-7JYKMJXV.mjs.map +1 -0
- package/dist/{get-7LNIOD7J.js → get-7V7OBWY5.js} +12 -8
- package/dist/get-7V7OBWY5.js.map +1 -0
- package/dist/get-CBNUMPUN.mjs +64 -0
- package/dist/get-CBNUMPUN.mjs.map +1 -0
- package/dist/get-E2RIDN65.mjs +70 -0
- package/dist/get-E2RIDN65.mjs.map +1 -0
- package/dist/get-EN3CQXA7.js +51 -0
- package/dist/get-EN3CQXA7.js.map +1 -0
- package/dist/get-GHUHFWC3.js +58 -0
- package/dist/get-GHUHFWC3.js.map +1 -0
- package/dist/get-GQTPK2MW.mjs +51 -0
- package/dist/get-GQTPK2MW.mjs.map +1 -0
- package/dist/get-I2CQCKFW.mjs +62 -0
- package/dist/get-I2CQCKFW.mjs.map +1 -0
- package/dist/get-IDYGZX5O.mjs +51 -0
- package/dist/get-IDYGZX5O.mjs.map +1 -0
- package/dist/get-JAWJ5RIB.mjs +66 -0
- package/dist/get-JAWJ5RIB.mjs.map +1 -0
- package/dist/get-JYN765FP.js +53 -0
- package/dist/get-JYN765FP.js.map +1 -0
- package/dist/get-MHGIJVZ5.js +51 -0
- package/dist/get-MHGIJVZ5.js.map +1 -0
- package/dist/get-NIA7XUS2.mjs +56 -0
- package/dist/get-NIA7XUS2.mjs.map +1 -0
- package/dist/get-PM5HD5BJ.js +64 -0
- package/dist/get-PM5HD5BJ.js.map +1 -0
- package/dist/{get-B3IEMUXD.mjs → get-PR65PTQ5.mjs} +10 -6
- package/dist/get-PR65PTQ5.mjs.map +1 -0
- package/dist/get-PYWLY7QQ.mjs +71 -0
- package/dist/get-PYWLY7QQ.mjs.map +1 -0
- package/dist/get-QMCMYTDV.mjs +58 -0
- package/dist/get-QMCMYTDV.mjs.map +1 -0
- package/dist/get-QNYINIDO.mjs +95 -0
- package/dist/get-QNYINIDO.mjs.map +1 -0
- package/dist/get-S7MFACWM.js +70 -0
- package/dist/get-S7MFACWM.js.map +1 -0
- package/dist/get-SBMD2X2P.js +66 -0
- package/dist/get-SBMD2X2P.js.map +1 -0
- package/dist/{get-K6TMIWQK.js → get-T754IOEI.js} +11 -7
- package/dist/get-T754IOEI.js.map +1 -0
- package/dist/get-TOXTYIN5.js +71 -0
- package/dist/get-TOXTYIN5.js.map +1 -0
- package/dist/get-UCHL4WHT.js +95 -0
- package/dist/get-UCHL4WHT.js.map +1 -0
- package/dist/get-Y22XVMEO.js +55 -0
- package/dist/get-Y22XVMEO.js.map +1 -0
- package/dist/get-ZEUJA3KA.js +56 -0
- package/dist/get-ZEUJA3KA.js.map +1 -0
- package/dist/{implementation-Bhxy8sNw.d.ts → implementation-7POf4yX4.d.ts} +1 -1
- package/dist/{implementation-D3RUOFRX.d.mts → implementation-BbuGM8_W.d.mts} +1 -1
- package/dist/index.d.mts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +17 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -14
- package/dist/list-3JR4HKGF.mjs +70 -0
- package/dist/list-3JR4HKGF.mjs.map +1 -0
- package/dist/{list-YFJPNGR6.js → list-6BRQWVVV.js} +12 -8
- package/dist/list-6BRQWVVV.js.map +1 -0
- package/dist/list-6JTFDJAI.mjs +93 -0
- package/dist/list-6JTFDJAI.mjs.map +1 -0
- package/dist/{list-HFRDNM2A.js → list-7LV6GOZO.js} +11 -7
- package/dist/list-7LV6GOZO.js.map +1 -0
- package/dist/{list-GR5TWKOC.mjs → list-AEX4S72W.mjs} +10 -6
- package/dist/list-AEX4S72W.mjs.map +1 -0
- package/dist/list-AGELVAP7.js +70 -0
- package/dist/list-AGELVAP7.js.map +1 -0
- package/dist/list-ARBOOOYN.mjs +81 -0
- package/dist/list-ARBOOOYN.mjs.map +1 -0
- package/dist/list-AYOW6OF7.js +73 -0
- package/dist/list-AYOW6OF7.js.map +1 -0
- package/dist/list-BAKCZVTL.mjs +78 -0
- package/dist/list-BAKCZVTL.mjs.map +1 -0
- package/dist/list-BDNGLOLK.mjs +77 -0
- package/dist/list-BDNGLOLK.mjs.map +1 -0
- package/dist/{list-MTDELPPO.js → list-C6DPYHQ2.js} +13 -9
- package/dist/list-C6DPYHQ2.js.map +1 -0
- package/dist/{list-SB6HQETV.mjs → list-E7YPBCAF.mjs} +9 -5
- package/dist/list-E7YPBCAF.mjs.map +1 -0
- package/dist/{list-ESCIURJG.mjs → list-EPB36Y7W.mjs} +10 -6
- package/dist/list-EPB36Y7W.mjs.map +1 -0
- package/dist/list-FLTPMAHR.js +93 -0
- package/dist/list-FLTPMAHR.js.map +1 -0
- package/dist/list-FPIWJ65T.mjs +83 -0
- package/dist/list-FPIWJ65T.mjs.map +1 -0
- package/dist/list-GN3SAZG2.js +83 -0
- package/dist/list-GN3SAZG2.js.map +1 -0
- package/dist/list-JK36QVS2.js +73 -0
- package/dist/list-JK36QVS2.js.map +1 -0
- package/dist/list-JRWFJU5H.js +81 -0
- package/dist/list-JRWFJU5H.js.map +1 -0
- package/dist/list-KIJ4ILEN.mjs +78 -0
- package/dist/list-KIJ4ILEN.mjs.map +1 -0
- package/dist/list-KQKELE44.mjs +73 -0
- package/dist/list-KQKELE44.mjs.map +1 -0
- package/dist/list-LMMRRFZC.js +77 -0
- package/dist/list-LMMRRFZC.js.map +1 -0
- package/dist/{list-SDQ4LZU7.mjs → list-N7WIOJ5A.mjs} +10 -6
- package/dist/list-N7WIOJ5A.mjs.map +1 -0
- package/dist/list-RS4QL7NE.mjs +83 -0
- package/dist/list-RS4QL7NE.mjs.map +1 -0
- package/dist/list-SDMJ2GJE.js +81 -0
- package/dist/list-SDMJ2GJE.js.map +1 -0
- package/dist/{list-Q4PHG7X6.js → list-UKGJOVJE.js} +11 -7
- package/dist/list-UKGJOVJE.js.map +1 -0
- package/dist/list-UOTJUE2P.js +79 -0
- package/dist/list-UOTJUE2P.js.map +1 -0
- package/dist/list-W2MYF4RU.js +78 -0
- package/dist/list-W2MYF4RU.js.map +1 -0
- package/dist/list-WYYGGV5V.mjs +81 -0
- package/dist/list-WYYGGV5V.mjs.map +1 -0
- package/dist/list-WZ4KHBMF.mjs +73 -0
- package/dist/list-WZ4KHBMF.mjs.map +1 -0
- package/dist/list-XTOWXYB2.js +83 -0
- package/dist/list-XTOWXYB2.js.map +1 -0
- package/dist/list-Z5EEMYRQ.js +78 -0
- package/dist/list-Z5EEMYRQ.js.map +1 -0
- package/dist/list-ZB53NL6Z.mjs +79 -0
- package/dist/list-ZB53NL6Z.mjs.map +1 -0
- package/dist/{login-IK3G3RQU.mjs → login-4AX6AOKI.mjs} +20 -3
- package/dist/login-4AX6AOKI.mjs.map +1 -0
- package/dist/{login-YTDM7X4O.js → login-H3SQDBT7.js} +21 -4
- package/dist/login-H3SQDBT7.js.map +1 -0
- package/dist/observability-sdk/index.d.mts +3 -3
- package/dist/observability-sdk/index.d.ts +3 -3
- package/dist/observability-sdk/index.js +4 -4
- package/dist/observability-sdk/index.js.map +1 -1
- package/dist/observability-sdk/index.mjs +7 -7
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
- package/dist/observability-sdk/setup/node/index.js +4 -4
- package/dist/observability-sdk/setup/node/index.mjs +3 -3
- package/dist/{pull-S7VIDGCP.mjs → pull-64HVVOBC.mjs} +6 -6
- package/dist/{push-OM2UJSDQ.js → pull-QIANBELG.js} +7 -7
- package/dist/{pull-4JNOLLDT.js.map → pull-QIANBELG.js.map} +1 -1
- package/dist/{push-5SDFS745.mjs → push-GXLGORLM.mjs} +6 -6
- package/dist/{pull-4JNOLLDT.js → push-I3BJSL6N.js} +7 -7
- package/dist/{push-OM2UJSDQ.js.map → push-I3BJSL6N.js.map} +1 -1
- package/dist/query-UF2LDBR4.js +158 -0
- package/dist/query-UF2LDBR4.js.map +1 -0
- package/dist/query-ZI7HJSIY.mjs +158 -0
- package/dist/query-ZI7HJSIY.mjs.map +1 -0
- package/dist/{records-add-HK35CE5Y.mjs → records-add-4LX4JHLO.mjs} +20 -8
- package/dist/records-add-4LX4JHLO.mjs.map +1 -0
- package/dist/{records-add-FFWQKH7L.js → records-add-WTIGBJV4.js} +22 -10
- package/dist/records-add-WTIGBJV4.js.map +1 -0
- package/dist/{records-delete-OUTZGP2T.mjs → records-delete-IY37NWPN.mjs} +5 -5
- package/dist/{records-delete-CPDG57RE.js → records-delete-MLOG4DM4.js} +7 -7
- package/dist/{records-delete-CPDG57RE.js.map → records-delete-MLOG4DM4.js.map} +1 -1
- package/dist/{records-list-3WD7NOL2.js → records-list-EP6OCFH5.js} +11 -7
- package/dist/{records-list-3WD7NOL2.js.map → records-list-EP6OCFH5.js.map} +1 -1
- package/dist/{records-list-TNPIGZHJ.mjs → records-list-RIDOAE2V.mjs} +9 -5
- package/dist/records-list-RIDOAE2V.mjs.map +1 -0
- package/dist/{records-update-PSQTQQM5.js → records-update-5QZBDYUJ.js} +7 -7
- package/dist/{records-update-PSQTQQM5.js.map → records-update-5QZBDYUJ.js.map} +1 -1
- package/dist/{records-update-JBBGKLI3.mjs → records-update-JINO26IA.mjs} +5 -5
- package/dist/{remove-RU3NILCE.mjs → remove-HLVK7VUB.mjs} +5 -5
- package/dist/{remove-6PRYZKKI.js → remove-LDX2BSUH.js} +7 -7
- package/dist/{remove-6PRYZKKI.js.map → remove-LDX2BSUH.js.map} +1 -1
- package/dist/{rename-XWNYLJ7Y.mjs → rename-FP7X3GJJ.mjs} +5 -5
- package/dist/{rename-R526CR2K.js → rename-PUSZYLZ7.js} +6 -6
- package/dist/{rename-R526CR2K.js.map → rename-PUSZYLZ7.js.map} +1 -1
- package/dist/restore-5L5MLISA.mjs +63 -0
- package/dist/restore-5L5MLISA.mjs.map +1 -0
- package/dist/restore-OXNQMRMJ.js +63 -0
- package/dist/restore-OXNQMRMJ.js.map +1 -0
- package/dist/run-AIGCDUDF.mjs +143 -0
- package/dist/run-AIGCDUDF.mjs.map +1 -0
- package/dist/run-CKZ6VNKK.js +143 -0
- package/dist/run-CKZ6VNKK.js.map +1 -0
- package/dist/run-FE4QMJO5.mjs +67 -0
- package/dist/run-FE4QMJO5.mjs.map +1 -0
- package/dist/run-FJDOSV5E.js +128 -0
- package/dist/run-FJDOSV5E.js.map +1 -0
- package/dist/run-GUSPWLCC.mjs +128 -0
- package/dist/run-GUSPWLCC.mjs.map +1 -0
- package/dist/run-KNCB7OEA.js +86 -0
- package/dist/run-KNCB7OEA.js.map +1 -0
- package/dist/run-KZKAHFBR.js +67 -0
- package/dist/run-KZKAHFBR.js.map +1 -0
- package/dist/run-QW2HL4EK.mjs +86 -0
- package/dist/run-QW2HL4EK.mjs.map +1 -0
- package/dist/run-UZVJBWGG.js +130 -0
- package/dist/run-UZVJBWGG.js.map +1 -0
- package/dist/run-WZ4CSMTP.mjs +130 -0
- package/dist/run-WZ4CSMTP.mjs.map +1 -0
- package/dist/search-5B32YGSP.mjs +112 -0
- package/dist/search-5B32YGSP.mjs.map +1 -0
- package/dist/search-J5GDX5JK.js +112 -0
- package/dist/search-J5GDX5JK.js.map +1 -0
- package/dist/set-2DYJNVS5.mjs +62 -0
- package/dist/set-2DYJNVS5.mjs.map +1 -0
- package/dist/set-S5L5QSYZ.js +62 -0
- package/dist/set-S5L5QSYZ.js.map +1 -0
- package/dist/status-OIXOYFH4.mjs +101 -0
- package/dist/status-OIXOYFH4.mjs.map +1 -0
- package/dist/status-Q2PEMYJT.mjs +70 -0
- package/dist/status-Q2PEMYJT.mjs.map +1 -0
- package/dist/status-QRK56VLF.js +70 -0
- package/dist/status-QRK56VLF.js.map +1 -0
- package/dist/status-T7NOWM4X.js +101 -0
- package/dist/status-T7NOWM4X.js.map +1 -0
- package/dist/{sync-N6UBIABB.js → sync-IDSAYUGO.js} +11 -11
- package/dist/{sync-N6UBIABB.js.map → sync-IDSAYUGO.js.map} +1 -1
- package/dist/{sync-DTJZCK67.mjs → sync-LA27E4UB.mjs} +7 -7
- package/dist/{types-2lYnPqzr.d.ts → types-B4TSe7JR.d.ts} +6194 -2748
- package/dist/{types-BUnPGSWo.d.mts → types-CWY5yQki.d.mts} +6194 -2748
- package/dist/update-3B43ZW4X.mjs +53 -0
- package/dist/update-3B43ZW4X.mjs.map +1 -0
- package/dist/update-3C6Y2Y2P.js +53 -0
- package/dist/update-3C6Y2Y2P.js.map +1 -0
- package/dist/update-4D7R3VYO.js +75 -0
- package/dist/update-4D7R3VYO.js.map +1 -0
- package/dist/update-4FC4YPW7.mjs +71 -0
- package/dist/update-4FC4YPW7.mjs.map +1 -0
- package/dist/update-4YMVL4UT.mjs +74 -0
- package/dist/update-4YMVL4UT.mjs.map +1 -0
- package/dist/update-7ZEJO5SB.js +74 -0
- package/dist/update-7ZEJO5SB.js.map +1 -0
- package/dist/update-BADZ6GRL.js +66 -0
- package/dist/update-BADZ6GRL.js.map +1 -0
- package/dist/{update-YID5H7KM.js → update-DLFJBCI2.js} +13 -9
- package/dist/update-DLFJBCI2.js.map +1 -0
- package/dist/update-EB7WMPOP.js +53 -0
- package/dist/update-EB7WMPOP.js.map +1 -0
- package/dist/update-EG6BZOLC.mjs +51 -0
- package/dist/update-EG6BZOLC.mjs.map +1 -0
- package/dist/update-FKL5Y73R.js +69 -0
- package/dist/update-FKL5Y73R.js.map +1 -0
- package/dist/update-GWTLCIAT.mjs +69 -0
- package/dist/update-GWTLCIAT.mjs.map +1 -0
- package/dist/update-MFZOMTRJ.mjs +51 -0
- package/dist/update-MFZOMTRJ.mjs.map +1 -0
- package/dist/{update-7DVLJOW5.mjs → update-PSY46JJD.mjs} +10 -6
- package/dist/update-PSY46JJD.mjs.map +1 -0
- package/dist/update-PXCMJWY3.mjs +53 -0
- package/dist/update-PXCMJWY3.mjs.map +1 -0
- package/dist/update-R72C65QF.mjs +66 -0
- package/dist/update-R72C65QF.mjs.map +1 -0
- package/dist/update-RCZ47II5.js +52 -0
- package/dist/update-RCZ47II5.js.map +1 -0
- package/dist/update-RPD2OXXQ.js +51 -0
- package/dist/update-RPD2OXXQ.js.map +1 -0
- package/dist/update-VLY6LJVM.js +51 -0
- package/dist/update-VLY6LJVM.js.map +1 -0
- package/dist/update-WKM6XI4V.mjs +75 -0
- package/dist/update-WKM6XI4V.mjs.map +1 -0
- package/dist/update-WQK5Q34V.mjs +52 -0
- package/dist/update-WQK5Q34V.mjs.map +1 -0
- package/dist/update-YMWBN55I.js +71 -0
- package/dist/update-YMWBN55I.js.map +1 -0
- package/dist/{upload-QFNUIOI6.js → upload-6LF5GVLP.js} +7 -7
- package/dist/{upload-QFNUIOI6.js.map → upload-6LF5GVLP.js.map} +1 -1
- package/dist/{upload-TUW6TDEC.mjs → upload-QWAITH5R.mjs} +5 -5
- package/dist/versions-HIYVXIKM.js +82 -0
- package/dist/versions-HIYVXIKM.js.map +1 -0
- package/dist/versions-JPUSBSTF.mjs +82 -0
- package/dist/versions-JPUSBSTF.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-AGHEWK62.mjs.map +0 -1
- package/dist/chunk-BWMZJ4JY.js.map +0 -1
- package/dist/chunk-DRU3H2VX.mjs.map +0 -1
- package/dist/chunk-FFNSKOV2.js.map +0 -1
- package/dist/create-KRWNLZSG.js.map +0 -1
- package/dist/create-QWQSNPTO.js +0 -18
- package/dist/create-TCQDVSGM.mjs.map +0 -1
- package/dist/delete-5AYFLOXU.js.map +0 -1
- package/dist/delete-JDWOOZ3V.mjs.map +0 -1
- package/dist/delete-OP2UOPWZ.js.map +0 -1
- package/dist/delete-R65HWSNX.mjs.map +0 -1
- package/dist/get-7LNIOD7J.js.map +0 -1
- package/dist/get-B3IEMUXD.mjs.map +0 -1
- package/dist/get-K6TMIWQK.js.map +0 -1
- package/dist/get-QNJG5KQI.mjs.map +0 -1
- package/dist/list-ESCIURJG.mjs.map +0 -1
- package/dist/list-GR5TWKOC.mjs.map +0 -1
- package/dist/list-HFRDNM2A.js.map +0 -1
- package/dist/list-MTDELPPO.js.map +0 -1
- package/dist/list-Q4PHG7X6.js.map +0 -1
- package/dist/list-SB6HQETV.mjs.map +0 -1
- package/dist/list-SDQ4LZU7.mjs.map +0 -1
- package/dist/list-YFJPNGR6.js.map +0 -1
- package/dist/login-IK3G3RQU.mjs.map +0 -1
- package/dist/login-YTDM7X4O.js.map +0 -1
- package/dist/records-add-FFWQKH7L.js.map +0 -1
- package/dist/records-add-HK35CE5Y.mjs.map +0 -1
- package/dist/records-list-TNPIGZHJ.mjs.map +0 -1
- package/dist/update-7DVLJOW5.mjs.map +0 -1
- package/dist/update-YID5H7KM.js.map +0 -1
- /package/dist/{add-HDTFJTR3.mjs.map → add-7QFHK67E.mjs.map} +0 -0
- /package/dist/{assign-4RE6OK5Z.mjs.map → assign-JCCQ5D7I.mjs.map} +0 -0
- /package/dist/{chunk-AARKNSIH.mjs.map → chunk-COKOLKOR.mjs.map} +0 -0
- /package/dist/{chunk-MUSWAQMZ.mjs.map → chunk-DWHR6QJK.mjs.map} +0 -0
- /package/dist/{chunk-NKL37OJU.mjs.map → chunk-ESGWN42J.mjs.map} +0 -0
- /package/dist/{chunk-QATD3MYQ.mjs.map → chunk-ILLEMTW3.mjs.map} +0 -0
- /package/dist/{chunk-BORL2BGW.mjs.map → chunk-JYR4TXSB.mjs.map} +0 -0
- /package/dist/{chunk-W6LLLSCE.mjs.map → chunk-L3IOXWDG.mjs.map} +0 -0
- /package/dist/{chunk-6DI23E36.mjs.map → chunk-LULJYN3P.mjs.map} +0 -0
- /package/dist/{chunk-6VJ2UBYR.mjs.map → chunk-QH3WUSKF.mjs.map} +0 -0
- /package/dist/{create-TH7EZWKS.mjs.map → create-ARJEJDYU.mjs.map} +0 -0
- /package/dist/{create-RAZZO2W2.mjs.map → create-Z7DUMMQ4.mjs.map} +0 -0
- /package/dist/{delete-JTABVSQ3.mjs.map → delete-RIHVCQ6G.mjs.map} +0 -0
- /package/dist/{download-W6M43RXJ.mjs.map → download-7RBJ3GZM.mjs.map} +0 -0
- /package/dist/{pull-S7VIDGCP.mjs.map → pull-64HVVOBC.mjs.map} +0 -0
- /package/dist/{push-5SDFS745.mjs.map → push-GXLGORLM.mjs.map} +0 -0
- /package/dist/{records-delete-OUTZGP2T.mjs.map → records-delete-IY37NWPN.mjs.map} +0 -0
- /package/dist/{records-update-JBBGKLI3.mjs.map → records-update-JINO26IA.mjs.map} +0 -0
- /package/dist/{remove-RU3NILCE.mjs.map → remove-HLVK7VUB.mjs.map} +0 -0
- /package/dist/{rename-XWNYLJ7Y.mjs.map → rename-FP7X3GJJ.mjs.map} +0 -0
- /package/dist/{sync-DTJZCK67.mjs.map → sync-LA27E4UB.mjs.map} +0 -0
- /package/dist/{upload-TUW6TDEC.mjs.map → upload-QWAITH5R.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-K5RFDRTR.js","../src/client-sdk/services/prompts/errors/prompts.error.ts","../src/client-sdk/services/prompts/errors/prompt-compilation.error.ts","../src/client-sdk/services/prompts/errors/prompt-validation.error.ts","../src/client-sdk/services/prompts/errors/prompts-api.error.ts","../src/client-sdk/services/prompts/tracing/prompt-tracing.decorator.ts","../src/client-sdk/services/prompts/tracing/prompt-service-tracing.decorator.ts","../src/client-sdk/services/prompts/tracing/tracer.ts","../src/client-sdk/services/prompts/prompts-api.service.ts","../src/client-sdk/services/prompts/types.ts","../src/client-sdk/services/prompts/prompt.ts","../src/client-sdk/services/prompts/schema/prompt.schema.ts","../src/client-sdk/services/prompts/constants.ts","../src/client-sdk/services/prompts/local-prompts.service.ts","../src/client-sdk/services/prompts/prompts.facade.ts"],"names":["FetchPolicy"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-K5RFDRTR.js","sourcesContent":[null,"/**\n * Base error class for the Prompts domain.\n * All prompt-related errors should extend this class.\n */\nexport class PromptsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PromptsError\";\n }\n}\n","/**\n * Error class for template compilation issues\n */\nexport class PromptCompilationError extends Error {\n constructor(\n message: string,\n public readonly template: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"PromptCompilationError\";\n }\n}\n","import { type z } from \"zod\";\n\n/**\n * Error class for prompt validation issues\n */\nexport class PromptValidationError extends Error {\n constructor(message: string, public readonly validationErrors: z.ZodError) {\n super(message);\n this.name = \"PromptValidationError\";\n }\n}\n","import { PromptsError } from \"./prompts.error\";\n\n/**\n * Error class for Prompts API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class PromptsApiError extends PromptsError {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"PromptsApiError\";\n }\n}\n","import { type Prompt, type TemplateVariables, type CompiledPrompt } from \"../prompt\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"@/observability-sdk\";\nimport type { LangWatchSpan } from \"@/observability-sdk\";\n\n/**\n * Class that decorates the target prompt,\n * adding tracing to specific methods.\n */\nexport class PromptTracingDecorator {\n constructor(private readonly target: Prompt) {}\n\n private traceCompilation(\n span: LangWatchSpan,\n variables: TemplateVariables,\n compileFn: () => CompiledPrompt\n ): CompiledPrompt {\n span.setType(\"prompt\");\n\n if (shouldCaptureInput()) {\n span.setInput(this.target);\n\n if (variables) {\n span.setAttribute(\n 'langwatch.prompt.variables',\n JSON.stringify({\n type: \"json\",\n value: variables,\n }),\n );\n }\n }\n\n const result = compileFn();\n\n // Only emit combined handle:version format when both are available\n if (result.handle != null && result.version != null) {\n span.setAttribute(\n 'langwatch.prompt.id',\n `${result.handle}:${result.version}`,\n );\n }\n\n if (shouldCaptureOutput()) {\n span.setOutput({\n ...result,\n raw: void 0, // TODO(afr): Figure out a better way to do this.\n });\n }\n\n return result;\n }\n\n compile(span: LangWatchSpan, variables: TemplateVariables = {}): CompiledPrompt {\n return this.traceCompilation(\n span,\n variables,\n () => this.target.compile(variables),\n );\n }\n\n compileStrict(span: LangWatchSpan, variables: TemplateVariables): CompiledPrompt {\n return this.traceCompilation(\n span,\n variables,\n () => this.target.compileStrict(variables),\n );\n }\n}\n","import { type PromptsApiService } from \"../prompts-api.service\";\nimport type { LangWatchSpan } from \"@/observability-sdk\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"@/observability-sdk\";\nimport type { CreatePromptBody, UpdatePromptBody, PromptResponse } from \"../types\";\n\n/**\n * Class that decorates the target prompt service,\n * adding tracing to key methods.\n */\nexport class PromptServiceTracingDecorator {\n constructor(private readonly target: PromptsApiService) {}\n\n async get(\n span: LangWatchSpan,\n id: string,\n options?: { version?: string }\n ): Promise<PromptResponse> {\n span.setType(\"prompt\");\n\n const result = await this.target.get(id, options);\n\n if (result) {\n // Only emit combined format when both handle and version are available\n if (result.handle != null && result.version != null) {\n span.setAttribute(\n 'langwatch.prompt.id',\n `${result.handle}:${result.version}`,\n );\n }\n }\n\n if (result && shouldCaptureOutput()) {\n span.setOutput(\"json\", result);\n }\n\n return result;\n }\n\n async create(\n span: LangWatchSpan,\n params: CreatePromptBody\n ): Promise<PromptResponse> {\n span.setType(\"prompt\");\n\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.create(params);\n\n span.setAttributes({\n 'langwatch.prompt.id': result.id,\n 'langwatch.prompt.handle': result.handle ?? undefined,\n 'langwatch.prompt.scope': result.scope,\n 'langwatch.prompt.version.id': result.versionId,\n 'langwatch.prompt.version.number': result.version,\n });\n\n return result;\n }\n\n async update(\n span: LangWatchSpan,\n id: string,\n params: UpdatePromptBody\n ): Promise<PromptResponse> {\n\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.update(id, params);\n\n span.setType(\"prompt\");\n span.setAttributes({\n 'langwatch.prompt.id': id,\n 'langwatch.prompt.handle': result.handle ?? undefined,\n 'langwatch.prompt.scope': result.scope,\n 'langwatch.prompt.version.id': result.versionId,\n 'langwatch.prompt.version.number': result.version,\n });\n\n return result;\n }\n\n async delete(\n span: LangWatchSpan,\n id: string\n ): Promise<{ success: boolean }> {\n const result = await this.target.delete(id);\n\n span.setType(\"prompt\");\n span.setAttribute('langwatch.prompt.id', id);\n span.setAttribute('langwatch.prompt.deleted', 'true');\n\n return result;\n }\n\n async upsert(\n span: LangWatchSpan,\n handle: string,\n config: any\n ): Promise<{ created: boolean; prompt: PromptResponse }> {\n if (shouldCaptureInput()) {\n span.setInput(config);\n }\n\n const result = await this.target.upsert(handle, config);\n\n span.setType(\"prompt\");\n span.setAttributes({\n 'langwatch.prompt.handle': handle,\n 'langwatch.prompt.created': result.created.toString(),\n 'langwatch.prompt.id': result.prompt.id,\n 'langwatch.prompt.version.id': result.prompt.versionId,\n 'langwatch.prompt.version.number': result.prompt.version,\n });\n\n return result;\n }\n\n async sync(\n span: LangWatchSpan,\n params: any\n ): Promise<any> {\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.sync(params);\n\n span.setType(\"prompt\");\n span.setAttribute('langwatch.prompt.name', params.name);\n span.setAttribute('langwatch.prompt.sync.action', result.action);\n\n if (result.conflictInfo) {\n span.setAttributes({\n 'langwatch.prompt.sync.has_conflict': 'true',\n 'langwatch.prompt.sync.local_version': result.conflictInfo.localVersion.toString(),\n 'langwatch.prompt.sync.remote_version': result.conflictInfo.remoteVersion.toString(),\n });\n }\n\n return result;\n }\n}\n","import { getLangWatchTracer } from \"@/observability-sdk/tracer\";\nimport { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.prompts`, LANGWATCH_SDK_VERSION);\n","import type { paths, operations } from \"@/internal/generated/openapi/api-client\";\nimport { type PromptResponse, type TagDefinition, type CreatedTag } from \"./types\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\nimport { PromptServiceTracingDecorator, tracer } from \"./tracing\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type CreatePromptBody, type UpdatePromptBody } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"@/internal/api/client\";\nimport { PromptsApiError } from \"./errors\";\n\nexport type SyncAction = \"created\" | \"updated\" | \"conflict\" | \"up_to_date\";\n\nexport type AssignTagResult = NonNullable<\n operations[\"putApiPromptsByIdTagsByTag\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\nexport type ConfigData = NonNullable<\n paths[\"/api/prompts/{id}/sync\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"][\"configData\"];\n\nexport interface SyncResult {\n action: SyncAction;\n prompt?: PromptResponse;\n conflictInfo?: {\n localVersion: number;\n remoteVersion: number;\n differences: string[];\n remoteConfigData: ConfigData;\n };\n}\n\n/**\n * Service for managing prompt resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - CRUD operations for prompts\n * - Creating prompt versions\n * - Error handling with contextual information\n *\n * All methods return raw PromptResponse data from the API.\n */\nexport class PromptsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as PromptsApiService,\n tracer,\n PromptServiceTracingDecorator,\n );\n }\n\n /**\n * Handles API errors by throwing a PromptsApiError 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 {PromptsApiError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error != null\n ? typeof error.error === \"string\"\n ? error.error\n : error.error.message ??\n JSON.stringify(error.error, Object.getOwnPropertyNames(error.error))\n : error?.message ?? \"Unknown error occurred\";\n\n throw new PromptsApiError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Fetches all prompts from the API.\n * @returns Array of raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n async getAll(): Promise<PromptResponse[]> {\n const { data, error } =\n await this.apiClient.GET(\"/api/prompts\");\n if (error) this.handleApiError(\"fetch all prompts\", error);\n return data;\n }\n\n /**\n * Fetches a single prompt by its ID.\n * @param id The prompt's unique identifier.\n * @param options Optional parameters for the request.\n * @param options.version Specific version to fetch (numeric string or \"latest\").\n * @param options.tag Tag to fetch (e.g., \"production\", \"staging\", or a custom tag).\n * @returns Raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n get = async (id: string, options?: { version?: string; tag?: string }): Promise<PromptResponse> => {\n // Parse version to number, skip for \"latest\" or invalid values\n const versionNumber = options?.version && options.version !== \"latest\"\n ? parseInt(options.version, 10)\n : undefined;\n\n const { data, error } = await this.apiClient.GET(\n \"/api/prompts/{id}\",\n {\n params: {\n path: { id },\n query: {\n version: Number.isNaN(versionNumber) ? undefined : versionNumber,\n tag: options?.tag,\n },\n },\n },\n );\n\n if (error) {\n this.handleApiError(`fetch prompt with ID \"${id}\"`, error);\n }\n\n return data;\n }\n\n /**\n * Validates if a prompt exists.\n * @param id The prompt's unique identifier.\n * @returns True if prompt exists, false otherwise.\n * @throws {PromptsApiError} If the API call fails (not 404).\n */\n async exists(id: string): Promise<boolean> {\n try {\n await this.get(id);\n return true;\n } catch (error) {\n const originalError = error instanceof PromptsApiError ? error.originalError : null;\n const statusCode = originalError != null && typeof originalError === \"object\" && \"statusCode\" in originalError\n ? (originalError as { statusCode: unknown }).statusCode\n : null;\n\n if (statusCode === 404) {\n return false;\n }\n\n throw error;\n }\n }\n\n /**\n * Creates a new prompt.\n * @param params The prompt creation payload, matching the OpenAPI schema.\n * @returns Raw PromptResponse data of the created prompt.\n * @throws {PromptsApiError} If the API call fails.\n */\n async create(params: CreatePromptBody): Promise<PromptResponse> {\n const { data, error } = await this.apiClient.POST(\n \"/api/prompts\",\n {\n body: params,\n },\n );\n if (error) this.handleApiError(\"create prompt\", error);\n return data;\n }\n\n /**\n * Updates an existing prompt.\n * @param id The prompt's unique identifier.\n * @param params The update payload, matching the OpenAPI schema.\n * @returns Raw PromptResponse data of the updated prompt.\n * @throws {PromptsApiError} If the API call fails.\n */\n async update(id: string, params: UpdatePromptBody): Promise<PromptResponse> {\n const { error, data: updatedPrompt } =\n await this.apiClient.PUT(\"/api/prompts/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update prompt with ID \"${id}\"`, error);\n return updatedPrompt;\n }\n\n /**\n * Lists all prompt tags (built-in and custom) for the organization.\n * @returns Array of tag definitions.\n * @throws {PromptsApiError} If the API call fails.\n */\n async listTags(): Promise<TagDefinition[]> {\n const { data, error } = await this.apiClient.GET(\"/api/prompts/tags\");\n if (error) this.handleApiError(\"list tags\", error);\n return data;\n }\n\n /**\n * Creates a custom prompt tag for the organization.\n * @param params.name The tag name (must match /^[a-z][a-z0-9_-]*$/).\n * @returns The created tag.\n * @throws {PromptsApiError} If the API call fails.\n */\n async createTag({ name }: { name: string }): Promise<CreatedTag> {\n const { data, error } = await this.apiClient.POST(\"/api/prompts/tags\", {\n body: { name },\n });\n if (error) this.handleApiError(\"create tag\", error);\n return data;\n }\n\n /**\n * Deletes a custom prompt tag by name.\n * @param tagName The tag name to delete.\n * @throws {PromptsApiError} If the API call fails.\n */\n async deleteTag(tagName: string): Promise<void> {\n const { error } = await this.apiClient.DELETE(\n \"/api/prompts/tags/{tag}\" as any,\n { params: { path: { tag: tagName } } } as any,\n );\n if (error) this.handleApiError(`delete tag \"${tagName}\"`, error);\n }\n\n /**\n * Renames an existing prompt tag.\n * @param tag The current tag name.\n * @param name The new tag name.\n * @throws {PromptsApiError} If the API call fails.\n */\n async renameTag({ tag, name }: { tag: string; name: string }): Promise<void> {\n const { error } = await this.apiClient.PUT(\n \"/api/prompts/tags/{tag}\",\n { params: { path: { tag } }, body: { name } },\n );\n if (error) this.handleApiError(`rename tag \"${tag}\"`, error);\n }\n\n async assignTag({\n id,\n tag,\n versionId,\n }: {\n id: string;\n tag: string;\n versionId: string;\n }): Promise<AssignTagResult> {\n const { data, error } = await this.apiClient.PUT(\n \"/api/prompts/{id}/tags/{tag}\",\n {\n params: { path: { id, tag } },\n body: { versionId },\n },\n );\n if (error) this.handleApiError(`assign tag \"${tag}\" to prompt \"${id}\"`, error);\n return data;\n }\n\n /**\n * Deletes a prompt by its ID.\n * @param id The prompt's unique identifier.\n * @throws {PromptsApiError} If the API call fails.\n */\n async delete(id: string): Promise<{ success: boolean }> {\n const { data, error } = await this.apiClient.DELETE(\n \"/api/prompts/{id}\",\n {\n params: { path: { id } },\n },\n );\n if (error) this.handleApiError(`delete prompt with ID \"${id}\"`, error);\n\n return data;\n }\n\n /**\n * Fetches all versions for a given prompt.\n * @param id The prompt's unique identifier.\n * @returns Array of raw PromptResponse data for each version.\n * @throws {PromptsApiError} If the API call fails.\n */\n async getVersions(id: string): Promise<PromptResponse[]> {\n const { data, error } = await this.apiClient.GET(\n \"/api/prompts/{id}/versions\",\n {\n params: { path: { id } },\n },\n );\n if (error)\n this.handleApiError(`fetch versions for prompt with ID \"${id}\"`, error);\n\n return data;\n }\n\n /**\n * Upserts a prompt with local configuration - creates if doesn't exist, updates version if exists.\n * @param handle The prompt's handle/identifier.\n * @param config Local prompt configuration.\n * @returns Object with created flag and raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n async upsert(\n handle: string,\n config: {\n model: string;\n modelParameters?: {\n temperature?: number;\n max_tokens?: number;\n };\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n },\n ): Promise<{ created: boolean; prompt: PromptResponse }> {\n const payload = {\n handle,\n model: config.model,\n prompt: PromptConverter.extractSystemPrompt(config.messages),\n messages: PromptConverter.filterNonSystemMessages(config.messages),\n temperature: config.modelParameters?.temperature,\n maxTokens: config.modelParameters?.max_tokens,\n inputs: [{ identifier: \"input\", type: \"str\" as const }],\n outputs: [{ identifier: \"output\", type: \"str\" as const }],\n commitMessage: `Updated via CLI sync`,\n schemaVersion: \"1.0\" as const,\n };\n\n // Creating a prompt with the same handle will fail, so we try to update instead\n try {\n const prompt = await this.create(payload);\n return {\n created: true,\n prompt,\n };\n } catch {\n const prompt = await this.update(handle, payload);\n\n return {\n created: false,\n prompt,\n };\n }\n }\n\n /**\n * Sync a prompt with local content, handling conflicts and version management\n * You probably don't need to use this method directly.\n */\n async sync(params: {\n name: string;\n configData: ConfigData;\n localVersion?: number;\n commitMessage?: string;\n }): Promise<SyncResult> {\n try {\n const response = await this.apiClient.POST(\n \"/api/prompts/{id}/sync\",\n {\n params: { path: { id: params.name } },\n body: {\n configData: params.configData,\n localVersion: params.localVersion,\n commitMessage: params.commitMessage,\n },\n },\n );\n\n if (response.error) {\n const errorMessage =\n response.error?.error ?? JSON.stringify(response.error);\n throw new Error(`Failed to sync prompt: ${errorMessage}`);\n }\n\n return {\n action: response.data.action as SyncAction,\n prompt: response.data.prompt,\n conflictInfo: response.data.conflictInfo,\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error occurred\";\n throw new PromptsApiError(message, \"sync\", error);\n }\n }\n}\n","import { type z } from \"zod\";\nimport type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n type corePromptDataSchema,\n type promptMetadataSchema,\n type promptDataSchema\n} from \"./schema\";\n\n/**\n * Type for template variables - supporting common data types\n */\nexport type TemplateVariables = Record<\n string,\n string | number | boolean | object | null\n>;\n\n/**\n * Core data needed for prompt functionality\n */\nexport type CorePromptData = z.infer<typeof corePromptDataSchema>;\n\n/**\n * Optional metadata for identification and tracing\n */\nexport type PromptMetadata = z.infer<typeof promptMetadataSchema>;\n\n/**\n * Combined type for creating prompts\n */\nexport type PromptData = z.infer<typeof promptDataSchema>;\n\n// Extract API types from OpenAPI schema for backwards compatibility\nexport type CreatePromptBody = NonNullable<\n paths[\"/api/prompts\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdatePromptBody = NonNullable<\n paths[\"/api/prompts/{id}\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type PromptResponse = NonNullable<\n paths[\"/api/prompts/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n// Extract the PromptScope type from the API client\nexport type PromptScope = paths[\"/api/prompts\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"scope\"];\n\n// Extract tag definition types from the OpenAPI schema\nexport type TagDefinition = NonNullable<\n paths[\"/api/prompts/tags\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreatedTag = NonNullable<\n paths[\"/api/prompts/tags\"][\"post\"][\"responses\"][\"201\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Fetch policy for prompt retrieval.\n * Controls how prompts are fetched and cached.\n */\nexport enum FetchPolicy {\n /** Use local file if available, otherwise fetch from API (default) */\n MATERIALIZED_FIRST = \"MATERIALIZED_FIRST\",\n /** Always try API first, fall back to materialized */\n ALWAYS_FETCH = \"ALWAYS_FETCH\",\n /** Fetch every X minutes, use materialized between fetches */\n CACHE_TTL = \"CACHE_TTL\",\n /** Never fetch, use materialized files only */\n MATERIALIZED_ONLY = \"MATERIALIZED_ONLY\",\n}\n\n","import { Liquid } from \"liquidjs\";\nimport { PromptTracingDecorator, tracer } from \"./tracing\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { promptDataSchema } from \"./schema\";\nimport { type TemplateVariables, type PromptData, type CorePromptData, type PromptScope } from \"./types\";\nimport { PromptCompilationError, PromptValidationError } from \"./errors\";\n\n// Re-export types and errors for convenience\nexport type { TemplateVariables, PromptData, CorePromptData, PromptMetadata } from \"./types\";\nexport { PromptCompilationError, PromptValidationError } from \"./errors\";\n\n// Global Liquid instance - shared across all prompts for efficiency\nconst liquid = new Liquid({\n strictFilters: true,\n});\n\n/**\n * The Prompt class provides a standardized interface for working with prompt objects\n * within the SDK, focusing on core functionality needed for template compilation and execution.\n * Keeps only essential fields while maintaining compatibility with tracing and observability.\n */\nexport class Prompt {\n // === Core functionality (required) ===\n public readonly model!: string;\n public readonly messages!: Array<{\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n }>;\n\n // === Optional core fields ===\n public readonly prompt?: string;\n public readonly temperature?: number;\n public readonly maxTokens?: number;\n public readonly responseFormat?: CorePromptData[\"responseFormat\"];\n\n // === Optional identification (for tracing) ===\n public readonly id?: string;\n public readonly handle?: string | null;\n public readonly version?: number;\n public readonly versionId?: string;\n public readonly scope?: PromptScope;\n\n constructor(data: PromptData) {\n // Validate input using Zod\n const validationResult = promptDataSchema.strip().safeParse(data);\n\n if (!validationResult.success) {\n throw new PromptValidationError(\n \"Invalid prompt data provided\",\n validationResult.error\n );\n }\n\n // Assign validated data\n Object.assign(this, validationResult.data);\n\n // Set default for prompt if not provided\n this.prompt ??= this.extractSystemPrompt();\n\n // Return a proxy that wraps specific methods for tracing\n return createTracingProxy(this as Prompt, tracer, PromptTracingDecorator);\n }\n\n private extractSystemPrompt(): string {\n return this.messages.find(m => m.role === \"system\")?.content ?? \"\";\n }\n\n /**\n * Compile the prompt template with provided variables (lenient - missing variables become empty)\n * @param variables - Object containing variable values for template compilation\n * @returns CompiledPrompt instance with compiled content\n */\n private _compile(\n variables: TemplateVariables,\n strict: boolean,\n ): CompiledPrompt {\n try {\n // Compile main prompt\n const compiledPrompt = this.prompt\n ? liquid.parseAndRenderSync(this.prompt, variables, {\n strictVariables: strict,\n })\n : \"\";\n\n // Compile messages\n const compiledMessages = (this.messages || []).map((message) => ({\n ...message,\n content: message.content\n ? liquid.parseAndRenderSync(message.content, variables, {\n strictVariables: strict,\n })\n : message.content,\n }));\n\n // Create new prompt data with compiled content\n const compiledData: PromptData = {\n ...this,\n prompt: compiledPrompt,\n messages: compiledMessages,\n };\n\n return new CompiledPrompt(compiledData, this);\n } catch (error) {\n const templateStr = this.prompt ?? JSON.stringify(this.messages);\n throw new PromptCompilationError(\n `Failed to compile prompt template: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n templateStr,\n error,\n );\n }\n }\n\n compile(variables: TemplateVariables = {}): CompiledPrompt {\n return this._compile(variables, false);\n }\n\n /**\n * Compile with validation - throws error if required variables are missing\n * @param variables - Template variables\n * @returns CompiledPrompt instance with compiled content\n */\n compileStrict(variables: TemplateVariables): CompiledPrompt {\n return this._compile(variables, true);\n }\n}\n\n\n/**\n * Represents a compiled prompt that extends Prompt with reference to the original template\n */\nexport class CompiledPrompt extends Prompt {\n constructor(\n compiledData: PromptData,\n public readonly original: Prompt,\n ) {\n super(compiledData);\n }\n}\n","// TODO: Move these to their own files\nimport { z } from \"zod\";\nimport { PromptScope } from \"../constants\";\n\n/**\n * Zod schema for message objects in prompts\n */\nexport const messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\", \"system\"]),\n content: z.string(),\n});\n\n/**\n * Zod schema for response format configuration\n */\nexport const responseFormatSchema = z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n schema: z.record(z.string(), z.unknown()),\n }).nullable(),\n}).optional();\n\n/**\n * Zod schema for core prompt data - the essential fields needed for functionality\n */\nexport const corePromptDataSchema = z.object({\n model: z.string().min(1, \"Model cannot be empty\"),\n messages: z.array(messageSchema).min(1, \"At least one message is required\"),\n prompt: z.string().optional(),\n temperature: z.number().min(0).max(2).optional(),\n maxTokens: z.number().positive().optional(),\n responseFormat: responseFormatSchema,\n});\n\n/**\n * Zod schema for prompt metadata - optional fields for identification and tracing\n */\nexport const promptMetadataSchema = z.object({\n id: z.string().optional(),\n handle: z.string().nullable().optional(),\n version: z.number().min(0).optional(),\n versionId: z.string().optional(),\n scope: z.enum(PromptScope).optional(),\n});\n\n/**\n * Combined schema for complete prompt data\n */\nexport const promptDataSchema = z.object({\n ...corePromptDataSchema.shape,\n ...promptMetadataSchema.shape,\n});\n","import { type PromptScope as PromptScopeType } from \"./types\";\n\nexport const PromptScope = {\n ORGANIZATION: \"ORGANIZATION\" as const,\n PROJECT: \"PROJECT\" as const,\n} satisfies Record<string, PromptScopeType>;\n","import type { LocalPromptConfig, PromptDependency } from \"@/cli/types\";\nimport { FileManager } from \"@/cli/utils/fileManager\";\nimport { type Logger, NoOpLogger } from \"@/logger\";\nimport { type PromptData } from \"./types\";\nimport { PromptFileNotFoundError } from \"@/cli/utils/errors/prompt-not-found.error\";\n\nexport interface LocalPromptsServiceConfig {\n fileManager?: typeof FileManager;\n logger?: Logger;\n}\n\n/**\n * Service for retrieving prompts from local filesystem sources.\n *\n * Searches for prompts in the following priority order:\n * 1. Explicit file mapping in prompts.json config\n * 2. Materialized path from prompts-lock.json\n * 3. Direct file scanning in prompts directory\n */\nexport class LocalPromptsService {\n private readonly fileManager: typeof FileManager;\n private readonly logger: Logger;\n\n constructor(config?: LocalPromptsServiceConfig) {\n this.fileManager = config?.fileManager ?? FileManager;\n this.logger = config?.logger ?? new NoOpLogger();\n }\n\n /**\n * Retrieves a prompt using the configured search strategy.\n * Tries each source in priority order until found or all sources exhausted.\n */\n async get(handleOrId: string): Promise<PromptData | null> {\n try {\n const dependency = await this.getDependencyFromConfig(handleOrId);\n\n // If no dependency is found, it means it's not a local prompt\n if (!dependency) {\n return null;\n }\n\n // Try each source in priority order until found or all sources exhausted\n // We catch errors and return null if any of the sources fail so we\n // can continue to the next source and return null if all sources fail\n const localPromptConfig = (\n (await this.getFromConfig(dependency).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n })) ??\n (await this.getFromLockFile(handleOrId).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n })) ??\n (await this.getFromLocalFiles(handleOrId).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n }))\n );\n\n return localPromptConfig ? this.convertToPromptData({\n ...localPromptConfig,\n handle: handleOrId,\n }) : null;\n } catch (error) {\n this.logger.warn(`Failed to get prompt \"${handleOrId}\": ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n\n /**\n * Searches for prompt using explicit file mapping in prompts.json.\n * Looks for dependencies with a 'file' property pointing to a specific path.\n */\n private async getFromConfig(dependency: PromptDependency): Promise<LocalPromptConfig | null> {\n if (typeof dependency === 'string' && dependency.startsWith('file:')) {\n return this.fileManager.loadLocalPrompt(dependency.slice(5));\n }\n\n return null;\n }\n\n /**\n * Searches for prompt using materialized path from lock file.\n * Lock file contains resolved paths for prompts that have been synced/materialized.\n */\n private async getFromLockFile(handleOrId: string): Promise<LocalPromptConfig | null> {\n const lock = this.fileManager.loadPromptsLock();\n const lockEntry = lock.prompts[handleOrId];\n\n if (lockEntry?.materialized) {\n return this.fileManager.loadLocalPrompt(lockEntry.materialized);\n }\n\n return null;\n }\n\n /**\n * Searches for prompt by scanning all .prompt.yaml files in prompts directory.\n * Extracts prompt name from file path and matches against the requested handle.\n * This is the fallback method when explicit mappings don't exist.\n */\n private async getFromLocalFiles(handleOrId: string): Promise<LocalPromptConfig | null> {\n const localFiles = this.fileManager.getLocalPromptFiles();\n\n for (const filePath of localFiles) {\n const promptName = this.fileManager.promptNameFromPath(filePath);\n if (promptName === handleOrId) {\n return this.fileManager.loadLocalPrompt(filePath);\n }\n }\n\n return null;\n }\n\n /**\n * Get dependency from config\n */\n private async getDependencyFromConfig(handleOrId: string): Promise<PromptDependency | null> {\n const config = this.fileManager.loadPromptsConfig();\n const dependency = config.prompts[handleOrId];\n\n return dependency ?? null;\n }\n\n /**\n * Converts LocalPromptConfig to PromptData format\n */\n private convertToPromptData(config: LocalPromptConfig & { handle: string; }): PromptData {\n const { modelParameters, ...rest } = config;\n return {\n maxTokens: modelParameters?.max_tokens,\n temperature: modelParameters?.temperature,\n ...rest,\n };\n }\n}\n","import { PromptsApiService, type AssignTagResult } from \"./prompts-api.service\";\nimport { Prompt } from \"./prompt\";\nimport type { CreatePromptBody, UpdatePromptBody, PromptData, TagDefinition, CreatedTag } from \"./types\";\nimport { FetchPolicy } from \"./types\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { LocalPromptsService } from \"./local-prompts.service\";\nimport { PromptsError } from \"./errors\";\n\n/**\n * Options for fetching a prompt.\n */\nexport interface GetPromptOptions {\n /** Specific version to fetch */\n version?: string;\n /** Tag to fetch (e.g., \"production\", \"staging\", or a custom tag) */\n tag?: string;\n /** Fetch policy to use */\n fetchPolicy?: FetchPolicy;\n /** Cache TTL in minutes (only used with CACHE_TTL policy) */\n cacheTtlMinutes?: number;\n}\n\ninterface CacheEntry {\n data: PromptData;\n timestamp: number;\n}\n\ninterface PromptsFacadeDependencies {\n promptsApiService: PromptsApiService;\n localPromptsService: LocalPromptsService;\n}\n\n/**\n * Facade for prompt operations in the LangWatch SDK.\n * Provides a simplified interface for common prompt management tasks.\n */\nexport class PromptsFacade implements Pick<PromptsApiService, \"sync\" | \"delete\">{\n private readonly promptsApiService: PromptsApiService;\n private readonly localPromptsService: LocalPromptsService;\n private readonly cache = new Map<string, CacheEntry>();\n readonly tags: {\n assign(id: string, params: { tag: string; versionId: string }): Promise<AssignTagResult>;\n list(): Promise<TagDefinition[]>;\n create(params: { name: string }): Promise<CreatedTag>;\n delete(tagName: string): Promise<void>;\n rename(oldName: string, newName: string): Promise<void>;\n };\n\n constructor(config: InternalConfig & PromptsFacadeDependencies) {\n this.promptsApiService = config.promptsApiService ?? new PromptsApiService(config);\n this.localPromptsService = config.localPromptsService ?? new LocalPromptsService();\n this.tags = {\n assign: (id, { tag, versionId }) =>\n this.promptsApiService.assignTag({ id, tag, versionId }),\n list: () => this.promptsApiService.listTags(),\n create: ({ name }) => this.promptsApiService.createTag({ name }),\n delete: (tagName) => this.promptsApiService.deleteTag(tagName),\n rename: (oldName, newName) =>\n this.promptsApiService.renameTag({ tag: oldName, name: newName }),\n };\n }\n\n /**\n * Creates a new prompt.\n * @param data The prompt creation payload.\n * @returns The created Prompt instance.\n * @throws {PromptsError} If the API call fails.\n */\n async create(data: CreatePromptBody): Promise<Prompt> {\n const serverPrompt = await this.promptsApiService.create(data);\n return new Prompt(serverPrompt);\n }\n\n /**\n * Retrieves a prompt by handle or ID.\n *\n * Supports shorthand `handle:tag` syntax — e.g. `get(\"pizza-prompt:production\")`.\n * Shorthand is parsed server-side; the SDK passes the string through as-is.\n *\n * @param handleOrId The prompt's handle, unique identifier, or `handle:tag` shorthand.\n * @param options Optional parameters for the request.\n * @returns The Prompt instance.\n * @throws {PromptsError} If the prompt is not found or the API call fails.\n */\n async get(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const fetchPolicy = options?.fetchPolicy ?? FetchPolicy.MATERIALIZED_FIRST;\n\n switch (fetchPolicy) {\n case FetchPolicy.MATERIALIZED_ONLY:\n return this.getMaterializedOnly(handleOrId);\n\n case FetchPolicy.ALWAYS_FETCH:\n return this.getAlwaysFetch(handleOrId, options);\n\n case FetchPolicy.CACHE_TTL:\n return this.getCacheTtl(handleOrId, options);\n\n case FetchPolicy.MATERIALIZED_FIRST:\n default:\n return this.getMaterializedFirst(handleOrId, options);\n }\n }\n\n private async getMaterializedFirst(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n return new Prompt(serverPrompt);\n }\n\n private async getAlwaysFetch(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n try {\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n return new Prompt(serverPrompt);\n } catch {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found locally or on server`);\n }\n }\n\n private async getMaterializedOnly(handleOrId: string): Promise<Prompt> {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found in materialized files`);\n }\n\n private buildCacheKey(handleOrId: string, options?: GetPromptOptions): string {\n const tagSegment = options?.tag != null ? `::tag:${options.tag}` : '';\n return `${handleOrId}::version:${options?.version ?? ''}${tagSegment}`;\n }\n\n private async getCacheTtl(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const cacheKey = this.buildCacheKey(handleOrId, options);\n const ttlMs = (options?.cacheTtlMinutes ?? 5) * 60 * 1000;\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && now - cached.timestamp < ttlMs) {\n return new Prompt(cached.data);\n }\n\n try {\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n this.cache.set(cacheKey, { data: serverPrompt, timestamp: now });\n return new Prompt(serverPrompt);\n } catch {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found locally or on server`);\n }\n }\n\n /**\n * Retrieves all prompts.\n * @returns Array of Prompt instances.\n * @throws {PromptsError} If the API call fails.\n */\n async getAll(): Promise<Prompt[]> {\n const serverPrompts = await this.promptsApiService.getAll();\n return serverPrompts.map((prompt) => new Prompt(prompt));\n }\n\n /**\n * Updates an existing prompt.\n * @param handleOrId The prompt's handle or unique identifier.\n * @param newData The update payload.\n * @returns The updated Prompt instance.\n * @throws {PromptsError} If the API call fails.\n */\n async update(handleOrId: string, newData: UpdatePromptBody): Promise<Prompt> {\n const serverPrompt = await this.promptsApiService.update(handleOrId, newData);\n return new Prompt(serverPrompt);\n }\n\n get delete() {\n return this.promptsApiService.delete.bind(this.promptsApiService);\n }\n\n /**\n * Delegated method to the prompts API service.\n */\n get sync() {\n return this.promptsApiService.sync.bind(this.promptsApiService);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AK4YCKWK.js","../src/client-sdk/services/prompts/errors/prompts.error.ts","../src/client-sdk/services/prompts/errors/prompt-compilation.error.ts","../src/client-sdk/services/prompts/errors/prompt-validation.error.ts","../src/client-sdk/services/prompts/errors/prompts-api.error.ts","../src/client-sdk/services/prompts/tracing/prompt-tracing.decorator.ts","../src/client-sdk/services/prompts/tracing/prompt-service-tracing.decorator.ts","../src/client-sdk/services/prompts/tracing/tracer.ts","../src/client-sdk/services/prompts/prompts-api.service.ts","../src/client-sdk/services/prompts/types.ts","../src/client-sdk/services/prompts/prompt.ts","../src/client-sdk/services/prompts/schema/prompt.schema.ts","../src/client-sdk/services/prompts/constants.ts","../src/client-sdk/services/prompts/local-prompts.service.ts","../src/client-sdk/services/prompts/prompts.facade.ts"],"names":["FetchPolicy"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AK4YCKWK.js","sourcesContent":[null,"/**\n * Base error class for the Prompts domain.\n * All prompt-related errors should extend this class.\n */\nexport class PromptsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PromptsError\";\n }\n}\n","/**\n * Error class for template compilation issues\n */\nexport class PromptCompilationError extends Error {\n constructor(\n message: string,\n public readonly template: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"PromptCompilationError\";\n }\n}\n","import { type z } from \"zod\";\n\n/**\n * Error class for prompt validation issues\n */\nexport class PromptValidationError extends Error {\n constructor(message: string, public readonly validationErrors: z.ZodError) {\n super(message);\n this.name = \"PromptValidationError\";\n }\n}\n","import { PromptsError } from \"./prompts.error\";\n\n/**\n * Error class for Prompts API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class PromptsApiError extends PromptsError {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"PromptsApiError\";\n }\n}\n","import { type Prompt, type TemplateVariables, type CompiledPrompt } from \"../prompt\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"@/observability-sdk\";\nimport type { LangWatchSpan } from \"@/observability-sdk\";\n\n/**\n * Class that decorates the target prompt,\n * adding tracing to specific methods.\n */\nexport class PromptTracingDecorator {\n constructor(private readonly target: Prompt) {}\n\n private traceCompilation(\n span: LangWatchSpan,\n variables: TemplateVariables,\n compileFn: () => CompiledPrompt\n ): CompiledPrompt {\n span.setType(\"prompt\");\n\n if (shouldCaptureInput()) {\n span.setInput(this.target);\n\n if (variables) {\n span.setAttribute(\n 'langwatch.prompt.variables',\n JSON.stringify({\n type: \"json\",\n value: variables,\n }),\n );\n }\n }\n\n const result = compileFn();\n\n // Only emit combined handle:version format when both are available\n if (result.handle != null && result.version != null) {\n span.setAttribute(\n 'langwatch.prompt.id',\n `${result.handle}:${result.version}`,\n );\n }\n\n if (shouldCaptureOutput()) {\n span.setOutput({\n ...result,\n raw: void 0, // TODO(afr): Figure out a better way to do this.\n });\n }\n\n return result;\n }\n\n compile(span: LangWatchSpan, variables: TemplateVariables = {}): CompiledPrompt {\n return this.traceCompilation(\n span,\n variables,\n () => this.target.compile(variables),\n );\n }\n\n compileStrict(span: LangWatchSpan, variables: TemplateVariables): CompiledPrompt {\n return this.traceCompilation(\n span,\n variables,\n () => this.target.compileStrict(variables),\n );\n }\n}\n","import { type PromptsApiService } from \"../prompts-api.service\";\nimport type { LangWatchSpan } from \"@/observability-sdk\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"@/observability-sdk\";\nimport type { CreatePromptBody, UpdatePromptBody, PromptResponse } from \"../types\";\n\n/**\n * Class that decorates the target prompt service,\n * adding tracing to key methods.\n */\nexport class PromptServiceTracingDecorator {\n constructor(private readonly target: PromptsApiService) {}\n\n async get(\n span: LangWatchSpan,\n id: string,\n options?: { version?: string }\n ): Promise<PromptResponse> {\n span.setType(\"prompt\");\n\n const result = await this.target.get(id, options);\n\n if (result) {\n // Only emit combined format when both handle and version are available\n if (result.handle != null && result.version != null) {\n span.setAttribute(\n 'langwatch.prompt.id',\n `${result.handle}:${result.version}`,\n );\n }\n }\n\n if (result && shouldCaptureOutput()) {\n span.setOutput(\"json\", result);\n }\n\n return result;\n }\n\n async create(\n span: LangWatchSpan,\n params: CreatePromptBody\n ): Promise<PromptResponse> {\n span.setType(\"prompt\");\n\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.create(params);\n\n span.setAttributes({\n 'langwatch.prompt.id': result.id,\n 'langwatch.prompt.handle': result.handle ?? undefined,\n 'langwatch.prompt.scope': result.scope,\n 'langwatch.prompt.version.id': result.versionId,\n 'langwatch.prompt.version.number': result.version,\n });\n\n return result;\n }\n\n async update(\n span: LangWatchSpan,\n id: string,\n params: UpdatePromptBody\n ): Promise<PromptResponse> {\n\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.update(id, params);\n\n span.setType(\"prompt\");\n span.setAttributes({\n 'langwatch.prompt.id': id,\n 'langwatch.prompt.handle': result.handle ?? undefined,\n 'langwatch.prompt.scope': result.scope,\n 'langwatch.prompt.version.id': result.versionId,\n 'langwatch.prompt.version.number': result.version,\n });\n\n return result;\n }\n\n async delete(\n span: LangWatchSpan,\n id: string\n ): Promise<{ success: boolean }> {\n const result = await this.target.delete(id);\n\n span.setType(\"prompt\");\n span.setAttribute('langwatch.prompt.id', id);\n span.setAttribute('langwatch.prompt.deleted', 'true');\n\n return result;\n }\n\n async upsert(\n span: LangWatchSpan,\n handle: string,\n config: any\n ): Promise<{ created: boolean; prompt: PromptResponse }> {\n if (shouldCaptureInput()) {\n span.setInput(config);\n }\n\n const result = await this.target.upsert(handle, config);\n\n span.setType(\"prompt\");\n span.setAttributes({\n 'langwatch.prompt.handle': handle,\n 'langwatch.prompt.created': result.created.toString(),\n 'langwatch.prompt.id': result.prompt.id,\n 'langwatch.prompt.version.id': result.prompt.versionId,\n 'langwatch.prompt.version.number': result.prompt.version,\n });\n\n return result;\n }\n\n async sync(\n span: LangWatchSpan,\n params: any\n ): Promise<any> {\n if (shouldCaptureInput()) {\n span.setInput(params);\n }\n\n const result = await this.target.sync(params);\n\n span.setType(\"prompt\");\n span.setAttribute('langwatch.prompt.name', params.name);\n span.setAttribute('langwatch.prompt.sync.action', result.action);\n\n if (result.conflictInfo) {\n span.setAttributes({\n 'langwatch.prompt.sync.has_conflict': 'true',\n 'langwatch.prompt.sync.local_version': result.conflictInfo.localVersion.toString(),\n 'langwatch.prompt.sync.remote_version': result.conflictInfo.remoteVersion.toString(),\n });\n }\n\n return result;\n }\n}\n","import { getLangWatchTracer } from \"@/observability-sdk/tracer\";\nimport { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.prompts`, LANGWATCH_SDK_VERSION);\n","import type { paths, operations } from \"@/internal/generated/openapi/api-client\";\nimport { type PromptResponse, type TagDefinition, type CreatedTag } from \"./types\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\nimport { PromptServiceTracingDecorator, tracer } from \"./tracing\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type CreatePromptBody, type UpdatePromptBody } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"@/internal/api/client\";\nimport { PromptsApiError } from \"./errors\";\n\nexport type SyncAction = \"created\" | \"updated\" | \"conflict\" | \"up_to_date\";\n\nexport type AssignTagResult = NonNullable<\n operations[\"putApiPromptsByIdTagsByTag\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\nexport type ConfigData = NonNullable<\n paths[\"/api/prompts/{id}/sync\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"][\"configData\"];\n\nexport interface SyncResult {\n action: SyncAction;\n prompt?: PromptResponse;\n conflictInfo?: {\n localVersion: number;\n remoteVersion: number;\n differences: string[];\n remoteConfigData: ConfigData;\n };\n}\n\n/**\n * Service for managing prompt resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - CRUD operations for prompts\n * - Creating prompt versions\n * - Error handling with contextual information\n *\n * All methods return raw PromptResponse data from the API.\n */\nexport class PromptsApiService {\n private readonly apiClient: LangwatchApiClient;\n\n constructor(config?: Pick<InternalConfig, \"langwatchApiClient\">) {\n this.apiClient = config?.langwatchApiClient ?? createLangWatchApiClient();\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as PromptsApiService,\n tracer,\n PromptServiceTracingDecorator,\n );\n }\n\n /**\n * Handles API errors by throwing a PromptsApiError 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 {PromptsApiError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error != null\n ? typeof error.error === \"string\"\n ? error.error\n : error.error.message ??\n JSON.stringify(error.error, Object.getOwnPropertyNames(error.error))\n : error?.message ?? \"Unknown error occurred\";\n\n throw new PromptsApiError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Fetches all prompts from the API.\n * @returns Array of raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n async getAll(): Promise<PromptResponse[]> {\n const { data, error } =\n await this.apiClient.GET(\"/api/prompts\");\n if (error) this.handleApiError(\"fetch all prompts\", error);\n return data;\n }\n\n /**\n * Fetches a single prompt by its ID.\n * @param id The prompt's unique identifier.\n * @param options Optional parameters for the request.\n * @param options.version Specific version to fetch (numeric string or \"latest\").\n * @param options.tag Tag to fetch (e.g., \"production\", \"staging\", or a custom tag).\n * @returns Raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n get = async (id: string, options?: { version?: string; tag?: string }): Promise<PromptResponse> => {\n // Parse version to number, skip for \"latest\" or invalid values\n const versionNumber = options?.version && options.version !== \"latest\"\n ? parseInt(options.version, 10)\n : undefined;\n\n const { data, error } = await this.apiClient.GET(\n \"/api/prompts/{id}\",\n {\n params: {\n path: { id },\n query: {\n version: Number.isNaN(versionNumber) ? undefined : versionNumber,\n tag: options?.tag,\n },\n },\n },\n );\n\n if (error) {\n this.handleApiError(`fetch prompt with ID \"${id}\"`, error);\n }\n\n return data;\n }\n\n /**\n * Validates if a prompt exists.\n * @param id The prompt's unique identifier.\n * @returns True if prompt exists, false otherwise.\n * @throws {PromptsApiError} If the API call fails (not 404).\n */\n async exists(id: string): Promise<boolean> {\n try {\n await this.get(id);\n return true;\n } catch (error) {\n const originalError = error instanceof PromptsApiError ? error.originalError : null;\n const statusCode = originalError != null && typeof originalError === \"object\" && \"statusCode\" in originalError\n ? (originalError as { statusCode: unknown }).statusCode\n : null;\n\n if (statusCode === 404) {\n return false;\n }\n\n throw error;\n }\n }\n\n /**\n * Creates a new prompt.\n * @param params The prompt creation payload, matching the OpenAPI schema.\n * @returns Raw PromptResponse data of the created prompt.\n * @throws {PromptsApiError} If the API call fails.\n */\n async create(params: CreatePromptBody): Promise<PromptResponse> {\n const { data, error } = await this.apiClient.POST(\n \"/api/prompts\",\n {\n body: params,\n },\n );\n if (error) this.handleApiError(\"create prompt\", error);\n return data;\n }\n\n /**\n * Updates an existing prompt.\n * @param id The prompt's unique identifier.\n * @param params The update payload, matching the OpenAPI schema.\n * @returns Raw PromptResponse data of the updated prompt.\n * @throws {PromptsApiError} If the API call fails.\n */\n async update(id: string, params: UpdatePromptBody): Promise<PromptResponse> {\n const { error, data: updatedPrompt } =\n await this.apiClient.PUT(\"/api/prompts/{id}\", {\n params: { path: { id } },\n body: params,\n });\n if (error) this.handleApiError(`update prompt with ID \"${id}\"`, error);\n return updatedPrompt;\n }\n\n /**\n * Lists all prompt tags (built-in and custom) for the organization.\n * @returns Array of tag definitions.\n * @throws {PromptsApiError} If the API call fails.\n */\n async listTags(): Promise<TagDefinition[]> {\n const { data, error } = await this.apiClient.GET(\"/api/prompts/tags\");\n if (error) this.handleApiError(\"list tags\", error);\n return data;\n }\n\n /**\n * Creates a custom prompt tag for the organization.\n * @param params.name The tag name (must match /^[a-z][a-z0-9_-]*$/).\n * @returns The created tag.\n * @throws {PromptsApiError} If the API call fails.\n */\n async createTag({ name }: { name: string }): Promise<CreatedTag> {\n const { data, error } = await this.apiClient.POST(\"/api/prompts/tags\", {\n body: { name },\n });\n if (error) this.handleApiError(\"create tag\", error);\n return data;\n }\n\n /**\n * Deletes a custom prompt tag by name.\n * @param tagName The tag name to delete.\n * @throws {PromptsApiError} If the API call fails.\n */\n async deleteTag(tagName: string): Promise<void> {\n const { error } = await this.apiClient.DELETE(\n \"/api/prompts/tags/{tag}\" as any,\n { params: { path: { tag: tagName } } } as any,\n );\n if (error) this.handleApiError(`delete tag \"${tagName}\"`, error);\n }\n\n /**\n * Renames an existing prompt tag.\n * @param tag The current tag name.\n * @param name The new tag name.\n * @throws {PromptsApiError} If the API call fails.\n */\n async renameTag({ tag, name }: { tag: string; name: string }): Promise<void> {\n const { error } = await this.apiClient.PUT(\n \"/api/prompts/tags/{tag}\",\n { params: { path: { tag } }, body: { name } },\n );\n if (error) this.handleApiError(`rename tag \"${tag}\"`, error);\n }\n\n async assignTag({\n id,\n tag,\n versionId,\n }: {\n id: string;\n tag: string;\n versionId: string;\n }): Promise<AssignTagResult> {\n const { data, error } = await this.apiClient.PUT(\n \"/api/prompts/{id}/tags/{tag}\",\n {\n params: { path: { id, tag } },\n body: { versionId },\n },\n );\n if (error) this.handleApiError(`assign tag \"${tag}\" to prompt \"${id}\"`, error);\n return data;\n }\n\n /**\n * Deletes a prompt by its ID.\n * @param id The prompt's unique identifier.\n * @throws {PromptsApiError} If the API call fails.\n */\n async delete(id: string): Promise<{ success: boolean }> {\n const { data, error } = await this.apiClient.DELETE(\n \"/api/prompts/{id}\",\n {\n params: { path: { id } },\n },\n );\n if (error) this.handleApiError(`delete prompt with ID \"${id}\"`, error);\n\n return data;\n }\n\n /**\n * Fetches all versions for a given prompt.\n * @param id The prompt's unique identifier.\n * @returns Array of raw PromptResponse data for each version.\n * @throws {PromptsApiError} If the API call fails.\n */\n async getVersions(id: string): Promise<PromptResponse[]> {\n const { data, error } = await this.apiClient.GET(\n \"/api/prompts/{id}/versions\",\n {\n params: { path: { id } },\n },\n );\n if (error)\n this.handleApiError(`fetch versions for prompt with ID \"${id}\"`, error);\n\n return data;\n }\n\n /**\n * Upserts a prompt with local configuration - creates if doesn't exist, updates version if exists.\n * @param handle The prompt's handle/identifier.\n * @param config Local prompt configuration.\n * @returns Object with created flag and raw PromptResponse data.\n * @throws {PromptsApiError} If the API call fails.\n */\n async upsert(\n handle: string,\n config: {\n model: string;\n modelParameters?: {\n temperature?: number;\n max_tokens?: number;\n };\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n },\n ): Promise<{ created: boolean; prompt: PromptResponse }> {\n const payload = {\n handle,\n model: config.model,\n prompt: PromptConverter.extractSystemPrompt(config.messages),\n messages: PromptConverter.filterNonSystemMessages(config.messages),\n temperature: config.modelParameters?.temperature,\n maxTokens: config.modelParameters?.max_tokens,\n inputs: [{ identifier: \"input\", type: \"str\" as const }],\n outputs: [{ identifier: \"output\", type: \"str\" as const }],\n commitMessage: `Updated via CLI sync`,\n schemaVersion: \"1.0\" as const,\n };\n\n // Creating a prompt with the same handle will fail, so we try to update instead\n try {\n const prompt = await this.create(payload);\n return {\n created: true,\n prompt,\n };\n } catch {\n const prompt = await this.update(handle, payload);\n\n return {\n created: false,\n prompt,\n };\n }\n }\n\n /**\n * Sync a prompt with local content, handling conflicts and version management\n * You probably don't need to use this method directly.\n */\n async sync(params: {\n name: string;\n configData: ConfigData;\n localVersion?: number;\n commitMessage?: string;\n }): Promise<SyncResult> {\n try {\n const response = await this.apiClient.POST(\n \"/api/prompts/{id}/sync\",\n {\n params: { path: { id: params.name } },\n body: {\n configData: params.configData,\n localVersion: params.localVersion,\n commitMessage: params.commitMessage,\n },\n },\n );\n\n if (response.error) {\n const errorMessage =\n response.error?.error ?? JSON.stringify(response.error);\n throw new Error(`Failed to sync prompt: ${errorMessage}`);\n }\n\n return {\n action: response.data.action as SyncAction,\n prompt: response.data.prompt,\n conflictInfo: response.data.conflictInfo,\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error occurred\";\n throw new PromptsApiError(message, \"sync\", error);\n }\n }\n}\n","import { type z } from \"zod\";\nimport type { paths } from \"@/internal/generated/openapi/api-client\";\nimport {\n type corePromptDataSchema,\n type promptMetadataSchema,\n type promptDataSchema\n} from \"./schema\";\n\n/**\n * Type for template variables - supporting common data types\n */\nexport type TemplateVariables = Record<\n string,\n string | number | boolean | object | null\n>;\n\n/**\n * Core data needed for prompt functionality\n */\nexport type CorePromptData = z.infer<typeof corePromptDataSchema>;\n\n/**\n * Optional metadata for identification and tracing\n */\nexport type PromptMetadata = z.infer<typeof promptMetadataSchema>;\n\n/**\n * Combined type for creating prompts\n */\nexport type PromptData = z.infer<typeof promptDataSchema>;\n\n// Extract API types from OpenAPI schema for backwards compatibility\nexport type CreatePromptBody = NonNullable<\n paths[\"/api/prompts\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type UpdatePromptBody = NonNullable<\n paths[\"/api/prompts/{id}\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\nexport type PromptResponse = NonNullable<\n paths[\"/api/prompts/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n// Extract the PromptScope type from the API client\nexport type PromptScope = paths[\"/api/prompts\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"scope\"];\n\n// Extract tag definition types from the OpenAPI schema\nexport type TagDefinition = NonNullable<\n paths[\"/api/prompts/tags\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>[number];\n\nexport type CreatedTag = NonNullable<\n paths[\"/api/prompts/tags\"][\"post\"][\"responses\"][\"201\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Fetch policy for prompt retrieval.\n * Controls how prompts are fetched and cached.\n */\nexport enum FetchPolicy {\n /** Use local file if available, otherwise fetch from API (default) */\n MATERIALIZED_FIRST = \"MATERIALIZED_FIRST\",\n /** Always try API first, fall back to materialized */\n ALWAYS_FETCH = \"ALWAYS_FETCH\",\n /** Fetch every X minutes, use materialized between fetches */\n CACHE_TTL = \"CACHE_TTL\",\n /** Never fetch, use materialized files only */\n MATERIALIZED_ONLY = \"MATERIALIZED_ONLY\",\n}\n\n","import { Liquid } from \"liquidjs\";\nimport { PromptTracingDecorator, tracer } from \"./tracing\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { promptDataSchema } from \"./schema\";\nimport { type TemplateVariables, type PromptData, type CorePromptData, type PromptScope } from \"./types\";\nimport { PromptCompilationError, PromptValidationError } from \"./errors\";\n\n// Re-export types and errors for convenience\nexport type { TemplateVariables, PromptData, CorePromptData, PromptMetadata } from \"./types\";\nexport { PromptCompilationError, PromptValidationError } from \"./errors\";\n\n// Global Liquid instance - shared across all prompts for efficiency\nconst liquid = new Liquid({\n strictFilters: true,\n});\n\n/**\n * The Prompt class provides a standardized interface for working with prompt objects\n * within the SDK, focusing on core functionality needed for template compilation and execution.\n * Keeps only essential fields while maintaining compatibility with tracing and observability.\n */\nexport class Prompt {\n // === Core functionality (required) ===\n public readonly model!: string;\n public readonly messages!: Array<{\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n }>;\n\n // === Optional core fields ===\n public readonly prompt?: string;\n public readonly temperature?: number;\n public readonly maxTokens?: number;\n public readonly responseFormat?: CorePromptData[\"responseFormat\"];\n\n // === Optional identification (for tracing) ===\n public readonly id?: string;\n public readonly handle?: string | null;\n public readonly version?: number;\n public readonly versionId?: string;\n public readonly scope?: PromptScope;\n\n constructor(data: PromptData) {\n // Validate input using Zod\n const validationResult = promptDataSchema.strip().safeParse(data);\n\n if (!validationResult.success) {\n throw new PromptValidationError(\n \"Invalid prompt data provided\",\n validationResult.error\n );\n }\n\n // Assign validated data\n Object.assign(this, validationResult.data);\n\n // Set default for prompt if not provided\n this.prompt ??= this.extractSystemPrompt();\n\n // Return a proxy that wraps specific methods for tracing\n return createTracingProxy(this as Prompt, tracer, PromptTracingDecorator);\n }\n\n private extractSystemPrompt(): string {\n return this.messages.find(m => m.role === \"system\")?.content ?? \"\";\n }\n\n /**\n * Compile the prompt template with provided variables (lenient - missing variables become empty)\n * @param variables - Object containing variable values for template compilation\n * @returns CompiledPrompt instance with compiled content\n */\n private _compile(\n variables: TemplateVariables,\n strict: boolean,\n ): CompiledPrompt {\n try {\n // Compile main prompt\n const compiledPrompt = this.prompt\n ? liquid.parseAndRenderSync(this.prompt, variables, {\n strictVariables: strict,\n })\n : \"\";\n\n // Compile messages\n const compiledMessages = (this.messages || []).map((message) => ({\n ...message,\n content: message.content\n ? liquid.parseAndRenderSync(message.content, variables, {\n strictVariables: strict,\n })\n : message.content,\n }));\n\n // Create new prompt data with compiled content\n const compiledData: PromptData = {\n ...this,\n prompt: compiledPrompt,\n messages: compiledMessages,\n };\n\n return new CompiledPrompt(compiledData, this);\n } catch (error) {\n const templateStr = this.prompt ?? JSON.stringify(this.messages);\n throw new PromptCompilationError(\n `Failed to compile prompt template: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n templateStr,\n error,\n );\n }\n }\n\n compile(variables: TemplateVariables = {}): CompiledPrompt {\n return this._compile(variables, false);\n }\n\n /**\n * Compile with validation - throws error if required variables are missing\n * @param variables - Template variables\n * @returns CompiledPrompt instance with compiled content\n */\n compileStrict(variables: TemplateVariables): CompiledPrompt {\n return this._compile(variables, true);\n }\n}\n\n\n/**\n * Represents a compiled prompt that extends Prompt with reference to the original template\n */\nexport class CompiledPrompt extends Prompt {\n constructor(\n compiledData: PromptData,\n public readonly original: Prompt,\n ) {\n super(compiledData);\n }\n}\n","// TODO: Move these to their own files\nimport { z } from \"zod\";\nimport { PromptScope } from \"../constants\";\n\n/**\n * Zod schema for message objects in prompts\n */\nexport const messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\", \"system\"]),\n content: z.string(),\n});\n\n/**\n * Zod schema for response format configuration\n */\nexport const responseFormatSchema = z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n schema: z.record(z.string(), z.unknown()),\n }).nullable(),\n}).optional();\n\n/**\n * Zod schema for core prompt data - the essential fields needed for functionality\n */\nexport const corePromptDataSchema = z.object({\n model: z.string().min(1, \"Model cannot be empty\"),\n messages: z.array(messageSchema).min(1, \"At least one message is required\"),\n prompt: z.string().optional(),\n temperature: z.number().min(0).max(2).optional(),\n maxTokens: z.number().positive().optional(),\n responseFormat: responseFormatSchema,\n});\n\n/**\n * Zod schema for prompt metadata - optional fields for identification and tracing\n */\nexport const promptMetadataSchema = z.object({\n id: z.string().optional(),\n handle: z.string().nullable().optional(),\n version: z.number().min(0).optional(),\n versionId: z.string().optional(),\n scope: z.enum(PromptScope).optional(),\n});\n\n/**\n * Combined schema for complete prompt data\n */\nexport const promptDataSchema = z.object({\n ...corePromptDataSchema.shape,\n ...promptMetadataSchema.shape,\n});\n","import { type PromptScope as PromptScopeType } from \"./types\";\n\nexport const PromptScope = {\n ORGANIZATION: \"ORGANIZATION\" as const,\n PROJECT: \"PROJECT\" as const,\n} satisfies Record<string, PromptScopeType>;\n","import type { LocalPromptConfig, PromptDependency } from \"@/cli/types\";\nimport { FileManager } from \"@/cli/utils/fileManager\";\nimport { type Logger, NoOpLogger } from \"@/logger\";\nimport { type PromptData } from \"./types\";\nimport { PromptFileNotFoundError } from \"@/cli/utils/errors/prompt-not-found.error\";\n\nexport interface LocalPromptsServiceConfig {\n fileManager?: typeof FileManager;\n logger?: Logger;\n}\n\n/**\n * Service for retrieving prompts from local filesystem sources.\n *\n * Searches for prompts in the following priority order:\n * 1. Explicit file mapping in prompts.json config\n * 2. Materialized path from prompts-lock.json\n * 3. Direct file scanning in prompts directory\n */\nexport class LocalPromptsService {\n private readonly fileManager: typeof FileManager;\n private readonly logger: Logger;\n\n constructor(config?: LocalPromptsServiceConfig) {\n this.fileManager = config?.fileManager ?? FileManager;\n this.logger = config?.logger ?? new NoOpLogger();\n }\n\n /**\n * Retrieves a prompt using the configured search strategy.\n * Tries each source in priority order until found or all sources exhausted.\n */\n async get(handleOrId: string): Promise<PromptData | null> {\n try {\n const dependency = await this.getDependencyFromConfig(handleOrId);\n\n // If no dependency is found, it means it's not a local prompt\n if (!dependency) {\n return null;\n }\n\n // Try each source in priority order until found or all sources exhausted\n // We catch errors and return null if any of the sources fail so we\n // can continue to the next source and return null if all sources fail\n const localPromptConfig = (\n (await this.getFromConfig(dependency).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n })) ??\n (await this.getFromLockFile(handleOrId).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n })) ??\n (await this.getFromLocalFiles(handleOrId).catch((e) => {\n if (e instanceof PromptFileNotFoundError) return null;\n throw e;\n }))\n );\n\n return localPromptConfig ? this.convertToPromptData({\n ...localPromptConfig,\n handle: handleOrId,\n }) : null;\n } catch (error) {\n this.logger.warn(`Failed to get prompt \"${handleOrId}\": ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n\n /**\n * Searches for prompt using explicit file mapping in prompts.json.\n * Looks for dependencies with a 'file' property pointing to a specific path.\n */\n private async getFromConfig(dependency: PromptDependency): Promise<LocalPromptConfig | null> {\n if (typeof dependency === 'string' && dependency.startsWith('file:')) {\n return this.fileManager.loadLocalPrompt(dependency.slice(5));\n }\n\n return null;\n }\n\n /**\n * Searches for prompt using materialized path from lock file.\n * Lock file contains resolved paths for prompts that have been synced/materialized.\n */\n private async getFromLockFile(handleOrId: string): Promise<LocalPromptConfig | null> {\n const lock = this.fileManager.loadPromptsLock();\n const lockEntry = lock.prompts[handleOrId];\n\n if (lockEntry?.materialized) {\n return this.fileManager.loadLocalPrompt(lockEntry.materialized);\n }\n\n return null;\n }\n\n /**\n * Searches for prompt by scanning all .prompt.yaml files in prompts directory.\n * Extracts prompt name from file path and matches against the requested handle.\n * This is the fallback method when explicit mappings don't exist.\n */\n private async getFromLocalFiles(handleOrId: string): Promise<LocalPromptConfig | null> {\n const localFiles = this.fileManager.getLocalPromptFiles();\n\n for (const filePath of localFiles) {\n const promptName = this.fileManager.promptNameFromPath(filePath);\n if (promptName === handleOrId) {\n return this.fileManager.loadLocalPrompt(filePath);\n }\n }\n\n return null;\n }\n\n /**\n * Get dependency from config\n */\n private async getDependencyFromConfig(handleOrId: string): Promise<PromptDependency | null> {\n const config = this.fileManager.loadPromptsConfig();\n const dependency = config.prompts[handleOrId];\n\n return dependency ?? null;\n }\n\n /**\n * Converts LocalPromptConfig to PromptData format\n */\n private convertToPromptData(config: LocalPromptConfig & { handle: string; }): PromptData {\n const { modelParameters, ...rest } = config;\n return {\n maxTokens: modelParameters?.max_tokens,\n temperature: modelParameters?.temperature,\n ...rest,\n };\n }\n}\n","import { PromptsApiService, type AssignTagResult } from \"./prompts-api.service\";\nimport { Prompt } from \"./prompt\";\nimport type { CreatePromptBody, UpdatePromptBody, PromptData, TagDefinition, CreatedTag } from \"./types\";\nimport { FetchPolicy } from \"./types\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { LocalPromptsService } from \"./local-prompts.service\";\nimport { PromptsError } from \"./errors\";\n\n/**\n * Options for fetching a prompt.\n */\nexport interface GetPromptOptions {\n /** Specific version to fetch */\n version?: string;\n /** Tag to fetch (e.g., \"production\", \"staging\", or a custom tag) */\n tag?: string;\n /** Fetch policy to use */\n fetchPolicy?: FetchPolicy;\n /** Cache TTL in minutes (only used with CACHE_TTL policy) */\n cacheTtlMinutes?: number;\n}\n\ninterface CacheEntry {\n data: PromptData;\n timestamp: number;\n}\n\ninterface PromptsFacadeDependencies {\n promptsApiService: PromptsApiService;\n localPromptsService: LocalPromptsService;\n}\n\n/**\n * Facade for prompt operations in the LangWatch SDK.\n * Provides a simplified interface for common prompt management tasks.\n */\nexport class PromptsFacade implements Pick<PromptsApiService, \"sync\" | \"delete\">{\n private readonly promptsApiService: PromptsApiService;\n private readonly localPromptsService: LocalPromptsService;\n private readonly cache = new Map<string, CacheEntry>();\n readonly tags: {\n assign(id: string, params: { tag: string; versionId: string }): Promise<AssignTagResult>;\n list(): Promise<TagDefinition[]>;\n create(params: { name: string }): Promise<CreatedTag>;\n delete(tagName: string): Promise<void>;\n rename(oldName: string, newName: string): Promise<void>;\n };\n\n constructor(config: InternalConfig & PromptsFacadeDependencies) {\n this.promptsApiService = config.promptsApiService ?? new PromptsApiService(config);\n this.localPromptsService = config.localPromptsService ?? new LocalPromptsService();\n this.tags = {\n assign: (id, { tag, versionId }) =>\n this.promptsApiService.assignTag({ id, tag, versionId }),\n list: () => this.promptsApiService.listTags(),\n create: ({ name }) => this.promptsApiService.createTag({ name }),\n delete: (tagName) => this.promptsApiService.deleteTag(tagName),\n rename: (oldName, newName) =>\n this.promptsApiService.renameTag({ tag: oldName, name: newName }),\n };\n }\n\n /**\n * Creates a new prompt.\n * @param data The prompt creation payload.\n * @returns The created Prompt instance.\n * @throws {PromptsError} If the API call fails.\n */\n async create(data: CreatePromptBody): Promise<Prompt> {\n const serverPrompt = await this.promptsApiService.create(data);\n return new Prompt(serverPrompt);\n }\n\n /**\n * Retrieves a prompt by handle or ID.\n *\n * Supports shorthand `handle:tag` syntax — e.g. `get(\"pizza-prompt:production\")`.\n * Shorthand is parsed server-side; the SDK passes the string through as-is.\n *\n * @param handleOrId The prompt's handle, unique identifier, or `handle:tag` shorthand.\n * @param options Optional parameters for the request.\n * @returns The Prompt instance.\n * @throws {PromptsError} If the prompt is not found or the API call fails.\n */\n async get(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const fetchPolicy = options?.fetchPolicy ?? FetchPolicy.MATERIALIZED_FIRST;\n\n switch (fetchPolicy) {\n case FetchPolicy.MATERIALIZED_ONLY:\n return this.getMaterializedOnly(handleOrId);\n\n case FetchPolicy.ALWAYS_FETCH:\n return this.getAlwaysFetch(handleOrId, options);\n\n case FetchPolicy.CACHE_TTL:\n return this.getCacheTtl(handleOrId, options);\n\n case FetchPolicy.MATERIALIZED_FIRST:\n default:\n return this.getMaterializedFirst(handleOrId, options);\n }\n }\n\n private async getMaterializedFirst(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n return new Prompt(serverPrompt);\n }\n\n private async getAlwaysFetch(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n try {\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n return new Prompt(serverPrompt);\n } catch {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found locally or on server`);\n }\n }\n\n private async getMaterializedOnly(handleOrId: string): Promise<Prompt> {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found in materialized files`);\n }\n\n private buildCacheKey(handleOrId: string, options?: GetPromptOptions): string {\n const tagSegment = options?.tag != null ? `::tag:${options.tag}` : '';\n return `${handleOrId}::version:${options?.version ?? ''}${tagSegment}`;\n }\n\n private async getCacheTtl(\n handleOrId: string,\n options?: GetPromptOptions,\n ): Promise<Prompt> {\n const cacheKey = this.buildCacheKey(handleOrId, options);\n const ttlMs = (options?.cacheTtlMinutes ?? 5) * 60 * 1000;\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && now - cached.timestamp < ttlMs) {\n return new Prompt(cached.data);\n }\n\n try {\n const serverPrompt = await this.promptsApiService.get(handleOrId, options);\n this.cache.set(cacheKey, { data: serverPrompt, timestamp: now });\n return new Prompt(serverPrompt);\n } catch {\n const localPrompt = await this.localPromptsService.get(handleOrId);\n if (localPrompt) {\n return new Prompt(localPrompt);\n }\n throw new PromptsError(`Prompt \"${handleOrId}\" not found locally or on server`);\n }\n }\n\n /**\n * Retrieves all prompts.\n * @returns Array of Prompt instances.\n * @throws {PromptsError} If the API call fails.\n */\n async getAll(): Promise<Prompt[]> {\n const serverPrompts = await this.promptsApiService.getAll();\n return serverPrompts.map((prompt) => new Prompt(prompt));\n }\n\n /**\n * Updates an existing prompt.\n * @param handleOrId The prompt's handle or unique identifier.\n * @param newData The update payload.\n * @returns The updated Prompt instance.\n * @throws {PromptsError} If the API call fails.\n */\n async update(handleOrId: string, newData: UpdatePromptBody): Promise<Prompt> {\n const serverPrompt = await this.promptsApiService.update(handleOrId, newData);\n return new Prompt(serverPrompt);\n }\n\n get delete() {\n return this.promptsApiService.delete.bind(this.promptsApiService);\n }\n\n /**\n * Delegated method to the prompts API service.\n */\n get sync() {\n return this.promptsApiService.sync.bind(this.promptsApiService);\n }\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunk2BJPLPLUjs = require('./chunk-2BJPLPLU.js');
|
|
4
|
+
|
|
5
|
+
// src/client-sdk/services/agents/agents-api.service.ts
|
|
6
|
+
var AgentsApiError = class extends Error {
|
|
7
|
+
constructor(message, operation, originalError) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.operation = operation;
|
|
10
|
+
this.originalError = originalError;
|
|
11
|
+
this.name = "AgentsApiError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var AgentsApiService = class {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
var _a;
|
|
17
|
+
this.apiClient = (_a = config == null ? void 0 : config.langwatchApiClient) != null ? _a : _chunk2BJPLPLUjs.createLangWatchApiClient.call(void 0, );
|
|
18
|
+
}
|
|
19
|
+
handleApiError(operation, error) {
|
|
20
|
+
var _a;
|
|
21
|
+
const errorMessage = typeof error === "string" ? error : error != null && typeof error === "object" && "error" in error && error.error != null ? typeof error.error === "string" ? error.error : (_a = error.error.message) != null ? _a : JSON.stringify(error.error) : error instanceof Error ? error.message : "Unknown error occurred";
|
|
22
|
+
throw new AgentsApiError(
|
|
23
|
+
`Failed to ${operation}: ${errorMessage}`,
|
|
24
|
+
operation,
|
|
25
|
+
error
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
async list(params) {
|
|
29
|
+
const { data, error } = await this.apiClient.GET("/api/agents", {
|
|
30
|
+
params: { query: params }
|
|
31
|
+
});
|
|
32
|
+
if (error) this.handleApiError("list agents", error);
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
async get(id) {
|
|
36
|
+
const { data, error } = await this.apiClient.GET("/api/agents/{id}", {
|
|
37
|
+
params: { path: { id } }
|
|
38
|
+
});
|
|
39
|
+
if (error) this.handleApiError(`get agent "${id}"`, error);
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
async create(params) {
|
|
43
|
+
const { data, error } = await this.apiClient.POST("/api/agents", {
|
|
44
|
+
body: params
|
|
45
|
+
});
|
|
46
|
+
if (error) this.handleApiError("create agent", error);
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
async update(id, params) {
|
|
50
|
+
const { data, error } = await this.apiClient.PATCH("/api/agents/{id}", {
|
|
51
|
+
params: { path: { id } },
|
|
52
|
+
body: params
|
|
53
|
+
});
|
|
54
|
+
if (error) this.handleApiError(`update agent "${id}"`, error);
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
async delete(id) {
|
|
58
|
+
const { data, error } = await this.apiClient.DELETE("/api/agents/{id}", {
|
|
59
|
+
params: { path: { id } }
|
|
60
|
+
});
|
|
61
|
+
if (error) this.handleApiError(`delete agent "${id}"`, error);
|
|
62
|
+
return data;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
exports.AgentsApiError = AgentsApiError; exports.AgentsApiService = AgentsApiService;
|
|
70
|
+
//# sourceMappingURL=chunk-AMPLL3EP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AMPLL3EP.js","../src/client-sdk/services/agents/agents-api.service.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACqBO,IAAM,eAAA,EAAN,MAAA,QAA6B,MAAM;AAAA,EACxC,WAAA,CACE,OAAA,EACgB,SAAA,EACA,aAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,UAAA,EAAA,SAAA;AACA,IAAA,IAAA,CAAA,cAAA,EAAA,aAAA;AAGhB,IAAA,IAAA,CAAK,KAAA,EAAO,gBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,iBAAA,EAAN,MAAuB;AAAA,EAG5B,WAAA,CAAY,MAAA,EAAqD;AAvCnE,IAAA,IAAA,EAAA;AAwCI,IAAA,IAAA,CAAK,UAAA,EAAA,CAAY,GAAA,EAAA,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,kBAAA,EAAA,GAAR,KAAA,EAAA,GAAA,EAA8B,uDAAA,CAAyB;AAAA,EAC1E;AAAA,EAEQ,cAAA,CAAe,SAAA,EAAmB,KAAA,EAAuB;AA3CnE,IAAA,IAAA,EAAA;AA4CI,IAAA,MAAM,aAAA,EACJ,OAAO,MAAA,IAAU,SAAA,EACb,MAAA,EACA,MAAA,GAAS,KAAA,GACP,OAAO,MAAA,IAAU,SAAA,GACjB,QAAA,GAAW,MAAA,GACX,KAAA,CAAM,MAAA,GAAS,KAAA,EACf,OAAO,KAAA,CAAM,MAAA,IAAU,SAAA,EACrB,KAAA,CAAM,MAAA,EAAA,CACL,GAAA,EAAA,KAAA,CAAM,KAAA,CAA+B,OAAA,EAAA,GAArC,KAAA,EAAA,GAAA,EACD,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,EAAA,EAC5B,MAAA,WAAiB,MAAA,EACf,KAAA,CAAM,QAAA,EACN,wBAAA;AAEV,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,UAAA,EAAa,SAAS,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA;AACvC,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEmF,EAAA;AAC9C,IAAA;AACT,MAAA;AACzB,IAAA;AAC8B,IAAA;AACxB,IAAA;AACT,EAAA;AAE8C,EAAA;AACT,IAAA;AACV,MAAA;AACxB,IAAA;AAC8B,IAAA;AACxB,IAAA;AACT,EAAA;AAO2B,EAAA;AACU,IAAA;AAC3B,MAAA;AACP,IAAA;AAC8B,IAAA;AACxB,IAAA;AACT,EAAA;AAM2B,EAAA;AACU,IAAA;AACV,MAAA;AACjB,MAAA;AACP,IAAA;AAC8B,IAAA;AACxB,IAAA;AACT,EAAA;AAEgE,EAAA;AAC3B,IAAA;AACV,MAAA;AACxB,IAAA;AAC8B,IAAA;AACxB,IAAA;AACT,EAAA;AACF;ADnD8C;AACA;AACA;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AMPLL3EP.js","sourcesContent":[null,"import {\n createLangWatchApiClient,\n type LangwatchApiClient,\n} from \"@/internal/api/client\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\n\nexport interface AgentResponse {\n id: string;\n name: string;\n type: string;\n config: Record<string, unknown> | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentListResponse {\n data: AgentResponse[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n}\n\nexport class AgentsApiError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: unknown,\n ) {\n super(message);\n this.name = \"AgentsApiError\";\n }\n}\n\nexport class AgentsApiService {\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 errorMessage =\n typeof error === \"string\"\n ? error\n : error != null &&\n typeof error === \"object\" &&\n \"error\" in error &&\n error.error != null\n ? typeof error.error === \"string\"\n ? error.error\n : (error.error as { message?: string }).message ??\n JSON.stringify(error.error)\n : error instanceof Error\n ? error.message\n : \"Unknown error occurred\";\n\n throw new AgentsApiError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n async list(params?: { page?: number; limit?: number }): Promise<AgentListResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/agents\", {\n params: { query: params },\n });\n if (error) this.handleApiError(\"list agents\", error);\n return data as unknown as AgentListResponse;\n }\n\n async get(id: string): Promise<AgentResponse> {\n const { data, error } = await this.apiClient.GET(\"/api/agents/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`get agent \"${id}\"`, error);\n return data as unknown as AgentResponse;\n }\n\n async create(params: {\n name: string;\n type: string;\n config: Record<string, unknown>;\n workflowId?: string;\n }): Promise<AgentResponse> {\n const { data, error } = await this.apiClient.POST(\"/api/agents\", {\n body: params as never,\n });\n if (error) this.handleApiError(\"create agent\", error);\n return data as unknown as AgentResponse;\n }\n\n async update(id: string, params: {\n name?: string;\n type?: string;\n config?: Record<string, unknown>;\n }): Promise<AgentResponse> {\n const { data, error } = await this.apiClient.PATCH(\"/api/agents/{id}\", {\n params: { path: { id } },\n body: params as never,\n });\n if (error) this.handleApiError(`update agent \"${id}\"`, error);\n return data as unknown as AgentResponse;\n }\n\n async delete(id: string): Promise<{ id: string; name: string }> {\n const { data, error } = await this.apiClient.DELETE(\"/api/agents/{id}\", {\n params: { path: { id } },\n });\n if (error) this.handleApiError(`delete agent \"${id}\"`, error);\n return data as unknown as { id: string; name: string };\n }\n}\n"]}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
var _chunk2VVANTLBjs = require('./chunk-2VVANTLB.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
var _chunkH6F5OGSLjs = require('./chunk-H6F5OGSL.js');
|
|
6
7
|
|
|
7
|
-
var _chunkHV75NBGGjs = require('./chunk-HV75NBGG.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkD2FHOR76js = require('./chunk-D2FHOR76.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
@@ -58,7 +58,7 @@ var DatasetPlanLimitError = class extends DatasetError {
|
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
// src/client-sdk/services/datasets/tracing/tracer.ts
|
|
61
|
-
var tracer = _chunkH6F5OGSLjs.getLangWatchTracer.call(void 0, `${
|
|
61
|
+
var tracer = _chunkH6F5OGSLjs.getLangWatchTracer.call(void 0, `${_chunkD2FHOR76js.LANGWATCH_SDK_NAME_CLIENT}.datasets`, _chunkD2FHOR76js.LANGWATCH_SDK_VERSION);
|
|
62
62
|
|
|
63
63
|
// src/client-sdk/services/datasets/dataset.service.ts
|
|
64
64
|
var DatasetService = class {
|
|
@@ -671,4 +671,4 @@ _datasetService = new WeakMap();
|
|
|
671
671
|
|
|
672
672
|
|
|
673
673
|
exports.DatasetError = DatasetError; exports.DatasetNotFoundError = DatasetNotFoundError; exports.DatasetApiError = DatasetApiError; exports.DatasetValidationError = DatasetValidationError; exports.DatasetPlanLimitError = DatasetPlanLimitError; exports.DatasetService = DatasetService; exports.DatasetsFacade = DatasetsFacade;
|
|
674
|
-
//# sourceMappingURL=chunk-
|
|
674
|
+
//# sourceMappingURL=chunk-CGFG5FCC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-FXOQFCAQ.js","../src/client-sdk/services/datasets/errors.ts","../src/client-sdk/services/datasets/tracing/tracer.ts","../src/client-sdk/services/datasets/dataset.service.ts","../src/client-sdk/services/datasets/datasets.facade.ts"],"names":["errorMessage"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-FXOQFCAQ.js","sourcesContent":[null,"/**\n * Errors for the Dataset API\n */\n\n/**\n * Base error for all dataset operations.\n */\nexport class DatasetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetError\";\n }\n}\n\n/**\n * Thrown when a dataset is not found (404).\n */\nexport class DatasetNotFoundError extends DatasetError {\n constructor(slugOrId: string) {\n super(`Dataset not found: ${slugOrId}`);\n this.name = \"DatasetNotFoundError\";\n }\n}\n\n/**\n * Error from the Dataset API with operation context.\n * Aligns with PromptsApiError pattern: includes operation and originalError fields.\n */\nexport class DatasetApiError extends DatasetError {\n readonly status: number;\n readonly operation: string;\n readonly originalError?: unknown;\n\n constructor(message: string, status: number, operation: string, originalError?: unknown) {\n super(message);\n this.name = \"DatasetApiError\";\n this.status = status;\n this.operation = operation;\n this.originalError = originalError;\n }\n}\n\n/**\n * Thrown for client-side validation failures (e.g. empty name, no update fields, empty entries).\n * Distinguished from DatasetApiError which represents server-side errors.\n */\nexport class DatasetValidationError extends DatasetError {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetValidationError\";\n }\n}\n\n/**\n * Thrown when a dataset operation exceeds the plan limit (403).\n * The message includes the upgrade/subscription URL from the server.\n */\nexport class DatasetPlanLimitError extends DatasetError {\n readonly limitType: string;\n readonly current?: number;\n readonly max?: number;\n\n constructor(message: string, originalError?: unknown) {\n super(message);\n this.name = \"DatasetPlanLimitError\";\n\n if (originalError != null && typeof originalError === \"object\") {\n const err = originalError as Record<string, unknown>;\n this.limitType = typeof err.limitType === \"string\" ? err.limitType : \"datasets\";\n this.current = typeof err.current === \"number\" ? err.current : undefined;\n this.max = typeof err.max === \"number\" ? err.max : undefined;\n } else {\n this.limitType = \"datasets\";\n }\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}.datasets`, LANGWATCH_SDK_VERSION);\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport {\n type Dataset,\n type DatasetEntry,\n type DatasetMetadata,\n type GetDatasetApiResponse,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type CreateFromUploadOptions,\n type CreateFromUploadResponse,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./types\";\nimport { DatasetApiError, DatasetNotFoundError, DatasetPlanLimitError } from \"./errors\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { tracer } from \"./tracing\";\n\ntype DatasetServiceConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n endpoint: string;\n apiKey: string;\n};\n\n/**\n * Service for managing dataset resources via the LangWatch API.\n *\n * Responsibilities:\n * - CRUD operations for datasets\n * - Record management (create, update, delete)\n * - File upload\n * - Error handling with contextual information\n */\nexport class DatasetService {\n private readonly config: DatasetServiceConfig;\n\n constructor(config: DatasetServiceConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy that automatically creates\n * OpenTelemetry spans for all public methods.\n */\n return createTracingProxy(this as DatasetService, tracer);\n }\n\n /**\n * Handles API errors by mapping status codes to appropriate error types.\n * @param operation - Description of the operation being performed\n * @param error - The error object from the API response\n * @param status - The HTTP status code\n * @param slugOrId - The dataset identifier (only passed for operations targeting an existing resource)\n */\n private handleApiError(operation: string, error: unknown, status: number, slugOrId?: string): never {\n if (status === 404 && slugOrId) {\n throw new DatasetNotFoundError(slugOrId);\n }\n\n if (status === 403) {\n const errorMessage = this.extractErrorMessage(error, status);\n throw new DatasetPlanLimitError(errorMessage, error);\n }\n\n const errorMessage = this.extractErrorMessage(error, status);\n\n throw new DatasetApiError(\n `Failed to ${operation}: ${errorMessage}`,\n status,\n operation,\n error,\n );\n }\n\n /**\n * Extracts a human-readable error message from an API error response.\n */\n private extractErrorMessage(error: unknown, status: number): string {\n if (typeof error === \"string\") return error;\n\n if (error != null && typeof error === \"object\") {\n if (\"message\" in error && typeof (error as { message: unknown }).message === \"string\") {\n return (error as { message: string }).message;\n }\n if (\"error\" in error) {\n const inner = (error as { error: unknown }).error;\n if (typeof inner === \"string\") return inner;\n if (inner != null && typeof inner === \"object\" && \"message\" in inner) {\n return (inner as { message: string }).message ?? JSON.stringify(inner);\n }\n }\n }\n\n return `HTTP ${status}`;\n }\n\n /**\n * Wrapper for API calls to endpoints not yet in the generated OpenAPI types.\n * Quarantines `as any` casts to a single location.\n */\n private untypedRequest<M extends 'GET' | 'POST' | 'PATCH' | 'DELETE'>(\n method: M,\n path: string,\n options?: Record<string, unknown>,\n ) {\n return (this.config.langwatchApiClient[method] as any)(path, options);\n }\n\n /**\n * Unwraps an API response, throwing a mapped error if the response contains an error.\n * Centralizes the repeated `if (error) handleApiError; return data` pattern.\n */\n private unwrapResponse<T>(\n response: { data?: unknown; error?: unknown; response: { status: number } },\n operation: string,\n slugOrId?: string,\n ): T {\n if (response.error) {\n this.handleApiError(operation, response.error, response.response.status, slugOrId);\n }\n return response.data as T;\n }\n\n /**\n * Fetches a dataset by its slug or ID, returning metadata and entries.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param _options - Optional configuration\n * @returns The dataset with metadata and entries\n */\n async getDataset<T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n _options?: GetDatasetOptions\n ): Promise<Dataset<T>> {\n this.config.logger.debug(`Fetching dataset: ${slugOrId}`);\n\n const response = await this.config.langwatchApiClient.GET(\n \"/api/dataset/{slugOrId}\",\n {\n params: {\n path: {\n slugOrId,\n },\n },\n }\n );\n\n const data = this.unwrapResponse<GetDatasetApiResponse>(\n response,\n `fetch dataset \"${slugOrId}\"`,\n slugOrId,\n );\n\n const entries: DatasetEntry<T>[] = data.data.map((item) => ({\n id: item.id,\n datasetId: item.datasetId,\n projectId: item.projectId,\n entry: item.entry as T,\n createdAt: item.createdAt,\n updatedAt: item.updatedAt,\n }));\n\n this.config.logger.debug(\n `Fetched dataset ${slugOrId} with ${entries.length} entries`\n );\n\n return {\n id: data.id,\n name: data.name,\n slug: data.slug,\n columnTypes: data.columnTypes,\n createdAt: data.createdAt,\n updatedAt: data.updatedAt,\n entries,\n };\n }\n\n /**\n * Lists all datasets for the project, with optional pagination.\n */\n async listDatasets(options?: ListDatasetsOptions): Promise<ListDatasetsApiResponse> {\n this.config.logger.debug(\"Listing datasets\");\n\n const response = await this.untypedRequest('GET', '/api/dataset', {\n params: {\n query: {\n page: options?.page,\n limit: options?.limit,\n },\n },\n });\n\n return this.unwrapResponse<ListDatasetsApiResponse>(\n response,\n \"list datasets\",\n );\n }\n\n /**\n * Creates a new dataset.\n */\n async createDataset(options: CreateDatasetOptions): Promise<DatasetMetadata> {\n this.config.logger.debug(`Creating dataset: ${options.name}`);\n\n const response = await this.untypedRequest('POST', '/api/dataset', {\n body: {\n name: options.name,\n columnTypes: options.columnTypes ?? [],\n },\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `create dataset \"${options.name}\"`,\n );\n }\n\n /**\n * Updates a dataset by its slug or ID.\n */\n async updateDataset(slugOrId: string, options: UpdateDatasetOptions): Promise<DatasetMetadata> {\n this.config.logger.debug(`Updating dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('PATCH', '/api/dataset/{slugOrId}', {\n params: {\n path: { slugOrId },\n },\n body: options,\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `update dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Deletes (archives) a dataset by its slug or ID.\n */\n async deleteDataset(slugOrId: string): Promise<DatasetMetadata> {\n this.config.logger.debug(`Deleting dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('DELETE', '/api/dataset/{slugOrId}', {\n params: {\n path: { slugOrId },\n },\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `delete dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Creates records in a dataset in batch.\n */\n async createRecords(\n slugOrId: string,\n entries: Record<string, unknown>[],\n ): Promise<BatchCreateRecordsResponse> {\n this.config.logger.debug(`Creating ${entries.length} records in dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('POST', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n },\n body: { entries },\n });\n\n return this.unwrapResponse<BatchCreateRecordsResponse>(\n response,\n `create records in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Updates a single record in a dataset.\n */\n async updateRecord(\n slugOrId: string,\n recordId: string,\n entry: Record<string, unknown>,\n ): Promise<DatasetRecordResponse> {\n this.config.logger.debug(`Updating record ${recordId} in dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('PATCH', '/api/dataset/{slugOrId}/records/{recordId}', {\n params: {\n path: { slugOrId, recordId },\n },\n body: { entry },\n });\n\n return this.unwrapResponse<DatasetRecordResponse>(\n response,\n `update record \"${recordId}\" in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Deletes records from a dataset by IDs.\n */\n async deleteRecords(\n slugOrId: string,\n recordIds: string[],\n ): Promise<DeleteRecordsResponse> {\n this.config.logger.debug(`Deleting ${recordIds.length} records from dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('DELETE', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n },\n body: { recordIds },\n });\n\n return this.unwrapResponse<DeleteRecordsResponse>(\n response,\n `delete records from dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Lists records in a dataset with optional pagination.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of records\n */\n async listRecords(\n slugOrId: string,\n options?: ListRecordsOptions,\n ): Promise<ListRecordsApiResponse> {\n this.config.logger.debug(`Listing records for dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('GET', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n query: {\n page: options?.page,\n limit: options?.limit,\n },\n },\n });\n\n return this.unwrapResponse<ListRecordsApiResponse>(\n response,\n `list records in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Sends a multipart/form-data request using raw fetch.\n * openapi-fetch hardcodes content-type: application/json, so file uploads\n * must bypass it. This helper centralizes URL building, auth headers,\n * error parsing, and response unwrapping.\n *\n * @param path - The API path (appended to the endpoint)\n * @param formData - The FormData payload\n * @param operation - Human-readable operation name for error messages\n * @param slugOrId - Optional dataset identifier (passed to handleApiError for 404 mapping)\n */\n private async fetchMultipart<T>(\n path: string,\n formData: FormData,\n operation: string,\n slugOrId?: string,\n ): Promise<T> {\n const { endpoint, apiKey } = this.config;\n const url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Auth-Token\": apiKey,\n authorization: `Bearer ${apiKey}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const rawBody = await response.text();\n let errorBody: unknown = rawBody;\n if (rawBody) {\n try {\n errorBody = JSON.parse(rawBody);\n } catch {\n // Keep the plain-text body.\n }\n }\n\n this.handleApiError(operation, errorBody, response.status, slugOrId);\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Creates a new dataset from a file upload.\n *\n * @param options - The dataset name and file to upload\n * @returns The created dataset metadata with record count\n */\n async createDatasetFromUpload(\n options: CreateFromUploadOptions,\n ): Promise<CreateFromUploadResponse> {\n this.config.logger.debug(`Creating dataset from upload: ${options.name}`);\n\n const formData = new FormData();\n formData.append(\"name\", options.name);\n formData.append(\"file\", options.file);\n\n return this.fetchMultipart<CreateFromUploadResponse>(\n \"/api/dataset/upload\",\n formData,\n `create dataset from upload \"${options.name}\"`,\n );\n }\n\n /**\n * Uploads a file with a strategy for handling existing datasets.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param file - The file to upload (File or Blob)\n * @param ifExists - Strategy when dataset exists: \"append\" (default), \"replace\", or \"error\"\n * @returns The upload result\n */\n async uploadWithStrategy(\n slugOrId: string,\n file: File | Blob,\n ifExists: \"append\" | \"replace\" | \"error\" = \"append\",\n ): Promise<UploadResponse> {\n switch (ifExists) {\n case \"append\":\n return this._uploadAppend(slugOrId, file);\n case \"replace\":\n return this._uploadReplace(slugOrId, file);\n case \"error\":\n return this._uploadError(slugOrId, file);\n }\n }\n\n /**\n * Converts a CreateFromUploadResponse to the unified UploadResponse shape.\n */\n private toUploadResponse(result: CreateFromUploadResponse): UploadResponse {\n return {\n dataset: {\n id: result.id,\n name: result.name,\n slug: result.slug,\n columnTypes: result.columnTypes,\n createdAt: result.createdAt,\n updatedAt: result.updatedAt,\n },\n recordsCreated: result.recordsCreated,\n datasetId: result.id,\n };\n }\n\n /**\n * Append strategy: try uploading to existing dataset; if not found, create from file.\n */\n private async _uploadAppend(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n try {\n return await this.uploadFile(slugOrId, file);\n } catch (error) {\n if (error instanceof DatasetNotFoundError) {\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n throw error;\n }\n }\n\n /**\n * Replace strategy: if dataset exists, delete all records then upload; if not found, create from file.\n */\n private async _uploadReplace(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n try {\n await this.getDataset(slugOrId);\n await this._deleteAllRecords(slugOrId);\n return await this.uploadFile(slugOrId, file);\n } catch (error) {\n if (error instanceof DatasetNotFoundError) {\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n throw error;\n }\n }\n\n /**\n * Error strategy: if dataset exists, throw 409; if not found, create from file.\n */\n private async _uploadError(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n let datasetExists = false;\n try {\n await this.getDataset(slugOrId);\n datasetExists = true;\n } catch (error) {\n if (!(error instanceof DatasetNotFoundError)) {\n throw error;\n }\n }\n\n if (datasetExists) {\n throw new DatasetApiError(\n `Dataset already exists: ${slugOrId}`,\n 409,\n \"upload\",\n );\n }\n\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n\n /**\n * Deletes all records from a dataset by iterating through pages.\n * Always fetches page 1 since records shift after deletion.\n * Includes a safety valve to prevent infinite loops.\n */\n private async _deleteAllRecords(slugOrId: string): Promise<void> {\n const BATCH_SIZE = 1000;\n const MAX_DELETE_ITERATIONS = 100;\n\n let iteration = 0;\n while (iteration < MAX_DELETE_ITERATIONS) {\n const page = await this.listRecords(slugOrId, { page: 1, limit: BATCH_SIZE });\n if (page.data.length === 0) {\n return;\n }\n\n const ids = page.data.map((record) => record.id);\n await this.deleteRecords(slugOrId, ids);\n iteration++;\n }\n\n throw new DatasetApiError(\n `Failed to delete all records from dataset \"${slugOrId}\": exceeded ${MAX_DELETE_ITERATIONS} iterations`,\n 0,\n `delete all records from dataset \"${slugOrId}\"`,\n );\n }\n\n /**\n * Uploads a file to an existing dataset.\n */\n async uploadFile(\n slugOrId: string,\n file: File | Blob,\n ): Promise<UploadResponse> {\n this.config.logger.debug(`Uploading file to dataset: ${slugOrId}`);\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n return this.fetchMultipart<UploadResponse>(\n `/api/dataset/${encodeURIComponent(slugOrId)}/upload`,\n formData,\n `upload file to dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n}\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport { DatasetService } from \"./dataset.service\";\nimport { DatasetValidationError } from \"./errors\";\nimport {\n type Dataset,\n type DatasetMetadata,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./types\";\n\ntype DatasetsFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n endpoint: string;\n apiKey: string;\n};\n\n/**\n * Facade for dataset operations in the LangWatch SDK.\n * Provides a simplified interface for managing datasets, records, and file uploads.\n *\n * @example\n * ```typescript\n * const langwatch = new LangWatch({ apiKey: \"your-api-key\" });\n *\n * // List all datasets\n * const datasets = await langwatch.datasets.list();\n *\n * // Get a dataset by slug or ID\n * const dataset = await langwatch.datasets.get(\"my-dataset\");\n *\n * // Create a new dataset\n * const newDataset = await langwatch.datasets.create({\n * name: \"my-dataset\",\n * columnTypes: [{ name: \"input\", type: \"string\" }],\n * });\n *\n * // Update a dataset\n * const updated = await langwatch.datasets.update(\"my-dataset\", { name: \"new-name\" });\n *\n * // Delete a dataset\n * const archived = await langwatch.datasets.delete(\"my-dataset\");\n *\n * // Create records\n * const records = await langwatch.datasets.createRecords(\"my-dataset\", [\n * { input: \"hello\", output: \"world\" },\n * ]);\n *\n * // Update a record\n * const record = await langwatch.datasets.updateRecord(\"my-dataset\", \"rec-1\", { input: \"updated\" });\n *\n * // Delete records\n * const result = await langwatch.datasets.deleteRecords(\"my-dataset\", [\"rec-1\", \"rec-2\"]);\n *\n * // Upload a file (append to existing or create new)\n * const uploadResult = await langwatch.datasets.upload(\"my-dataset\", file);\n *\n * // Upload with replace strategy (delete all records first)\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"replace\" });\n * ```\n */\nexport class DatasetsFacade {\n readonly #datasetService: DatasetService;\n\n constructor(config: DatasetsFacadeConfig) {\n this.#datasetService = new DatasetService(config);\n }\n\n /**\n * Lists all datasets for the project, with optional pagination.\n *\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of datasets with metadata\n */\n list = (options?: ListDatasetsOptions): Promise<ListDatasetsApiResponse> => {\n return this.#datasetService.listDatasets(options);\n };\n\n /**\n * Creates a new dataset.\n *\n * @param options - Dataset creation options (name, columnTypes)\n * @returns The created dataset metadata\n */\n create = (options: CreateDatasetOptions): Promise<DatasetMetadata> => {\n if (!options.name || options.name.trim().length === 0) {\n throw new DatasetValidationError(\"Dataset name must not be empty\");\n }\n return this.#datasetService.createDataset(options);\n };\n\n /**\n * Fetches a dataset by its slug or ID, returning metadata and entries.\n *\n * @param slugOrId - The slug or ID of the dataset to fetch\n * @param options - Optional configuration\n * @returns The dataset with metadata and entries\n *\n * @example\n * ```typescript\n * // Get dataset by slug\n * const dataset = await langwatch.datasets.get(\"product-qa\");\n *\n * // Typed dataset\n * type MyDatasetEntry = { input: string; expected_output: string; };\n * const dataset = await langwatch.datasets.get<MyDatasetEntry>(\"my-dataset\");\n *\n * // Iterate over entries\n * for (const entry of dataset.entries) {\n * console.log(entry.entry.input);\n * }\n * ```\n */\n get = <T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n options?: GetDatasetOptions\n ): Promise<Dataset<T>> => {\n return this.#datasetService.getDataset<T>(slugOrId, options);\n };\n\n /**\n * Updates a dataset by its slug or ID.\n *\n * @param slugOrId - The slug or ID of the dataset to update\n * @param options - Fields to update (name, columnTypes)\n * @returns The updated dataset metadata\n */\n update = (slugOrId: string, options: UpdateDatasetOptions): Promise<DatasetMetadata> => {\n if (options.name == null && options.columnTypes == null) {\n throw new DatasetValidationError(\n \"At least one field (name or columnTypes) must be provided for update\",\n );\n }\n return this.#datasetService.updateDataset(slugOrId, options);\n };\n\n /**\n * Deletes (archives) a dataset by its slug or ID.\n *\n * @param slugOrId - The slug or ID of the dataset to delete\n * @returns The archived dataset metadata\n */\n delete = (slugOrId: string): Promise<DatasetMetadata> => {\n return this.#datasetService.deleteDataset(slugOrId);\n };\n\n /**\n * Creates records in a dataset in batch.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param entries - Array of record entries to create\n * @returns The created records with IDs\n */\n createRecords = (\n slugOrId: string,\n entries: Record<string, unknown>[],\n ): Promise<BatchCreateRecordsResponse> => {\n if (!entries || entries.length === 0) {\n throw new DatasetValidationError(\"Entries must not be empty\");\n }\n return this.#datasetService.createRecords(slugOrId, entries);\n };\n\n /**\n * Updates a single record in a dataset.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param recordId - The ID of the record to update\n * @param entry - The updated entry data\n * @returns The updated record\n */\n updateRecord = (\n slugOrId: string,\n recordId: string,\n entry: Record<string, unknown>,\n ): Promise<DatasetRecordResponse> => {\n return this.#datasetService.updateRecord(slugOrId, recordId, entry);\n };\n\n /**\n * Deletes records from a dataset by IDs.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param recordIds - Array of record IDs to delete\n * @returns Object with the count of deleted records\n */\n deleteRecords = (\n slugOrId: string,\n recordIds: string[],\n ): Promise<DeleteRecordsResponse> => {\n return this.#datasetService.deleteRecords(slugOrId, recordIds);\n };\n\n /**\n * Lists records in a dataset with optional pagination.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of records\n *\n * @example\n * ```typescript\n * // List first page of records\n * const result = await langwatch.datasets.listRecords(\"my-dataset\");\n *\n * // With pagination\n * const page2 = await langwatch.datasets.listRecords(\"my-dataset\", { page: 2, limit: 25 });\n * ```\n */\n listRecords = (\n slugOrId: string,\n options?: ListRecordsOptions,\n ): Promise<ListRecordsApiResponse> => {\n return this.#datasetService.listRecords(slugOrId, options);\n };\n\n /**\n * Uploads a file to a dataset with a configurable strategy for handling existing datasets.\n *\n * Strategies:\n * - `\"append\"` (default): Upload to existing dataset; if not found, create a new one.\n * - `\"replace\"`: Delete all existing records, then upload; if not found, create a new one.\n * - `\"error\"`: Throw a 409 error if the dataset already exists; if not found, create a new one.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param file - The file to upload (File or Blob)\n * @param options - Upload options including the ifExists strategy\n * @returns The upload result\n *\n * @example\n * ```typescript\n * const file = new File([\"input,output\\nhello,world\"], \"data.csv\", { type: \"text/csv\" });\n *\n * // Append to existing or create new\n * await langwatch.datasets.upload(\"my-dataset\", file);\n *\n * // Replace all records\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"replace\" });\n *\n * // Fail if dataset already exists\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"error\" });\n * ```\n */\n upload = (\n slugOrId: string,\n file: File | Blob,\n options?: {\n ifExists?: \"append\" | \"replace\" | \"error\";\n },\n ): Promise<UploadResponse> => {\n if (!file) {\n throw new DatasetValidationError(\"File must be provided for upload\");\n }\n return this.#datasetService.uploadWithStrategy(\n slugOrId,\n file,\n options?.ifExists ?? \"append\",\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-CGFG5FCC.js","../src/client-sdk/services/datasets/errors.ts","../src/client-sdk/services/datasets/tracing/tracer.ts","../src/client-sdk/services/datasets/dataset.service.ts","../src/client-sdk/services/datasets/datasets.facade.ts"],"names":["errorMessage"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-CGFG5FCC.js","sourcesContent":[null,"/**\n * Errors for the Dataset API\n */\n\n/**\n * Base error for all dataset operations.\n */\nexport class DatasetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetError\";\n }\n}\n\n/**\n * Thrown when a dataset is not found (404).\n */\nexport class DatasetNotFoundError extends DatasetError {\n constructor(slugOrId: string) {\n super(`Dataset not found: ${slugOrId}`);\n this.name = \"DatasetNotFoundError\";\n }\n}\n\n/**\n * Error from the Dataset API with operation context.\n * Aligns with PromptsApiError pattern: includes operation and originalError fields.\n */\nexport class DatasetApiError extends DatasetError {\n readonly status: number;\n readonly operation: string;\n readonly originalError?: unknown;\n\n constructor(message: string, status: number, operation: string, originalError?: unknown) {\n super(message);\n this.name = \"DatasetApiError\";\n this.status = status;\n this.operation = operation;\n this.originalError = originalError;\n }\n}\n\n/**\n * Thrown for client-side validation failures (e.g. empty name, no update fields, empty entries).\n * Distinguished from DatasetApiError which represents server-side errors.\n */\nexport class DatasetValidationError extends DatasetError {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetValidationError\";\n }\n}\n\n/**\n * Thrown when a dataset operation exceeds the plan limit (403).\n * The message includes the upgrade/subscription URL from the server.\n */\nexport class DatasetPlanLimitError extends DatasetError {\n readonly limitType: string;\n readonly current?: number;\n readonly max?: number;\n\n constructor(message: string, originalError?: unknown) {\n super(message);\n this.name = \"DatasetPlanLimitError\";\n\n if (originalError != null && typeof originalError === \"object\") {\n const err = originalError as Record<string, unknown>;\n this.limitType = typeof err.limitType === \"string\" ? err.limitType : \"datasets\";\n this.current = typeof err.current === \"number\" ? err.current : undefined;\n this.max = typeof err.max === \"number\" ? err.max : undefined;\n } else {\n this.limitType = \"datasets\";\n }\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}.datasets`, LANGWATCH_SDK_VERSION);\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport {\n type Dataset,\n type DatasetEntry,\n type DatasetMetadata,\n type GetDatasetApiResponse,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type CreateFromUploadOptions,\n type CreateFromUploadResponse,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./types\";\nimport { DatasetApiError, DatasetNotFoundError, DatasetPlanLimitError } from \"./errors\";\nimport { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { tracer } from \"./tracing\";\n\ntype DatasetServiceConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n endpoint: string;\n apiKey: string;\n};\n\n/**\n * Service for managing dataset resources via the LangWatch API.\n *\n * Responsibilities:\n * - CRUD operations for datasets\n * - Record management (create, update, delete)\n * - File upload\n * - Error handling with contextual information\n */\nexport class DatasetService {\n private readonly config: DatasetServiceConfig;\n\n constructor(config: DatasetServiceConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy that automatically creates\n * OpenTelemetry spans for all public methods.\n */\n return createTracingProxy(this as DatasetService, tracer);\n }\n\n /**\n * Handles API errors by mapping status codes to appropriate error types.\n * @param operation - Description of the operation being performed\n * @param error - The error object from the API response\n * @param status - The HTTP status code\n * @param slugOrId - The dataset identifier (only passed for operations targeting an existing resource)\n */\n private handleApiError(operation: string, error: unknown, status: number, slugOrId?: string): never {\n if (status === 404 && slugOrId) {\n throw new DatasetNotFoundError(slugOrId);\n }\n\n if (status === 403) {\n const errorMessage = this.extractErrorMessage(error, status);\n throw new DatasetPlanLimitError(errorMessage, error);\n }\n\n const errorMessage = this.extractErrorMessage(error, status);\n\n throw new DatasetApiError(\n `Failed to ${operation}: ${errorMessage}`,\n status,\n operation,\n error,\n );\n }\n\n /**\n * Extracts a human-readable error message from an API error response.\n */\n private extractErrorMessage(error: unknown, status: number): string {\n if (typeof error === \"string\") return error;\n\n if (error != null && typeof error === \"object\") {\n if (\"message\" in error && typeof (error as { message: unknown }).message === \"string\") {\n return (error as { message: string }).message;\n }\n if (\"error\" in error) {\n const inner = (error as { error: unknown }).error;\n if (typeof inner === \"string\") return inner;\n if (inner != null && typeof inner === \"object\" && \"message\" in inner) {\n return (inner as { message: string }).message ?? JSON.stringify(inner);\n }\n }\n }\n\n return `HTTP ${status}`;\n }\n\n /**\n * Wrapper for API calls to endpoints not yet in the generated OpenAPI types.\n * Quarantines `as any` casts to a single location.\n */\n private untypedRequest<M extends 'GET' | 'POST' | 'PATCH' | 'DELETE'>(\n method: M,\n path: string,\n options?: Record<string, unknown>,\n ) {\n return (this.config.langwatchApiClient[method] as any)(path, options);\n }\n\n /**\n * Unwraps an API response, throwing a mapped error if the response contains an error.\n * Centralizes the repeated `if (error) handleApiError; return data` pattern.\n */\n private unwrapResponse<T>(\n response: { data?: unknown; error?: unknown; response: { status: number } },\n operation: string,\n slugOrId?: string,\n ): T {\n if (response.error) {\n this.handleApiError(operation, response.error, response.response.status, slugOrId);\n }\n return response.data as T;\n }\n\n /**\n * Fetches a dataset by its slug or ID, returning metadata and entries.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param _options - Optional configuration\n * @returns The dataset with metadata and entries\n */\n async getDataset<T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n _options?: GetDatasetOptions\n ): Promise<Dataset<T>> {\n this.config.logger.debug(`Fetching dataset: ${slugOrId}`);\n\n const response = await this.config.langwatchApiClient.GET(\n \"/api/dataset/{slugOrId}\",\n {\n params: {\n path: {\n slugOrId,\n },\n },\n }\n );\n\n const data = this.unwrapResponse<GetDatasetApiResponse>(\n response,\n `fetch dataset \"${slugOrId}\"`,\n slugOrId,\n );\n\n const entries: DatasetEntry<T>[] = data.data.map((item) => ({\n id: item.id,\n datasetId: item.datasetId,\n projectId: item.projectId,\n entry: item.entry as T,\n createdAt: item.createdAt,\n updatedAt: item.updatedAt,\n }));\n\n this.config.logger.debug(\n `Fetched dataset ${slugOrId} with ${entries.length} entries`\n );\n\n return {\n id: data.id,\n name: data.name,\n slug: data.slug,\n columnTypes: data.columnTypes,\n createdAt: data.createdAt,\n updatedAt: data.updatedAt,\n entries,\n };\n }\n\n /**\n * Lists all datasets for the project, with optional pagination.\n */\n async listDatasets(options?: ListDatasetsOptions): Promise<ListDatasetsApiResponse> {\n this.config.logger.debug(\"Listing datasets\");\n\n const response = await this.untypedRequest('GET', '/api/dataset', {\n params: {\n query: {\n page: options?.page,\n limit: options?.limit,\n },\n },\n });\n\n return this.unwrapResponse<ListDatasetsApiResponse>(\n response,\n \"list datasets\",\n );\n }\n\n /**\n * Creates a new dataset.\n */\n async createDataset(options: CreateDatasetOptions): Promise<DatasetMetadata> {\n this.config.logger.debug(`Creating dataset: ${options.name}`);\n\n const response = await this.untypedRequest('POST', '/api/dataset', {\n body: {\n name: options.name,\n columnTypes: options.columnTypes ?? [],\n },\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `create dataset \"${options.name}\"`,\n );\n }\n\n /**\n * Updates a dataset by its slug or ID.\n */\n async updateDataset(slugOrId: string, options: UpdateDatasetOptions): Promise<DatasetMetadata> {\n this.config.logger.debug(`Updating dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('PATCH', '/api/dataset/{slugOrId}', {\n params: {\n path: { slugOrId },\n },\n body: options,\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `update dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Deletes (archives) a dataset by its slug or ID.\n */\n async deleteDataset(slugOrId: string): Promise<DatasetMetadata> {\n this.config.logger.debug(`Deleting dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('DELETE', '/api/dataset/{slugOrId}', {\n params: {\n path: { slugOrId },\n },\n });\n\n return this.unwrapResponse<DatasetMetadata>(\n response,\n `delete dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Creates records in a dataset in batch.\n */\n async createRecords(\n slugOrId: string,\n entries: Record<string, unknown>[],\n ): Promise<BatchCreateRecordsResponse> {\n this.config.logger.debug(`Creating ${entries.length} records in dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('POST', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n },\n body: { entries },\n });\n\n return this.unwrapResponse<BatchCreateRecordsResponse>(\n response,\n `create records in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Updates a single record in a dataset.\n */\n async updateRecord(\n slugOrId: string,\n recordId: string,\n entry: Record<string, unknown>,\n ): Promise<DatasetRecordResponse> {\n this.config.logger.debug(`Updating record ${recordId} in dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('PATCH', '/api/dataset/{slugOrId}/records/{recordId}', {\n params: {\n path: { slugOrId, recordId },\n },\n body: { entry },\n });\n\n return this.unwrapResponse<DatasetRecordResponse>(\n response,\n `update record \"${recordId}\" in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Deletes records from a dataset by IDs.\n */\n async deleteRecords(\n slugOrId: string,\n recordIds: string[],\n ): Promise<DeleteRecordsResponse> {\n this.config.logger.debug(`Deleting ${recordIds.length} records from dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('DELETE', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n },\n body: { recordIds },\n });\n\n return this.unwrapResponse<DeleteRecordsResponse>(\n response,\n `delete records from dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Lists records in a dataset with optional pagination.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of records\n */\n async listRecords(\n slugOrId: string,\n options?: ListRecordsOptions,\n ): Promise<ListRecordsApiResponse> {\n this.config.logger.debug(`Listing records for dataset: ${slugOrId}`);\n\n const response = await this.untypedRequest('GET', '/api/dataset/{slugOrId}/records', {\n params: {\n path: { slugOrId },\n query: {\n page: options?.page,\n limit: options?.limit,\n },\n },\n });\n\n return this.unwrapResponse<ListRecordsApiResponse>(\n response,\n `list records in dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n\n /**\n * Sends a multipart/form-data request using raw fetch.\n * openapi-fetch hardcodes content-type: application/json, so file uploads\n * must bypass it. This helper centralizes URL building, auth headers,\n * error parsing, and response unwrapping.\n *\n * @param path - The API path (appended to the endpoint)\n * @param formData - The FormData payload\n * @param operation - Human-readable operation name for error messages\n * @param slugOrId - Optional dataset identifier (passed to handleApiError for 404 mapping)\n */\n private async fetchMultipart<T>(\n path: string,\n formData: FormData,\n operation: string,\n slugOrId?: string,\n ): Promise<T> {\n const { endpoint, apiKey } = this.config;\n const url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Auth-Token\": apiKey,\n authorization: `Bearer ${apiKey}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const rawBody = await response.text();\n let errorBody: unknown = rawBody;\n if (rawBody) {\n try {\n errorBody = JSON.parse(rawBody);\n } catch {\n // Keep the plain-text body.\n }\n }\n\n this.handleApiError(operation, errorBody, response.status, slugOrId);\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Creates a new dataset from a file upload.\n *\n * @param options - The dataset name and file to upload\n * @returns The created dataset metadata with record count\n */\n async createDatasetFromUpload(\n options: CreateFromUploadOptions,\n ): Promise<CreateFromUploadResponse> {\n this.config.logger.debug(`Creating dataset from upload: ${options.name}`);\n\n const formData = new FormData();\n formData.append(\"name\", options.name);\n formData.append(\"file\", options.file);\n\n return this.fetchMultipart<CreateFromUploadResponse>(\n \"/api/dataset/upload\",\n formData,\n `create dataset from upload \"${options.name}\"`,\n );\n }\n\n /**\n * Uploads a file with a strategy for handling existing datasets.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param file - The file to upload (File or Blob)\n * @param ifExists - Strategy when dataset exists: \"append\" (default), \"replace\", or \"error\"\n * @returns The upload result\n */\n async uploadWithStrategy(\n slugOrId: string,\n file: File | Blob,\n ifExists: \"append\" | \"replace\" | \"error\" = \"append\",\n ): Promise<UploadResponse> {\n switch (ifExists) {\n case \"append\":\n return this._uploadAppend(slugOrId, file);\n case \"replace\":\n return this._uploadReplace(slugOrId, file);\n case \"error\":\n return this._uploadError(slugOrId, file);\n }\n }\n\n /**\n * Converts a CreateFromUploadResponse to the unified UploadResponse shape.\n */\n private toUploadResponse(result: CreateFromUploadResponse): UploadResponse {\n return {\n dataset: {\n id: result.id,\n name: result.name,\n slug: result.slug,\n columnTypes: result.columnTypes,\n createdAt: result.createdAt,\n updatedAt: result.updatedAt,\n },\n recordsCreated: result.recordsCreated,\n datasetId: result.id,\n };\n }\n\n /**\n * Append strategy: try uploading to existing dataset; if not found, create from file.\n */\n private async _uploadAppend(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n try {\n return await this.uploadFile(slugOrId, file);\n } catch (error) {\n if (error instanceof DatasetNotFoundError) {\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n throw error;\n }\n }\n\n /**\n * Replace strategy: if dataset exists, delete all records then upload; if not found, create from file.\n */\n private async _uploadReplace(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n try {\n await this.getDataset(slugOrId);\n await this._deleteAllRecords(slugOrId);\n return await this.uploadFile(slugOrId, file);\n } catch (error) {\n if (error instanceof DatasetNotFoundError) {\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n throw error;\n }\n }\n\n /**\n * Error strategy: if dataset exists, throw 409; if not found, create from file.\n */\n private async _uploadError(slugOrId: string, file: File | Blob): Promise<UploadResponse> {\n let datasetExists = false;\n try {\n await this.getDataset(slugOrId);\n datasetExists = true;\n } catch (error) {\n if (!(error instanceof DatasetNotFoundError)) {\n throw error;\n }\n }\n\n if (datasetExists) {\n throw new DatasetApiError(\n `Dataset already exists: ${slugOrId}`,\n 409,\n \"upload\",\n );\n }\n\n return this.toUploadResponse(await this.createDatasetFromUpload({ name: slugOrId, file }));\n }\n\n /**\n * Deletes all records from a dataset by iterating through pages.\n * Always fetches page 1 since records shift after deletion.\n * Includes a safety valve to prevent infinite loops.\n */\n private async _deleteAllRecords(slugOrId: string): Promise<void> {\n const BATCH_SIZE = 1000;\n const MAX_DELETE_ITERATIONS = 100;\n\n let iteration = 0;\n while (iteration < MAX_DELETE_ITERATIONS) {\n const page = await this.listRecords(slugOrId, { page: 1, limit: BATCH_SIZE });\n if (page.data.length === 0) {\n return;\n }\n\n const ids = page.data.map((record) => record.id);\n await this.deleteRecords(slugOrId, ids);\n iteration++;\n }\n\n throw new DatasetApiError(\n `Failed to delete all records from dataset \"${slugOrId}\": exceeded ${MAX_DELETE_ITERATIONS} iterations`,\n 0,\n `delete all records from dataset \"${slugOrId}\"`,\n );\n }\n\n /**\n * Uploads a file to an existing dataset.\n */\n async uploadFile(\n slugOrId: string,\n file: File | Blob,\n ): Promise<UploadResponse> {\n this.config.logger.debug(`Uploading file to dataset: ${slugOrId}`);\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n return this.fetchMultipart<UploadResponse>(\n `/api/dataset/${encodeURIComponent(slugOrId)}/upload`,\n formData,\n `upload file to dataset \"${slugOrId}\"`,\n slugOrId,\n );\n }\n}\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport { DatasetService } from \"./dataset.service\";\nimport { DatasetValidationError } from \"./errors\";\nimport {\n type Dataset,\n type DatasetMetadata,\n type GetDatasetOptions,\n type ListDatasetsOptions,\n type ListDatasetsApiResponse,\n type ListRecordsOptions,\n type ListRecordsApiResponse,\n type CreateDatasetOptions,\n type UpdateDatasetOptions,\n type BatchCreateRecordsResponse,\n type DeleteRecordsResponse,\n type UploadResponse,\n type DatasetRecordResponse,\n} from \"./types\";\n\ntype DatasetsFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n endpoint: string;\n apiKey: string;\n};\n\n/**\n * Facade for dataset operations in the LangWatch SDK.\n * Provides a simplified interface for managing datasets, records, and file uploads.\n *\n * @example\n * ```typescript\n * const langwatch = new LangWatch({ apiKey: \"your-api-key\" });\n *\n * // List all datasets\n * const datasets = await langwatch.datasets.list();\n *\n * // Get a dataset by slug or ID\n * const dataset = await langwatch.datasets.get(\"my-dataset\");\n *\n * // Create a new dataset\n * const newDataset = await langwatch.datasets.create({\n * name: \"my-dataset\",\n * columnTypes: [{ name: \"input\", type: \"string\" }],\n * });\n *\n * // Update a dataset\n * const updated = await langwatch.datasets.update(\"my-dataset\", { name: \"new-name\" });\n *\n * // Delete a dataset\n * const archived = await langwatch.datasets.delete(\"my-dataset\");\n *\n * // Create records\n * const records = await langwatch.datasets.createRecords(\"my-dataset\", [\n * { input: \"hello\", output: \"world\" },\n * ]);\n *\n * // Update a record\n * const record = await langwatch.datasets.updateRecord(\"my-dataset\", \"rec-1\", { input: \"updated\" });\n *\n * // Delete records\n * const result = await langwatch.datasets.deleteRecords(\"my-dataset\", [\"rec-1\", \"rec-2\"]);\n *\n * // Upload a file (append to existing or create new)\n * const uploadResult = await langwatch.datasets.upload(\"my-dataset\", file);\n *\n * // Upload with replace strategy (delete all records first)\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"replace\" });\n * ```\n */\nexport class DatasetsFacade {\n readonly #datasetService: DatasetService;\n\n constructor(config: DatasetsFacadeConfig) {\n this.#datasetService = new DatasetService(config);\n }\n\n /**\n * Lists all datasets for the project, with optional pagination.\n *\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of datasets with metadata\n */\n list = (options?: ListDatasetsOptions): Promise<ListDatasetsApiResponse> => {\n return this.#datasetService.listDatasets(options);\n };\n\n /**\n * Creates a new dataset.\n *\n * @param options - Dataset creation options (name, columnTypes)\n * @returns The created dataset metadata\n */\n create = (options: CreateDatasetOptions): Promise<DatasetMetadata> => {\n if (!options.name || options.name.trim().length === 0) {\n throw new DatasetValidationError(\"Dataset name must not be empty\");\n }\n return this.#datasetService.createDataset(options);\n };\n\n /**\n * Fetches a dataset by its slug or ID, returning metadata and entries.\n *\n * @param slugOrId - The slug or ID of the dataset to fetch\n * @param options - Optional configuration\n * @returns The dataset with metadata and entries\n *\n * @example\n * ```typescript\n * // Get dataset by slug\n * const dataset = await langwatch.datasets.get(\"product-qa\");\n *\n * // Typed dataset\n * type MyDatasetEntry = { input: string; expected_output: string; };\n * const dataset = await langwatch.datasets.get<MyDatasetEntry>(\"my-dataset\");\n *\n * // Iterate over entries\n * for (const entry of dataset.entries) {\n * console.log(entry.entry.input);\n * }\n * ```\n */\n get = <T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n options?: GetDatasetOptions\n ): Promise<Dataset<T>> => {\n return this.#datasetService.getDataset<T>(slugOrId, options);\n };\n\n /**\n * Updates a dataset by its slug or ID.\n *\n * @param slugOrId - The slug or ID of the dataset to update\n * @param options - Fields to update (name, columnTypes)\n * @returns The updated dataset metadata\n */\n update = (slugOrId: string, options: UpdateDatasetOptions): Promise<DatasetMetadata> => {\n if (options.name == null && options.columnTypes == null) {\n throw new DatasetValidationError(\n \"At least one field (name or columnTypes) must be provided for update\",\n );\n }\n return this.#datasetService.updateDataset(slugOrId, options);\n };\n\n /**\n * Deletes (archives) a dataset by its slug or ID.\n *\n * @param slugOrId - The slug or ID of the dataset to delete\n * @returns The archived dataset metadata\n */\n delete = (slugOrId: string): Promise<DatasetMetadata> => {\n return this.#datasetService.deleteDataset(slugOrId);\n };\n\n /**\n * Creates records in a dataset in batch.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param entries - Array of record entries to create\n * @returns The created records with IDs\n */\n createRecords = (\n slugOrId: string,\n entries: Record<string, unknown>[],\n ): Promise<BatchCreateRecordsResponse> => {\n if (!entries || entries.length === 0) {\n throw new DatasetValidationError(\"Entries must not be empty\");\n }\n return this.#datasetService.createRecords(slugOrId, entries);\n };\n\n /**\n * Updates a single record in a dataset.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param recordId - The ID of the record to update\n * @param entry - The updated entry data\n * @returns The updated record\n */\n updateRecord = (\n slugOrId: string,\n recordId: string,\n entry: Record<string, unknown>,\n ): Promise<DatasetRecordResponse> => {\n return this.#datasetService.updateRecord(slugOrId, recordId, entry);\n };\n\n /**\n * Deletes records from a dataset by IDs.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param recordIds - Array of record IDs to delete\n * @returns Object with the count of deleted records\n */\n deleteRecords = (\n slugOrId: string,\n recordIds: string[],\n ): Promise<DeleteRecordsResponse> => {\n return this.#datasetService.deleteRecords(slugOrId, recordIds);\n };\n\n /**\n * Lists records in a dataset with optional pagination.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param options - Pagination options (page, limit)\n * @returns Paginated list of records\n *\n * @example\n * ```typescript\n * // List first page of records\n * const result = await langwatch.datasets.listRecords(\"my-dataset\");\n *\n * // With pagination\n * const page2 = await langwatch.datasets.listRecords(\"my-dataset\", { page: 2, limit: 25 });\n * ```\n */\n listRecords = (\n slugOrId: string,\n options?: ListRecordsOptions,\n ): Promise<ListRecordsApiResponse> => {\n return this.#datasetService.listRecords(slugOrId, options);\n };\n\n /**\n * Uploads a file to a dataset with a configurable strategy for handling existing datasets.\n *\n * Strategies:\n * - `\"append\"` (default): Upload to existing dataset; if not found, create a new one.\n * - `\"replace\"`: Delete all existing records, then upload; if not found, create a new one.\n * - `\"error\"`: Throw a 409 error if the dataset already exists; if not found, create a new one.\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param file - The file to upload (File or Blob)\n * @param options - Upload options including the ifExists strategy\n * @returns The upload result\n *\n * @example\n * ```typescript\n * const file = new File([\"input,output\\nhello,world\"], \"data.csv\", { type: \"text/csv\" });\n *\n * // Append to existing or create new\n * await langwatch.datasets.upload(\"my-dataset\", file);\n *\n * // Replace all records\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"replace\" });\n *\n * // Fail if dataset already exists\n * await langwatch.datasets.upload(\"my-dataset\", file, { ifExists: \"error\" });\n * ```\n */\n upload = (\n slugOrId: string,\n file: File | Blob,\n options?: {\n ifExists?: \"append\" | \"replace\" | \"error\";\n },\n ): Promise<UploadResponse> => {\n if (!file) {\n throw new DatasetValidationError(\"File must be provided for upload\");\n }\n return this.#datasetService.uploadWithStrategy(\n slugOrId,\n file,\n options?.ifExists ?? \"append\",\n );\n };\n}\n"]}
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
LangWatchLogsExporter,
|
|
3
3
|
LangWatchTraceExporter,
|
|
4
4
|
setLangWatchLoggerProvider
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LULJYN3P.mjs";
|
|
6
6
|
import {
|
|
7
7
|
DEFAULT_ENDPOINT,
|
|
8
8
|
DEFAULT_SERVICE_NAME,
|
|
9
9
|
LANGWATCH_SDK_LANGUAGE,
|
|
10
10
|
LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
11
11
|
LANGWATCH_SDK_VERSION
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-LN33ZL4Z.mjs";
|
|
13
13
|
import {
|
|
14
14
|
initializeObservabilitySdkConfig
|
|
15
15
|
} from "./chunk-RKJDDUGQ.mjs";
|
|
@@ -331,4 +331,4 @@ export {
|
|
|
331
331
|
setupObservability,
|
|
332
332
|
ensureSetup
|
|
333
333
|
};
|
|
334
|
-
//# sourceMappingURL=chunk-
|
|
334
|
+
//# sourceMappingURL=chunk-COKOLKOR.mjs.map
|