@langwatch/mcp-server 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/Dockerfile +22 -0
  3. package/README.md +51 -8
  4. package/dist/{archive-scenario-YFD5THOR.js → archive-scenario-WJ2A7ETN.js} +4 -4
  5. package/dist/archive-suite-4JOM4SSL.js +15 -0
  6. package/dist/archive-suite-4JOM4SSL.js.map +1 -0
  7. package/dist/assign-prompt-tag-GL7EAAF3.js +19 -0
  8. package/dist/assign-prompt-tag-GL7EAAF3.js.map +1 -0
  9. package/dist/{chunk-6U4TCGFC.js → chunk-2GT7IFWK.js} +2 -2
  10. package/dist/{chunk-LLRQIF52.js → chunk-2WPLXEKF.js} +49 -5
  11. package/dist/chunk-2WPLXEKF.js.map +1 -0
  12. package/dist/chunk-4AUB2BIA.js +71 -0
  13. package/dist/chunk-4AUB2BIA.js.map +1 -0
  14. package/dist/chunk-BWWY5KEF.js +71 -0
  15. package/dist/chunk-BWWY5KEF.js.map +1 -0
  16. package/dist/{chunk-IX6QJKAD.js → chunk-CCWCIJJ3.js} +2 -2
  17. package/dist/chunk-E5JYYU3J.js +1567 -0
  18. package/dist/chunk-E5JYYU3J.js.map +1 -0
  19. package/dist/chunk-EGH5RPXM.js +25 -0
  20. package/dist/chunk-EGH5RPXM.js.map +1 -0
  21. package/dist/chunk-EUQDVOSU.js +39 -0
  22. package/dist/chunk-EUQDVOSU.js.map +1 -0
  23. package/dist/{chunk-5UOPNRXW.js → chunk-HYMIWO3U.js} +10 -3
  24. package/dist/{chunk-5UOPNRXW.js.map → chunk-HYMIWO3U.js.map} +1 -1
  25. package/dist/chunk-IE4M5OGE.js +42 -0
  26. package/dist/chunk-IE4M5OGE.js.map +1 -0
  27. package/dist/chunk-LUMEZEHL.js +48 -0
  28. package/dist/chunk-LUMEZEHL.js.map +1 -0
  29. package/dist/chunk-NUFPTHKU.js +9 -0
  30. package/dist/chunk-NUFPTHKU.js.map +1 -0
  31. package/dist/chunk-WQG2DFHX.js +86 -0
  32. package/dist/chunk-WQG2DFHX.js.map +1 -0
  33. package/dist/chunk-WVI5CJ6S.js +21 -0
  34. package/dist/chunk-WVI5CJ6S.js.map +1 -0
  35. package/dist/chunk-ZVS4UKN2.js +35 -0
  36. package/dist/chunk-ZVS4UKN2.js.map +1 -0
  37. package/dist/config.d.ts +17 -0
  38. package/dist/config.js +13 -0
  39. package/dist/create-agent-MBOOT3XK.js +23 -0
  40. package/dist/create-agent-MBOOT3XK.js.map +1 -0
  41. package/dist/create-annotation-XMV6A7ED.js +24 -0
  42. package/dist/create-annotation-XMV6A7ED.js.map +1 -0
  43. package/dist/create-dashboard-VRKLFVZJ.js +18 -0
  44. package/dist/create-dashboard-VRKLFVZJ.js.map +1 -0
  45. package/dist/create-dataset-7HQPZCRE.js +22 -0
  46. package/dist/create-dataset-7HQPZCRE.js.map +1 -0
  47. package/dist/create-dataset-records-2NIVFYTV.js +22 -0
  48. package/dist/create-dataset-records-2NIVFYTV.js.map +1 -0
  49. package/dist/{create-evaluator-E5X5ZP3B.js → create-evaluator-WYFRFLRC.js} +4 -4
  50. package/dist/create-mcp-server.d.ts +8 -0
  51. package/dist/create-mcp-server.js +8 -0
  52. package/dist/create-mcp-server.js.map +1 -0
  53. package/dist/{create-prompt-7Z35MIL6.js → create-prompt-IEN7O6JT.js} +7 -4
  54. package/dist/create-prompt-IEN7O6JT.js.map +1 -0
  55. package/dist/create-prompt-tag-CAEZ45VO.js +17 -0
  56. package/dist/create-prompt-tag-CAEZ45VO.js.map +1 -0
  57. package/dist/{create-scenario-DIMPJRPY.js → create-scenario-6YHSMGLP.js} +4 -4
  58. package/dist/create-suite-H5XOFDE5.js +38 -0
  59. package/dist/create-suite-H5XOFDE5.js.map +1 -0
  60. package/dist/delete-agent-JKTNBWAA.js +18 -0
  61. package/dist/delete-agent-JKTNBWAA.js.map +1 -0
  62. package/dist/delete-annotation-ACMDV6QO.js +17 -0
  63. package/dist/delete-annotation-ACMDV6QO.js.map +1 -0
  64. package/dist/delete-dashboard-VJSR7CRU.js +18 -0
  65. package/dist/delete-dashboard-VJSR7CRU.js.map +1 -0
  66. package/dist/delete-dataset-RTTTWP4D.js +20 -0
  67. package/dist/delete-dataset-RTTTWP4D.js.map +1 -0
  68. package/dist/delete-dataset-records-KNQTIPQK.js +21 -0
  69. package/dist/delete-dataset-records-KNQTIPQK.js.map +1 -0
  70. package/dist/delete-evaluator-7FVC5WM4.js +15 -0
  71. package/dist/delete-evaluator-7FVC5WM4.js.map +1 -0
  72. package/dist/delete-prompt-tag-ZMZUAGFW.js +17 -0
  73. package/dist/delete-prompt-tag-ZMZUAGFW.js.map +1 -0
  74. package/dist/delete-workflow-EYQ3T4RQ.js +17 -0
  75. package/dist/delete-workflow-EYQ3T4RQ.js.map +1 -0
  76. package/dist/get-agent-E3QSTVKG.js +28 -0
  77. package/dist/get-agent-E3QSTVKG.js.map +1 -0
  78. package/dist/{get-analytics-4YJW4S5L.js → get-analytics-2OHV763I.js} +22 -5
  79. package/dist/get-analytics-2OHV763I.js.map +1 -0
  80. package/dist/get-dashboard-PC7JDHH6.js +29 -0
  81. package/dist/get-dashboard-PC7JDHH6.js.map +1 -0
  82. package/dist/get-dataset-H5IK5FVU.js +48 -0
  83. package/dist/get-dataset-H5IK5FVU.js.map +1 -0
  84. package/dist/{get-evaluator-WDEH2F7M.js → get-evaluator-UWVUPYTM.js} +4 -4
  85. package/dist/{get-prompt-F6PDVC76.js → get-prompt-WZUOLLQC.js} +4 -4
  86. package/dist/get-prompt-WZUOLLQC.js.map +1 -0
  87. package/dist/{get-scenario-H24ZYNT5.js → get-scenario-Q6LCNUYN.js} +4 -4
  88. package/dist/get-simulation-run-Z2XKO256.js +56 -0
  89. package/dist/get-simulation-run-Z2XKO256.js.map +1 -0
  90. package/dist/get-suite-BXK5TN7P.js +44 -0
  91. package/dist/get-suite-BXK5TN7P.js.map +1 -0
  92. package/dist/{get-trace-27USKGO7.js → get-trace-4EJAYVBG.js} +3 -3
  93. package/dist/get-workflow-O34QJLHD.js +25 -0
  94. package/dist/get-workflow-O34QJLHD.js.map +1 -0
  95. package/dist/http-server-ISHF7NJX.js +224 -0
  96. package/dist/http-server-ISHF7NJX.js.map +1 -0
  97. package/dist/index.js +61109 -31519
  98. package/dist/index.js.map +1 -1
  99. package/dist/langwatch-api-annotations-ERBG27RF.js +17 -0
  100. package/dist/langwatch-api-annotations-ERBG27RF.js.map +1 -0
  101. package/dist/langwatch-api-dashboards-G6TR7VVO.js +17 -0
  102. package/dist/langwatch-api-dashboards-G6TR7VVO.js.map +1 -0
  103. package/dist/langwatch-api-monitors-WSXZLS2B.js +52 -0
  104. package/dist/langwatch-api-monitors-WSXZLS2B.js.map +1 -0
  105. package/dist/langwatch-api-secrets-RR5DKG2X.js +40 -0
  106. package/dist/langwatch-api-secrets-RR5DKG2X.js.map +1 -0
  107. package/dist/langwatch-api-triggers-2RTNSWQY.js +30 -0
  108. package/dist/langwatch-api-triggers-2RTNSWQY.js.map +1 -0
  109. package/dist/langwatch-api-workflows-VJRIIDZ7.js +15 -0
  110. package/dist/langwatch-api-workflows-VJRIIDZ7.js.map +1 -0
  111. package/dist/list-agents-AW3P6FJV.js +32 -0
  112. package/dist/list-agents-AW3P6FJV.js.map +1 -0
  113. package/dist/list-annotations-QNCGWPQ3.js +33 -0
  114. package/dist/list-annotations-QNCGWPQ3.js.map +1 -0
  115. package/dist/list-dashboards-R7RK2IXL.js +32 -0
  116. package/dist/list-dashboards-R7RK2IXL.js.map +1 -0
  117. package/dist/list-dataset-records-WVCSQP7P.js +39 -0
  118. package/dist/list-dataset-records-WVCSQP7P.js.map +1 -0
  119. package/dist/list-datasets-KEXRLDEU.js +60 -0
  120. package/dist/list-datasets-KEXRLDEU.js.map +1 -0
  121. package/dist/{list-evaluators-KRGI72EH.js → list-evaluators-7R2LB4JH.js} +4 -4
  122. package/dist/{list-model-providers-A5YCFTPI.js → list-model-providers-OBYJCKBX.js} +4 -4
  123. package/dist/list-prompt-tags-6LY3ZPYI.js +23 -0
  124. package/dist/list-prompt-tags-6LY3ZPYI.js.map +1 -0
  125. package/dist/{list-prompts-LKJSE7XN.js → list-prompts-VWEZ4CDE.js} +3 -3
  126. package/dist/{list-scenarios-ZK5CMGC4.js → list-scenarios-TXD4W2ZJ.js} +4 -4
  127. package/dist/list-simulation-runs-RHPOLMFI.js +43 -0
  128. package/dist/list-simulation-runs-RHPOLMFI.js.map +1 -0
  129. package/dist/list-suites-FSGBX27Z.js +42 -0
  130. package/dist/list-suites-FSGBX27Z.js.map +1 -0
  131. package/dist/list-workflows-VRGEZ3EN.js +35 -0
  132. package/dist/list-workflows-VRGEZ3EN.js.map +1 -0
  133. package/dist/rename-prompt-tag-VOJJLX4M.js +18 -0
  134. package/dist/rename-prompt-tag-VOJJLX4M.js.map +1 -0
  135. package/dist/run-agent-KTCC7TB7.js +36 -0
  136. package/dist/run-agent-KTCC7TB7.js.map +1 -0
  137. package/dist/run-evaluation-2X3V3Q6L.js +64 -0
  138. package/dist/run-evaluation-2X3V3Q6L.js.map +1 -0
  139. package/dist/run-suite-BTMHGI2D.js +29 -0
  140. package/dist/run-suite-BTMHGI2D.js.map +1 -0
  141. package/dist/run-workflow-IGAYGKJL.js +36 -0
  142. package/dist/run-workflow-IGAYGKJL.js.map +1 -0
  143. package/dist/{search-traces-SOKAAMAR.js → search-traces-VYFUIMXH.js} +3 -3
  144. package/dist/{set-model-provider-7MGULZDH.js → set-model-provider-W5IUI326.js} +4 -4
  145. package/dist/update-agent-4BB7EYLR.js +20 -0
  146. package/dist/update-agent-4BB7EYLR.js.map +1 -0
  147. package/dist/update-dataset-CXBKZ4W3.js +22 -0
  148. package/dist/update-dataset-CXBKZ4W3.js.map +1 -0
  149. package/dist/update-dataset-record-HOHAMHXG.js +19 -0
  150. package/dist/update-dataset-record-HOHAMHXG.js.map +1 -0
  151. package/dist/{update-evaluator-A3XINFLJ.js → update-evaluator-IVOR6FTR.js} +4 -4
  152. package/dist/{update-prompt-IW7X2UQM.js → update-prompt-OWQAKE7K.js} +5 -3
  153. package/dist/update-prompt-OWQAKE7K.js.map +1 -0
  154. package/dist/{update-scenario-ZT7TOBFR.js → update-scenario-GDFVILPN.js} +4 -4
  155. package/dist/update-suite-BXYUYSPT.js +39 -0
  156. package/dist/update-suite-BXYUYSPT.js.map +1 -0
  157. package/package.json +17 -3
  158. package/src/__tests__/all-tools.integration.test.ts +344 -0
  159. package/src/__tests__/config.unit.test.ts +81 -1
  160. package/src/__tests__/datasets.integration.test.ts +603 -0
  161. package/src/__tests__/datasets.unit.test.ts +240 -0
  162. package/src/__tests__/docker.integration.test.ts +234 -0
  163. package/src/__tests__/http-transport.integration.test.ts +397 -0
  164. package/src/__tests__/langwatch-api.unit.test.ts +174 -0
  165. package/src/__tests__/tools.unit.test.ts +177 -0
  166. package/src/config.d.ts +15 -0
  167. package/src/config.ts +83 -7
  168. package/src/create-mcp-server.d.ts +6 -0
  169. package/src/create-mcp-server.ts +1799 -0
  170. package/src/http-server.ts +329 -0
  171. package/src/index.ts +22 -593
  172. package/src/langwatch-api-agents.ts +108 -0
  173. package/src/langwatch-api-annotations.ts +49 -0
  174. package/src/langwatch-api-dashboards.ts +48 -0
  175. package/src/langwatch-api-datasets.ts +191 -0
  176. package/src/langwatch-api-evaluators.ts +10 -0
  177. package/src/langwatch-api-monitors.ts +82 -0
  178. package/src/langwatch-api-secrets.ts +48 -0
  179. package/src/langwatch-api-simulation-runs.ts +51 -0
  180. package/src/langwatch-api-suites.ts +118 -0
  181. package/src/langwatch-api-triggers.ts +48 -0
  182. package/src/langwatch-api-workflows.ts +41 -0
  183. package/src/langwatch-api.ts +60 -2
  184. package/src/schemas/create-dataset.ts +48 -0
  185. package/src/schemas/index.ts +1 -0
  186. package/src/tools/archive-suite.ts +12 -0
  187. package/src/tools/assign-prompt-tag.ts +16 -0
  188. package/src/tools/create-agent.ts +15 -0
  189. package/src/tools/create-annotation.ts +18 -0
  190. package/src/tools/create-dashboard.ts +7 -0
  191. package/src/tools/create-dataset-records.ts +23 -0
  192. package/src/tools/create-dataset.ts +22 -0
  193. package/src/tools/create-prompt-tag.ts +12 -0
  194. package/src/tools/create-prompt.ts +4 -0
  195. package/src/tools/create-suite.ts +42 -0
  196. package/src/tools/delete-agent.ts +7 -0
  197. package/src/tools/delete-annotation.ts +7 -0
  198. package/src/tools/delete-dashboard.ts +7 -0
  199. package/src/tools/delete-dataset-records.ts +22 -0
  200. package/src/tools/delete-dataset.ts +20 -0
  201. package/src/tools/delete-evaluator.ts +12 -0
  202. package/src/tools/delete-prompt-tag.ts +12 -0
  203. package/src/tools/delete-workflow.ts +7 -0
  204. package/src/tools/format-dataset-mutation.ts +25 -0
  205. package/src/tools/get-agent.ts +21 -0
  206. package/src/tools/get-analytics.ts +30 -3
  207. package/src/tools/get-dashboard.ts +22 -0
  208. package/src/tools/get-dataset.ts +63 -0
  209. package/src/tools/get-prompt.ts +2 -1
  210. package/src/tools/get-simulation-run.ts +60 -0
  211. package/src/tools/get-suite.ts +47 -0
  212. package/src/tools/get-workflow.ts +17 -0
  213. package/src/tools/list-agents.ts +27 -0
  214. package/src/tools/list-annotations.ts +33 -0
  215. package/src/tools/list-dashboards.ts +27 -0
  216. package/src/tools/list-dataset-records.ts +46 -0
  217. package/src/tools/list-datasets.ts +80 -0
  218. package/src/tools/list-prompt-tags.ts +21 -0
  219. package/src/tools/list-simulation-runs.ts +49 -0
  220. package/src/tools/list-suites.ts +43 -0
  221. package/src/tools/list-workflows.ts +31 -0
  222. package/src/tools/rename-prompt-tag.ts +14 -0
  223. package/src/tools/run-agent.ts +36 -0
  224. package/src/tools/run-evaluation.ts +87 -0
  225. package/src/tools/run-suite.ts +28 -0
  226. package/src/tools/run-workflow.ts +36 -0
  227. package/src/tools/update-agent.ts +13 -0
  228. package/src/tools/update-dataset-record.ts +21 -0
  229. package/src/tools/update-dataset.ts +23 -0
  230. package/src/tools/update-prompt.ts +3 -0
  231. package/src/tools/update-suite.ts +44 -0
  232. package/src/utils/escape-markdown.ts +12 -0
  233. package/tsup.config.ts +5 -1
  234. package/dist/chunk-AAQNA53E.js +0 -28
  235. package/dist/chunk-AAQNA53E.js.map +0 -1
  236. package/dist/chunk-LLRQIF52.js.map +0 -1
  237. package/dist/config-FIQWQRUB.js +0 -11
  238. package/dist/create-prompt-7Z35MIL6.js.map +0 -1
  239. package/dist/get-analytics-4YJW4S5L.js.map +0 -1
  240. package/dist/get-prompt-F6PDVC76.js.map +0 -1
  241. package/dist/update-prompt-IW7X2UQM.js.map +0 -1
  242. /package/dist/{archive-scenario-YFD5THOR.js.map → archive-scenario-WJ2A7ETN.js.map} +0 -0
  243. /package/dist/{chunk-6U4TCGFC.js.map → chunk-2GT7IFWK.js.map} +0 -0
  244. /package/dist/{chunk-IX6QJKAD.js.map → chunk-CCWCIJJ3.js.map} +0 -0
  245. /package/dist/{config-FIQWQRUB.js.map → config.js.map} +0 -0
  246. /package/dist/{create-evaluator-E5X5ZP3B.js.map → create-evaluator-WYFRFLRC.js.map} +0 -0
  247. /package/dist/{create-scenario-DIMPJRPY.js.map → create-scenario-6YHSMGLP.js.map} +0 -0
  248. /package/dist/{get-evaluator-WDEH2F7M.js.map → get-evaluator-UWVUPYTM.js.map} +0 -0
  249. /package/dist/{get-scenario-H24ZYNT5.js.map → get-scenario-Q6LCNUYN.js.map} +0 -0
  250. /package/dist/{get-trace-27USKGO7.js.map → get-trace-4EJAYVBG.js.map} +0 -0
  251. /package/dist/{list-evaluators-KRGI72EH.js.map → list-evaluators-7R2LB4JH.js.map} +0 -0
  252. /package/dist/{list-model-providers-A5YCFTPI.js.map → list-model-providers-OBYJCKBX.js.map} +0 -0
  253. /package/dist/{list-prompts-LKJSE7XN.js.map → list-prompts-VWEZ4CDE.js.map} +0 -0
  254. /package/dist/{list-scenarios-ZK5CMGC4.js.map → list-scenarios-TXD4W2ZJ.js.map} +0 -0
  255. /package/dist/{search-traces-SOKAAMAR.js.map → search-traces-VYFUIMXH.js.map} +0 -0
  256. /package/dist/{set-model-provider-7MGULZDH.js.map → set-model-provider-W5IUI326.js.map} +0 -0
  257. /package/dist/{update-evaluator-A3XINFLJ.js.map → update-evaluator-IVOR6FTR.js.map} +0 -0
  258. /package/dist/{update-scenario-ZT7TOBFR.js.map → update-scenario-GDFVILPN.js.map} +0 -0
@@ -0,0 +1,108 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface AgentSummary {
4
+ id: string;
5
+ name: string;
6
+ type: string;
7
+ config: Record<string, unknown> | null;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ }
11
+
12
+ export interface AgentListResponse {
13
+ data: AgentSummary[];
14
+ pagination: {
15
+ page: number;
16
+ limit: number;
17
+ total: number;
18
+ totalPages: number;
19
+ };
20
+ }
21
+
22
+ export async function listAgents(params?: {
23
+ page?: number;
24
+ limit?: number;
25
+ }): Promise<AgentListResponse> {
26
+ const query = new URLSearchParams();
27
+ if (params?.page) query.set("page", String(params.page));
28
+ if (params?.limit) query.set("limit", String(params.limit));
29
+ const qs = query.toString() ? `?${query}` : "";
30
+ return makeRequest("GET", `/api/agents${qs}`) as Promise<AgentListResponse>;
31
+ }
32
+
33
+ export async function getAgent(id: string): Promise<AgentSummary> {
34
+ return makeRequest(
35
+ "GET",
36
+ `/api/agents/${encodeURIComponent(id)}`,
37
+ ) as Promise<AgentSummary>;
38
+ }
39
+
40
+ export async function createAgent(data: {
41
+ name: string;
42
+ type: string;
43
+ config: Record<string, unknown>;
44
+ }): Promise<AgentSummary> {
45
+ return makeRequest("POST", "/api/agents", data) as Promise<AgentSummary>;
46
+ }
47
+
48
+ export async function updateAgent(params: {
49
+ id: string;
50
+ name?: string;
51
+ type?: string;
52
+ config?: Record<string, unknown>;
53
+ }): Promise<AgentSummary> {
54
+ const { id, ...data } = params;
55
+ return makeRequest(
56
+ "PATCH",
57
+ `/api/agents/${encodeURIComponent(id)}`,
58
+ data,
59
+ ) as Promise<AgentSummary>;
60
+ }
61
+
62
+ /**
63
+ * Run an agent. For HTTP agents, calls the configured URL directly.
64
+ * For workflow-linked agents, calls the workflow run endpoint.
65
+ */
66
+ export async function runAgent(
67
+ id: string,
68
+ input?: Record<string, unknown>,
69
+ ): Promise<{ agentType: string; result: Record<string, unknown> }> {
70
+ const agent = await getAgent(id);
71
+ const config = agent.config ?? {};
72
+
73
+ if (agent.type === "http") {
74
+ const url = (config as Record<string, unknown>).url as string | undefined;
75
+ if (!url) {
76
+ throw new Error("HTTP agent has no URL configured");
77
+ }
78
+
79
+ const response = await fetch(url, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify(input ?? {}),
83
+ });
84
+
85
+ const result = (await response.json()) as Record<string, unknown>;
86
+ return { agentType: "http", result };
87
+ }
88
+
89
+ // For workflow-linked agents, use the workflow run endpoint
90
+ const workflowId = (config as Record<string, unknown>).workflowId as string | undefined;
91
+ if (!workflowId) {
92
+ throw new Error(
93
+ `Agent "${agent.name}" (type: ${agent.type}) cannot be executed directly. ` +
94
+ `Only HTTP agents and workflow-linked agents can be run.`,
95
+ );
96
+ }
97
+
98
+ const { runWorkflow } = await import("./langwatch-api-workflows.js");
99
+ const result = await runWorkflow(workflowId, input);
100
+ return { agentType: agent.type, result };
101
+ }
102
+
103
+ export async function deleteAgent(id: string): Promise<{ id: string; name: string }> {
104
+ return makeRequest(
105
+ "DELETE",
106
+ `/api/agents/${encodeURIComponent(id)}`,
107
+ ) as Promise<{ id: string; name: string }>;
108
+ }
@@ -0,0 +1,49 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface AnnotationResponse {
4
+ id?: string;
5
+ projectId?: string;
6
+ traceId?: string;
7
+ comment?: string;
8
+ isThumbsUp?: boolean;
9
+ userId?: string;
10
+ email?: string;
11
+ createdAt?: string;
12
+ updatedAt?: string;
13
+ }
14
+
15
+ export async function listAnnotations(): Promise<AnnotationResponse[]> {
16
+ return makeRequest("GET", "/api/annotations") as Promise<AnnotationResponse[]>;
17
+ }
18
+
19
+ export async function getAnnotation(id: string): Promise<AnnotationResponse> {
20
+ return makeRequest(
21
+ "GET",
22
+ `/api/annotations/${encodeURIComponent(id)}`,
23
+ ) as Promise<AnnotationResponse>;
24
+ }
25
+
26
+ export async function getAnnotationsByTrace(traceId: string): Promise<AnnotationResponse[]> {
27
+ return makeRequest(
28
+ "GET",
29
+ `/api/annotations/trace/${encodeURIComponent(traceId)}`,
30
+ ) as Promise<AnnotationResponse[]>;
31
+ }
32
+
33
+ export async function createAnnotation(
34
+ traceId: string,
35
+ data: { comment?: string; isThumbsUp?: boolean; email?: string },
36
+ ): Promise<AnnotationResponse> {
37
+ return makeRequest(
38
+ "POST",
39
+ `/api/annotations/trace/${encodeURIComponent(traceId)}`,
40
+ data,
41
+ ) as Promise<AnnotationResponse>;
42
+ }
43
+
44
+ export async function deleteAnnotation(id: string): Promise<{ status?: string; message?: string }> {
45
+ return makeRequest(
46
+ "DELETE",
47
+ `/api/annotations/${encodeURIComponent(id)}`,
48
+ ) as Promise<{ status?: string; message?: string }>;
49
+ }
@@ -0,0 +1,48 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface DashboardSummary {
4
+ id: string;
5
+ name: string;
6
+ order: number;
7
+ graphCount: number;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ }
11
+
12
+ export interface DashboardDetail extends DashboardSummary {
13
+ graphs: unknown[];
14
+ }
15
+
16
+ export interface DashboardListResponse {
17
+ data: DashboardSummary[];
18
+ }
19
+
20
+ export async function listDashboards(): Promise<DashboardListResponse> {
21
+ return makeRequest("GET", "/api/dashboards") as Promise<DashboardListResponse>;
22
+ }
23
+
24
+ export async function getDashboard(id: string): Promise<DashboardDetail> {
25
+ return makeRequest(
26
+ "GET",
27
+ `/api/dashboards/${encodeURIComponent(id)}`,
28
+ ) as Promise<DashboardDetail>;
29
+ }
30
+
31
+ export async function createDashboard(data: { name: string }): Promise<DashboardDetail> {
32
+ return makeRequest("POST", "/api/dashboards", data) as Promise<DashboardDetail>;
33
+ }
34
+
35
+ export async function renameDashboard(id: string, data: { name: string }): Promise<DashboardDetail> {
36
+ return makeRequest(
37
+ "PATCH",
38
+ `/api/dashboards/${encodeURIComponent(id)}`,
39
+ data,
40
+ ) as Promise<DashboardDetail>;
41
+ }
42
+
43
+ export async function deleteDashboard(id: string): Promise<{ id: string; name: string }> {
44
+ return makeRequest(
45
+ "DELETE",
46
+ `/api/dashboards/${encodeURIComponent(id)}`,
47
+ ) as Promise<{ id: string; name: string }>;
48
+ }
@@ -0,0 +1,191 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ // --- Dataset types ---
4
+
5
+ export interface DatasetColumnType {
6
+ name: string;
7
+ type: string;
8
+ }
9
+
10
+ export interface DatasetSummary {
11
+ id: string;
12
+ name: string;
13
+ slug: string;
14
+ columnTypes: DatasetColumnType[];
15
+ recordCount?: number;
16
+ createdAt: string;
17
+ updatedAt: string;
18
+ }
19
+
20
+ export interface DatasetListResponse {
21
+ data: DatasetSummary[];
22
+ pagination: {
23
+ total: number;
24
+ page: number;
25
+ limit: number;
26
+ totalPages: number;
27
+ };
28
+ }
29
+
30
+ export interface DatasetRecord {
31
+ id: string;
32
+ entry: Record<string, unknown>;
33
+ }
34
+
35
+ export interface DatasetDetailResponse {
36
+ id: string;
37
+ name: string;
38
+ slug: string;
39
+ columnTypes: DatasetColumnType[];
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ data: DatasetRecord[];
43
+ }
44
+
45
+ export interface DatasetMutationResponse {
46
+ id: string;
47
+ name: string;
48
+ slug: string;
49
+ columnTypes: DatasetColumnType[];
50
+ createdAt: string;
51
+ updatedAt: string;
52
+ }
53
+
54
+ export interface DatasetArchiveResponse {
55
+ id: string;
56
+ archived: boolean;
57
+ }
58
+
59
+ export interface BatchCreateRecordsResponse {
60
+ data: DatasetRecord[];
61
+ }
62
+
63
+ export interface DeleteRecordsResponse {
64
+ deletedCount: number;
65
+ }
66
+
67
+ export interface DatasetRecordListResponse {
68
+ data: DatasetRecord[];
69
+ pagination: {
70
+ total: number;
71
+ page: number;
72
+ limit: number;
73
+ totalPages: number;
74
+ };
75
+ }
76
+
77
+ // --- Dataset API functions ---
78
+
79
+ /** Lists all datasets in the project (paginated). */
80
+ export async function listDatasets(params?: {
81
+ page?: number;
82
+ limit?: number;
83
+ }): Promise<DatasetListResponse> {
84
+ const query = new URLSearchParams();
85
+ if (params?.page != null) query.set("page", String(params.page));
86
+ if (params?.limit != null) query.set("limit", String(params.limit));
87
+ const qs = query.toString();
88
+ const path = qs ? `/api/dataset?${qs}` : "/api/dataset";
89
+ return makeRequest("GET", path) as Promise<DatasetListResponse>;
90
+ }
91
+
92
+ /** Retrieves a single dataset by slug or ID, including records. */
93
+ export async function getDataset(
94
+ slugOrId: string,
95
+ ): Promise<DatasetDetailResponse> {
96
+ return makeRequest(
97
+ "GET",
98
+ `/api/dataset/${encodeURIComponent(slugOrId)}`,
99
+ ) as Promise<DatasetDetailResponse>;
100
+ }
101
+
102
+ /** Creates a new dataset. */
103
+ export async function createDataset(data: {
104
+ name: string;
105
+ columnTypes?: DatasetColumnType[];
106
+ }): Promise<DatasetMutationResponse> {
107
+ return makeRequest(
108
+ "POST",
109
+ "/api/dataset",
110
+ data,
111
+ ) as Promise<DatasetMutationResponse>;
112
+ }
113
+
114
+ /** Updates an existing dataset by slug or ID. */
115
+ export async function updateDataset(params: {
116
+ slugOrId: string;
117
+ name?: string;
118
+ columnTypes?: DatasetColumnType[];
119
+ }): Promise<DatasetMutationResponse> {
120
+ const { slugOrId, ...data } = params;
121
+ return makeRequest(
122
+ "PATCH",
123
+ `/api/dataset/${encodeURIComponent(slugOrId)}`,
124
+ data,
125
+ ) as Promise<DatasetMutationResponse>;
126
+ }
127
+
128
+ /** Archives (soft-deletes) a dataset by slug or ID. */
129
+ export async function deleteDataset(
130
+ slugOrId: string,
131
+ ): Promise<DatasetArchiveResponse> {
132
+ return makeRequest(
133
+ "DELETE",
134
+ `/api/dataset/${encodeURIComponent(slugOrId)}`,
135
+ ) as Promise<DatasetArchiveResponse>;
136
+ }
137
+
138
+ /** Creates records in a dataset in batch. */
139
+ export async function createDatasetRecords(params: {
140
+ slugOrId: string;
141
+ entries: Record<string, unknown>[];
142
+ }): Promise<BatchCreateRecordsResponse> {
143
+ const { slugOrId, entries } = params;
144
+ return makeRequest(
145
+ "POST",
146
+ `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
147
+ { entries },
148
+ ) as Promise<BatchCreateRecordsResponse>;
149
+ }
150
+
151
+ /** Updates or creates a single record in a dataset. */
152
+ export async function updateDatasetRecord(params: {
153
+ slugOrId: string;
154
+ recordId: string;
155
+ entry: Record<string, unknown>;
156
+ }): Promise<DatasetRecord> {
157
+ const { slugOrId, recordId, entry } = params;
158
+ return makeRequest(
159
+ "PATCH",
160
+ `/api/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
161
+ { entry },
162
+ ) as Promise<DatasetRecord>;
163
+ }
164
+
165
+ /** Deletes records from a dataset by IDs. */
166
+ export async function deleteDatasetRecords(params: {
167
+ slugOrId: string;
168
+ recordIds: string[];
169
+ }): Promise<DeleteRecordsResponse> {
170
+ const { slugOrId, recordIds } = params;
171
+ return makeRequest(
172
+ "DELETE",
173
+ `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
174
+ { recordIds },
175
+ ) as Promise<DeleteRecordsResponse>;
176
+ }
177
+
178
+ /** Lists records in a dataset (paginated). */
179
+ export async function listDatasetRecords(params: {
180
+ slugOrId: string;
181
+ page?: number;
182
+ limit?: number;
183
+ }): Promise<DatasetRecordListResponse> {
184
+ const { slugOrId } = params;
185
+ const query = new URLSearchParams();
186
+ if (params.page != null) query.set("page", String(params.page));
187
+ if (params.limit != null) query.set("limit", String(params.limit));
188
+ const qs = query.toString();
189
+ const path = `/api/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
190
+ return makeRequest("GET", path) as Promise<DatasetRecordListResponse>;
191
+ }
@@ -68,3 +68,13 @@ export async function updateEvaluator(params: {
68
68
  data,
69
69
  ) as Promise<EvaluatorSummary>;
70
70
  }
71
+
72
+ /** Archives (soft-deletes) an evaluator. */
73
+ export async function deleteEvaluator(
74
+ idOrSlug: string,
75
+ ): Promise<{ id: string; archived: boolean }> {
76
+ return makeRequest(
77
+ "DELETE",
78
+ `/api/evaluators/${encodeURIComponent(idOrSlug)}`,
79
+ ) as Promise<{ id: string; archived: boolean }>;
80
+ }
@@ -0,0 +1,82 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface MonitorSummary {
4
+ id: string;
5
+ name: string;
6
+ slug: string;
7
+ checkType: string;
8
+ enabled: boolean;
9
+ executionMode: string;
10
+ sample: number;
11
+ level: string;
12
+ evaluatorId: string | null;
13
+ preconditions: unknown;
14
+ parameters: unknown;
15
+ mappings: unknown;
16
+ threadIdleTimeout: number | null;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ }
20
+
21
+ export async function listMonitors(): Promise<MonitorSummary[]> {
22
+ return makeRequest("GET", "/api/monitors") as Promise<MonitorSummary[]>;
23
+ }
24
+
25
+ export async function getMonitor(id: string): Promise<MonitorSummary> {
26
+ return makeRequest(
27
+ "GET",
28
+ `/api/monitors/${encodeURIComponent(id)}`
29
+ ) as Promise<MonitorSummary>;
30
+ }
31
+
32
+ export async function createMonitor(data: {
33
+ name: string;
34
+ checkType: string;
35
+ executionMode?: string;
36
+ sample?: number;
37
+ evaluatorId?: string;
38
+ level?: string;
39
+ parameters?: Record<string, unknown>;
40
+ }): Promise<MonitorSummary> {
41
+ return makeRequest("POST", "/api/monitors", {
42
+ ...data,
43
+ preconditions: [],
44
+ parameters: data.parameters ?? {},
45
+ }) as Promise<MonitorSummary>;
46
+ }
47
+
48
+ export async function updateMonitor(params: {
49
+ id: string;
50
+ name?: string;
51
+ enabled?: boolean;
52
+ executionMode?: string;
53
+ sample?: number;
54
+ parameters?: Record<string, unknown>;
55
+ }): Promise<MonitorSummary> {
56
+ const { id, ...data } = params;
57
+ return makeRequest(
58
+ "PATCH",
59
+ `/api/monitors/${encodeURIComponent(id)}`,
60
+ data
61
+ ) as Promise<MonitorSummary>;
62
+ }
63
+
64
+ export async function toggleMonitor(params: {
65
+ id: string;
66
+ enabled: boolean;
67
+ }): Promise<{ id: string; enabled: boolean }> {
68
+ return makeRequest(
69
+ "POST",
70
+ `/api/monitors/${encodeURIComponent(params.id)}/toggle`,
71
+ { enabled: params.enabled }
72
+ ) as Promise<{ id: string; enabled: boolean }>;
73
+ }
74
+
75
+ export async function deleteMonitor(
76
+ id: string
77
+ ): Promise<{ id: string; deleted: boolean }> {
78
+ return makeRequest(
79
+ "DELETE",
80
+ `/api/monitors/${encodeURIComponent(id)}`
81
+ ) as Promise<{ id: string; deleted: boolean }>;
82
+ }
@@ -0,0 +1,48 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface SecretSummary {
4
+ id: string;
5
+ projectId: string;
6
+ name: string;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ }
10
+
11
+ export async function listSecrets(): Promise<SecretSummary[]> {
12
+ return makeRequest("GET", "/api/secrets") as Promise<SecretSummary[]>;
13
+ }
14
+
15
+ export async function getSecret(id: string): Promise<SecretSummary> {
16
+ return makeRequest(
17
+ "GET",
18
+ `/api/secrets/${encodeURIComponent(id)}`
19
+ ) as Promise<SecretSummary>;
20
+ }
21
+
22
+ export async function createSecret(data: {
23
+ name: string;
24
+ value: string;
25
+ }): Promise<SecretSummary> {
26
+ return makeRequest("POST", "/api/secrets", data) as Promise<SecretSummary>;
27
+ }
28
+
29
+ export async function updateSecret(params: {
30
+ id: string;
31
+ value: string;
32
+ }): Promise<SecretSummary> {
33
+ const { id, value } = params;
34
+ return makeRequest(
35
+ "PUT",
36
+ `/api/secrets/${encodeURIComponent(id)}`,
37
+ { value }
38
+ ) as Promise<SecretSummary>;
39
+ }
40
+
41
+ export async function deleteSecret(
42
+ id: string
43
+ ): Promise<{ id: string; deleted: boolean }> {
44
+ return makeRequest(
45
+ "DELETE",
46
+ `/api/secrets/${encodeURIComponent(id)}`
47
+ ) as Promise<{ id: string; deleted: boolean }>;
48
+ }
@@ -0,0 +1,51 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ export interface SimulationRunSummary {
4
+ scenarioRunId: string;
5
+ scenarioId: string;
6
+ batchRunId: string;
7
+ name: string | null;
8
+ status: string;
9
+ durationInMs: number;
10
+ totalCost?: number;
11
+ results?: {
12
+ verdict?: string | null;
13
+ reasoning?: string | null;
14
+ metCriteria?: string[];
15
+ unmetCriteria?: string[];
16
+ error?: string | null;
17
+ } | null;
18
+ messages?: Array<{ role: string; content: string }>;
19
+ timestamp: number;
20
+ updatedAt: number;
21
+ }
22
+
23
+ export interface SimulationRunListResponse {
24
+ runs: SimulationRunSummary[];
25
+ hasMore?: boolean;
26
+ nextCursor?: string;
27
+ }
28
+
29
+ /** Lists simulation runs, optionally filtered by scenario set or batch. */
30
+ export async function listSimulationRuns(params?: {
31
+ scenarioSetId?: string;
32
+ batchRunId?: string;
33
+ limit?: number;
34
+ }): Promise<SimulationRunListResponse> {
35
+ const query = new URLSearchParams();
36
+ if (params?.scenarioSetId) query.set("scenarioSetId", params.scenarioSetId);
37
+ if (params?.batchRunId) query.set("batchRunId", params.batchRunId);
38
+ if (params?.limit) query.set("limit", String(params.limit));
39
+ const qs = query.toString() ? `?${query}` : "";
40
+ return makeRequest("GET", `/api/simulation-runs${qs}`) as Promise<SimulationRunListResponse>;
41
+ }
42
+
43
+ /** Gets a single simulation run by its ID. */
44
+ export async function getSimulationRun(
45
+ scenarioRunId: string,
46
+ ): Promise<SimulationRunSummary> {
47
+ return makeRequest(
48
+ "GET",
49
+ `/api/simulation-runs/${encodeURIComponent(scenarioRunId)}`,
50
+ ) as Promise<SimulationRunSummary>;
51
+ }