langwatch 0.2.0 → 0.3.0-prerelease.1

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 (235) hide show
  1. package/.editorconfig +16 -0
  2. package/LICENSE +7 -0
  3. package/README.md +268 -1
  4. package/copy-types.sh +19 -8
  5. package/examples/langchain/.env.example +2 -0
  6. package/examples/langchain/README.md +42 -0
  7. package/examples/langchain/package-lock.json +2930 -0
  8. package/examples/langchain/package.json +27 -0
  9. package/examples/langchain/src/cli-markdown.d.ts +137 -0
  10. package/examples/langchain/src/index.ts +109 -0
  11. package/examples/langchain/tsconfig.json +25 -0
  12. package/examples/langgraph/.env.example +2 -0
  13. package/examples/langgraph/README.md +42 -0
  14. package/examples/langgraph/package-lock.json +3031 -0
  15. package/examples/langgraph/package.json +28 -0
  16. package/examples/langgraph/src/cli-markdown.d.ts +137 -0
  17. package/examples/langgraph/src/index.ts +196 -0
  18. package/examples/langgraph/tsconfig.json +25 -0
  19. package/examples/mastra/.env.example +2 -0
  20. package/examples/mastra/README.md +57 -0
  21. package/examples/mastra/package-lock.json +5296 -0
  22. package/examples/mastra/package.json +32 -0
  23. package/examples/mastra/src/cli-markdown.d.ts +137 -0
  24. package/examples/mastra/src/index.ts +120 -0
  25. package/examples/mastra/src/mastra/agents/weather-agent.ts +30 -0
  26. package/examples/mastra/src/mastra/index.ts +21 -0
  27. package/examples/mastra/src/mastra/tools/weather-tool.ts +102 -0
  28. package/examples/mastra/tsconfig.json +25 -0
  29. package/examples/vercel-ai/.env.example +2 -0
  30. package/examples/vercel-ai/README.md +38 -0
  31. package/examples/vercel-ai/package-lock.json +2571 -0
  32. package/examples/vercel-ai/package.json +27 -0
  33. package/examples/vercel-ai/src/cli-markdown.d.ts +137 -0
  34. package/examples/vercel-ai/src/index.ts +110 -0
  35. package/examples/vercel-ai/src/instrumentation.ts +9 -0
  36. package/examples/vercel-ai/tsconfig.json +25 -0
  37. package/package.json +78 -34
  38. package/src/__tests__/client-browser.test.ts +92 -0
  39. package/src/__tests__/client-node.test.ts +76 -0
  40. package/src/__tests__/client.test.ts +71 -0
  41. package/src/__tests__/integration/client-browser.test.ts +46 -0
  42. package/src/__tests__/integration/client-node.test.ts +46 -0
  43. package/src/client-browser.ts +70 -0
  44. package/src/client-node.ts +82 -0
  45. package/src/client-shared.ts +72 -0
  46. package/src/client.ts +119 -0
  47. package/src/evaluation/__tests__/record-evaluation.test.ts +112 -0
  48. package/src/evaluation/__tests__/run-evaluation.test.ts +171 -0
  49. package/src/evaluation/index.ts +2 -0
  50. package/src/evaluation/record-evaluation.ts +101 -0
  51. package/src/evaluation/run-evaluation.ts +133 -0
  52. package/src/evaluation/tracer.ts +3 -0
  53. package/src/evaluation/types.ts +23 -0
  54. package/src/index.ts +10 -593
  55. package/src/internal/api/__tests__/errors.test.ts +98 -0
  56. package/src/internal/api/client.ts +30 -0
  57. package/src/internal/api/errors.ts +32 -0
  58. package/src/internal/generated/types/.gitkeep +0 -0
  59. package/src/observability/__tests__/integration/base.test.ts +74 -0
  60. package/src/observability/__tests__/integration/browser-setup-ordering.test.ts +60 -0
  61. package/src/observability/__tests__/integration/complex-nested-spans.test.ts +29 -0
  62. package/src/observability/__tests__/integration/error-handling.test.ts +24 -0
  63. package/src/observability/__tests__/integration/langwatch-disabled-otel.test.ts +24 -0
  64. package/src/observability/__tests__/integration/langwatch-first-then-vercel.test.ts +24 -0
  65. package/src/observability/__tests__/integration/multiple-setup-attempts.test.ts +27 -0
  66. package/src/observability/__tests__/integration/otel-ordering.test.ts +27 -0
  67. package/src/observability/__tests__/integration/vercel-configurations.test.ts +20 -0
  68. package/src/observability/__tests__/integration/vercel-first-then-langwatch.test.ts +27 -0
  69. package/src/observability/__tests__/span.test.ts +214 -0
  70. package/src/observability/__tests__/trace.test.ts +180 -0
  71. package/src/observability/exporters/index.ts +1 -0
  72. package/src/observability/exporters/langwatch-exporter.ts +53 -0
  73. package/src/observability/index.ts +4 -0
  74. package/src/observability/instrumentation/langchain/__tests__/integration/langchain-chatbot.test.ts +112 -0
  75. package/src/observability/instrumentation/langchain/__tests__/langchain.test.ts +284 -0
  76. package/src/observability/instrumentation/langchain/index.ts +624 -0
  77. package/src/observability/processors/__tests__/filterable-batch-span-exporter.test.ts +98 -0
  78. package/src/observability/processors/filterable-batch-span-processor.ts +99 -0
  79. package/src/observability/processors/index.ts +1 -0
  80. package/src/observability/semconv/attributes.ts +185 -0
  81. package/src/observability/semconv/events.ts +42 -0
  82. package/src/observability/semconv/index.ts +16 -0
  83. package/src/observability/semconv/values.ts +159 -0
  84. package/src/observability/span.ts +728 -0
  85. package/src/observability/trace.ts +301 -0
  86. package/src/prompt/__tests__/prompt.test.ts +139 -0
  87. package/src/prompt/get-prompt-version.ts +49 -0
  88. package/src/prompt/get-prompt.ts +44 -0
  89. package/src/prompt/index.ts +3 -0
  90. package/src/prompt/prompt.ts +133 -0
  91. package/src/prompt/service.ts +221 -0
  92. package/src/prompt/tracer.ts +3 -0
  93. package/src/prompt/types.ts +0 -0
  94. package/ts-to-zod.config.js +11 -0
  95. package/tsconfig.json +3 -9
  96. package/tsup.config.ts +11 -1
  97. package/vitest.config.ts +1 -0
  98. package/dist/chunk-LKD2K67J.mjs +0 -717
  99. package/dist/chunk-LKD2K67J.mjs.map +0 -1
  100. package/dist/index.d.mts +0 -1030
  101. package/dist/index.d.ts +0 -1030
  102. package/dist/index.js +0 -27310
  103. package/dist/index.js.map +0 -1
  104. package/dist/index.mjs +0 -963
  105. package/dist/index.mjs.map +0 -1
  106. package/dist/utils-Cv-rUjJ1.d.mts +0 -313
  107. package/dist/utils-Cv-rUjJ1.d.ts +0 -313
  108. package/dist/utils.d.mts +0 -2
  109. package/dist/utils.d.ts +0 -2
  110. package/dist/utils.js +0 -709
  111. package/dist/utils.js.map +0 -1
  112. package/dist/utils.mjs +0 -11
  113. package/dist/utils.mjs.map +0 -1
  114. package/example/.env.example +0 -12
  115. package/example/.eslintrc.json +0 -26
  116. package/example/LICENSE +0 -13
  117. package/example/README.md +0 -12
  118. package/example/app/(chat)/chat/[id]/page.tsx +0 -60
  119. package/example/app/(chat)/layout.tsx +0 -14
  120. package/example/app/(chat)/page.tsx +0 -27
  121. package/example/app/actions.ts +0 -156
  122. package/example/app/globals.css +0 -76
  123. package/example/app/guardrails/page.tsx +0 -26
  124. package/example/app/langchain/page.tsx +0 -27
  125. package/example/app/langchain-rag/page.tsx +0 -28
  126. package/example/app/late-update/page.tsx +0 -27
  127. package/example/app/layout.tsx +0 -64
  128. package/example/app/login/actions.ts +0 -71
  129. package/example/app/login/page.tsx +0 -18
  130. package/example/app/manual/page.tsx +0 -27
  131. package/example/app/new/page.tsx +0 -5
  132. package/example/app/opengraph-image.png +0 -0
  133. package/example/app/share/[id]/page.tsx +0 -58
  134. package/example/app/signup/actions.ts +0 -111
  135. package/example/app/signup/page.tsx +0 -18
  136. package/example/app/twitter-image.png +0 -0
  137. package/example/auth.config.ts +0 -42
  138. package/example/auth.ts +0 -45
  139. package/example/components/button-scroll-to-bottom.tsx +0 -36
  140. package/example/components/chat-history.tsx +0 -49
  141. package/example/components/chat-list.tsx +0 -52
  142. package/example/components/chat-message-actions.tsx +0 -40
  143. package/example/components/chat-message.tsx +0 -80
  144. package/example/components/chat-panel.tsx +0 -139
  145. package/example/components/chat-share-dialog.tsx +0 -95
  146. package/example/components/chat.tsx +0 -84
  147. package/example/components/clear-history.tsx +0 -75
  148. package/example/components/empty-screen.tsx +0 -38
  149. package/example/components/external-link.tsx +0 -29
  150. package/example/components/footer.tsx +0 -19
  151. package/example/components/header.tsx +0 -114
  152. package/example/components/login-button.tsx +0 -42
  153. package/example/components/login-form.tsx +0 -97
  154. package/example/components/markdown.tsx +0 -9
  155. package/example/components/prompt-form.tsx +0 -115
  156. package/example/components/providers.tsx +0 -17
  157. package/example/components/sidebar-actions.tsx +0 -125
  158. package/example/components/sidebar-desktop.tsx +0 -19
  159. package/example/components/sidebar-footer.tsx +0 -16
  160. package/example/components/sidebar-item.tsx +0 -124
  161. package/example/components/sidebar-items.tsx +0 -42
  162. package/example/components/sidebar-list.tsx +0 -38
  163. package/example/components/sidebar-mobile.tsx +0 -31
  164. package/example/components/sidebar-toggle.tsx +0 -24
  165. package/example/components/sidebar.tsx +0 -21
  166. package/example/components/signup-form.tsx +0 -95
  167. package/example/components/stocks/events-skeleton.tsx +0 -31
  168. package/example/components/stocks/events.tsx +0 -30
  169. package/example/components/stocks/index.tsx +0 -36
  170. package/example/components/stocks/message.tsx +0 -134
  171. package/example/components/stocks/spinner.tsx +0 -16
  172. package/example/components/stocks/stock-purchase.tsx +0 -146
  173. package/example/components/stocks/stock-skeleton.tsx +0 -22
  174. package/example/components/stocks/stock.tsx +0 -210
  175. package/example/components/stocks/stocks-skeleton.tsx +0 -9
  176. package/example/components/stocks/stocks.tsx +0 -67
  177. package/example/components/tailwind-indicator.tsx +0 -14
  178. package/example/components/theme-toggle.tsx +0 -31
  179. package/example/components/ui/alert-dialog.tsx +0 -141
  180. package/example/components/ui/badge.tsx +0 -36
  181. package/example/components/ui/button.tsx +0 -57
  182. package/example/components/ui/codeblock.tsx +0 -148
  183. package/example/components/ui/dialog.tsx +0 -122
  184. package/example/components/ui/dropdown-menu.tsx +0 -205
  185. package/example/components/ui/icons.tsx +0 -507
  186. package/example/components/ui/input.tsx +0 -25
  187. package/example/components/ui/label.tsx +0 -26
  188. package/example/components/ui/select.tsx +0 -164
  189. package/example/components/ui/separator.tsx +0 -31
  190. package/example/components/ui/sheet.tsx +0 -140
  191. package/example/components/ui/sonner.tsx +0 -31
  192. package/example/components/ui/switch.tsx +0 -29
  193. package/example/components/ui/textarea.tsx +0 -24
  194. package/example/components/ui/tooltip.tsx +0 -30
  195. package/example/components/user-menu.tsx +0 -53
  196. package/example/components.json +0 -17
  197. package/example/instrumentation.ts +0 -11
  198. package/example/lib/chat/guardrails.tsx +0 -181
  199. package/example/lib/chat/langchain-rag.tsx +0 -191
  200. package/example/lib/chat/langchain.tsx +0 -112
  201. package/example/lib/chat/late-update.tsx +0 -208
  202. package/example/lib/chat/manual.tsx +0 -605
  203. package/example/lib/chat/vercel-ai.tsx +0 -576
  204. package/example/lib/hooks/use-copy-to-clipboard.tsx +0 -33
  205. package/example/lib/hooks/use-enter-submit.tsx +0 -23
  206. package/example/lib/hooks/use-local-storage.ts +0 -24
  207. package/example/lib/hooks/use-scroll-anchor.tsx +0 -86
  208. package/example/lib/hooks/use-sidebar.tsx +0 -60
  209. package/example/lib/hooks/use-streamable-text.ts +0 -25
  210. package/example/lib/types.ts +0 -41
  211. package/example/lib/utils.ts +0 -89
  212. package/example/middleware.ts +0 -8
  213. package/example/next-env.d.ts +0 -5
  214. package/example/next.config.js +0 -16
  215. package/example/package-lock.json +0 -10917
  216. package/example/package.json +0 -84
  217. package/example/pnpm-lock.yaml +0 -5712
  218. package/example/postcss.config.js +0 -6
  219. package/example/prettier.config.cjs +0 -34
  220. package/example/public/apple-touch-icon.png +0 -0
  221. package/example/public/favicon-16x16.png +0 -0
  222. package/example/public/favicon.ico +0 -0
  223. package/example/public/next.svg +0 -1
  224. package/example/public/thirteen.svg +0 -1
  225. package/example/public/vercel.svg +0 -1
  226. package/example/tailwind.config.ts +0 -81
  227. package/example/tsconfig.json +0 -35
  228. package/src/LangWatchExporter.ts +0 -96
  229. package/src/evaluations.ts +0 -219
  230. package/src/index.test.ts +0 -402
  231. package/src/langchain.ts +0 -557
  232. package/src/typeUtils.ts +0 -89
  233. package/src/types.ts +0 -82
  234. package/src/utils.ts +0 -205
  235. /package/src/{server/types → internal/generated/openapi}/.gitkeep +0 -0
package/src/types.ts DELETED
@@ -1,82 +0,0 @@
1
- import type { OpenAI } from "openai";
2
- import { type SnakeToCamelCaseNested } from "./typeUtils";
3
- import {
4
- type BaseSpan as ServerBaseSpan,
5
- type ChatMessage as ServerChatMessage,
6
- type ChatRichContent as ServerChatRichContent,
7
- type LLMSpan as ServerLLMSpan,
8
- type RAGSpan as ServerRAGSpan,
9
- type SpanInputOutput as ServerSpanInputOutput,
10
- type TypedValueChatMessages,
11
- type Trace as ServerTrace,
12
- type RESTEvaluation as ServerRESTEvaluation,
13
- type LLMModeTrace as ServerLLMModeTrace,
14
- type ErrorCapture as ServerErrorCapture,
15
- } from "./server/types/tracer";
16
-
17
- export type Trace = ServerTrace;
18
-
19
- export type LLMModeTrace = ServerLLMModeTrace;
20
-
21
- export type Metadata = SnakeToCamelCaseNested<Trace["metadata"]>;
22
-
23
- export type ChatMessage = ServerChatMessage;
24
-
25
- export type ChatRichContent = ServerChatRichContent;
26
-
27
- // Check to see if out ChatMessage type is compatible with OpenAIChatCompletion messages
28
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
- ({}) as OpenAI.Chat.ChatCompletionMessageParam satisfies ChatMessage;
30
- // Check to see spans input/output is still compatible with OpenAIChatCompletion messages to avoid camelCase/snake_case issues
31
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
32
- ({}) as {
33
- type: "chat_messages";
34
- value: OpenAI.Chat.ChatCompletionMessageParam[];
35
- } satisfies BaseSpan["input"];
36
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
37
- ({}) as {
38
- type: "chat_messages";
39
- value: OpenAI.Chat.ChatCompletionMessageParam[];
40
- } satisfies BaseSpan["output"];
41
-
42
- // Keep the input/output types signatures as snake case to match the official openai nodejs api
43
- export type SpanInputOutput =
44
- | SnakeToCamelCaseNested<
45
- Exclude<ServerSpanInputOutput, TypedValueChatMessages>
46
- >
47
- | (TypedValueChatMessages & { type: ChatMessage });
48
-
49
- export type ConvertServerSpan<T extends ServerBaseSpan> =
50
- SnakeToCamelCaseNested<Omit<T, "input" | "output" | "error">> & {
51
- input?: SpanInputOutput | null;
52
- output?: SpanInputOutput | null;
53
- error?: T["error"] | NonNullable<unknown>;
54
- };
55
-
56
- export type PendingSpan<T extends BaseSpan> = Omit<
57
- T,
58
- "traceId" | "timestamps"
59
- > & {
60
- timestamps: Omit<T["timestamps"], "finishedAt"> & {
61
- finishedAt?: number | null;
62
- };
63
- };
64
-
65
- export type BaseSpan = ConvertServerSpan<ServerBaseSpan>;
66
-
67
- export type PendingBaseSpan = PendingSpan<BaseSpan>;
68
-
69
- // vendor is deprecated, and we try to force the available models here
70
- export type LLMSpan = ConvertServerSpan<
71
- Omit<ServerLLMSpan, "vendor" | "model">
72
- > & { model: string };
73
- export type PendingLLMSpan = PendingSpan<LLMSpan>;
74
-
75
- export type RAGSpan = ConvertServerSpan<ServerRAGSpan>;
76
- export type PendingRAGSpan = PendingSpan<RAGSpan>;
77
-
78
- export type RESTEvaluation = SnakeToCamelCaseNested<
79
- Omit<ServerRESTEvaluation, "error">
80
- > & { error?: ServerRESTEvaluation["error"] };
81
-
82
- export type ErrorCapture = ServerErrorCapture;
package/src/utils.ts DELETED
@@ -1,205 +0,0 @@
1
- import { convertUint8ArrayToBase64 } from "@ai-sdk/provider-utils";
2
- import { type CoreMessage, type ImagePart } from "ai";
3
- import { z } from "zod";
4
- import { type ErrorCapture } from "./server/types/tracer";
5
- import { chatMessageSchema } from "./server/types/tracer.generated";
6
- import { type ChatMessage, type SpanInputOutput } from "./types";
7
-
8
- const convertImageToUrl = (
9
- image: ImagePart["image"],
10
- mimeType: string | undefined
11
- ) => {
12
- try {
13
- return image instanceof URL
14
- ? image.toString()
15
- : typeof image === "string"
16
- ? image
17
- : `data:${mimeType ?? "image/jpeg"};base64,${convertUint8ArrayToBase64(
18
- image as any
19
- )}`;
20
- } catch (e) {
21
- console.error("[LangWatch] error converting vercel ui image to url:", e);
22
- return "";
23
- }
24
- };
25
-
26
- // Mostly copied from https://github.com/vercel/ai/blob/main/packages/openai/src/convert-to-openai-chat-messages.ts
27
- export function convertFromVercelAIMessages(
28
- messages: CoreMessage[]
29
- ): ChatMessage[] {
30
- const lwMessages: ChatMessage[] = [];
31
-
32
- for (const { role, content } of messages) {
33
- switch (role) {
34
- case "system": {
35
- lwMessages.push({ role: "system", content });
36
- break;
37
- }
38
-
39
- case "user": {
40
- if (
41
- Array.isArray(content) &&
42
- content.length === 1 &&
43
- content[0]?.type === "text"
44
- ) {
45
- lwMessages.push({ role: "user", content: content[0].text });
46
- break;
47
- }
48
-
49
- lwMessages.push({
50
- role: "user",
51
- content: Array.isArray(content)
52
- ? content.map((part) => {
53
- switch (part.type) {
54
- case "text": {
55
- return { type: "text", text: part.text };
56
- }
57
- case "image": {
58
- return {
59
- type: "image_url",
60
- image_url: {
61
- url: convertImageToUrl(part.image, part.mimeType),
62
- },
63
- };
64
- }
65
- default: {
66
- return part as any;
67
- }
68
- }
69
- })
70
- : content,
71
- });
72
-
73
- break;
74
- }
75
-
76
- case "assistant": {
77
- let text = "";
78
- const toolCalls: Array<{
79
- id: string;
80
- type: "function";
81
- function: { name: string; arguments: string };
82
- }> = [];
83
-
84
- if (Array.isArray(content)) {
85
- for (const part of content) {
86
- switch (part.type) {
87
- case "text": {
88
- text += part.text;
89
- break;
90
- }
91
- case "tool-call": {
92
- toolCalls.push({
93
- id: part.toolCallId,
94
- type: "function",
95
- function: {
96
- name: part.toolName,
97
- arguments: JSON.stringify(part.args),
98
- },
99
- });
100
- break;
101
- }
102
- default: {
103
- const _exhaustiveCheck = part;
104
- throw new Error(`Unsupported part: ${_exhaustiveCheck as any}`);
105
- }
106
- }
107
- }
108
- } else {
109
- text = content;
110
- }
111
-
112
- lwMessages.push({
113
- role: "assistant",
114
- content: text,
115
- tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
116
- });
117
-
118
- break;
119
- }
120
-
121
- case "tool": {
122
- for (const toolResponse of content) {
123
- lwMessages.push({
124
- role: "tool",
125
- tool_call_id: toolResponse.toolCallId,
126
- content: JSON.stringify(toolResponse.result),
127
- });
128
- }
129
- break;
130
- }
131
-
132
- default: {
133
- const _exhaustiveCheck = role;
134
- throw new Error(`Unsupported role: ${_exhaustiveCheck as any}`);
135
- }
136
- }
137
- }
138
-
139
- return lwMessages;
140
- }
141
-
142
- export const captureError = (error: unknown): ErrorCapture => {
143
- if (
144
- error &&
145
- typeof error === "object" &&
146
- "has_error" in error &&
147
- "message" in error &&
148
- "stacktrace" in error
149
- ) {
150
- return error as ErrorCapture;
151
- } else if (error instanceof Error) {
152
- return {
153
- has_error: true,
154
- message: error.message,
155
- stacktrace: error.stack ? error.stack.split("\n") : [],
156
- };
157
- } else if (typeof error === "object" && error !== null) {
158
- const err = error as { message: unknown; stack: unknown };
159
- const message =
160
- typeof err.message === "string"
161
- ? err.message
162
- : "An unknown error occurred";
163
- const stacktrace =
164
- typeof err.stack === "string"
165
- ? err.stack.split("\n")
166
- : Array.isArray(err.stack) &&
167
- err.stack.length > 0 &&
168
- typeof err.stack[0] === "string"
169
- ? err.stack
170
- : ["No stack trace available"];
171
- return {
172
- has_error: true,
173
- message,
174
- stacktrace,
175
- };
176
- } else {
177
- // Handle primitives and other types that are not an error object
178
- return {
179
- has_error: true,
180
- message: String(error),
181
- stacktrace: [],
182
- };
183
- }
184
- };
185
-
186
- export const autoconvertTypedValues = (value: unknown): SpanInputOutput => {
187
- if (typeof value === "string") {
188
- return { type: "text", value };
189
- }
190
-
191
- const chatMessages = z.array(chatMessageSchema).safeParse(value);
192
- if (Array.isArray(value) && chatMessages.success) {
193
- return {
194
- type: "chat_messages",
195
- value: chatMessages.data,
196
- };
197
- }
198
-
199
- try {
200
- JSON.stringify(value);
201
- return { type: "json", value: value as object };
202
- } catch (e) {
203
- return { type: "raw", value: value as any };
204
- }
205
- };