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
@@ -1,86 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react'
2
-
3
- export const useScrollAnchor = () => {
4
- const messagesRef = useRef<HTMLDivElement>(null)
5
- const scrollRef = useRef<HTMLDivElement>(null)
6
- const visibilityRef = useRef<HTMLDivElement>(null)
7
-
8
- const [isAtBottom, setIsAtBottom] = useState(true)
9
- const [isVisible, setIsVisible] = useState(false)
10
-
11
- const scrollToBottom = useCallback(() => {
12
- if (messagesRef.current) {
13
- messagesRef.current.scrollIntoView({
14
- block: 'end',
15
- behavior: 'smooth'
16
- })
17
- }
18
- }, [])
19
-
20
- useEffect(() => {
21
- if (messagesRef.current) {
22
- if (isAtBottom && !isVisible) {
23
- messagesRef.current.scrollIntoView({
24
- block: 'end'
25
- })
26
- }
27
- }
28
- }, [isAtBottom, isVisible])
29
-
30
- useEffect(() => {
31
- const { current } = scrollRef
32
-
33
- if (current) {
34
- const handleScroll = (event: Event) => {
35
- const target = event.target as HTMLDivElement
36
- const offset = 25
37
- const isAtBottom =
38
- target.scrollTop + target.clientHeight >= target.scrollHeight - offset
39
-
40
- setIsAtBottom(isAtBottom)
41
- }
42
-
43
- current.addEventListener('scroll', handleScroll, {
44
- passive: true
45
- })
46
-
47
- return () => {
48
- current.removeEventListener('scroll', handleScroll)
49
- }
50
- }
51
- }, [])
52
-
53
- useEffect(() => {
54
- if (visibilityRef.current) {
55
- let observer = new IntersectionObserver(
56
- entries => {
57
- entries.forEach(entry => {
58
- if (entry.isIntersecting) {
59
- setIsVisible(true)
60
- } else {
61
- setIsVisible(false)
62
- }
63
- })
64
- },
65
- {
66
- rootMargin: '0px 0px -150px 0px'
67
- }
68
- )
69
-
70
- observer.observe(visibilityRef.current)
71
-
72
- return () => {
73
- observer.disconnect()
74
- }
75
- }
76
- })
77
-
78
- return {
79
- messagesRef,
80
- scrollRef,
81
- visibilityRef,
82
- scrollToBottom,
83
- isAtBottom,
84
- isVisible
85
- }
86
- }
@@ -1,60 +0,0 @@
1
- 'use client'
2
-
3
- import * as React from 'react'
4
-
5
- const LOCAL_STORAGE_KEY = 'sidebar'
6
-
7
- interface SidebarContext {
8
- isSidebarOpen: boolean
9
- toggleSidebar: () => void
10
- isLoading: boolean
11
- }
12
-
13
- const SidebarContext = React.createContext<SidebarContext | undefined>(
14
- undefined
15
- )
16
-
17
- export function useSidebar() {
18
- const context = React.useContext(SidebarContext)
19
- if (!context) {
20
- throw new Error('useSidebarContext must be used within a SidebarProvider')
21
- }
22
- return context
23
- }
24
-
25
- interface SidebarProviderProps {
26
- children: React.ReactNode
27
- }
28
-
29
- export function SidebarProvider({ children }: SidebarProviderProps) {
30
- const [isSidebarOpen, setSidebarOpen] = React.useState(true)
31
- const [isLoading, setLoading] = React.useState(true)
32
-
33
- React.useEffect(() => {
34
- const value = localStorage.getItem(LOCAL_STORAGE_KEY)
35
- if (value) {
36
- setSidebarOpen(JSON.parse(value))
37
- }
38
- setLoading(false)
39
- }, [])
40
-
41
- const toggleSidebar = () => {
42
- setSidebarOpen(value => {
43
- const newState = !value
44
- localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newState))
45
- return newState
46
- })
47
- }
48
-
49
- if (isLoading) {
50
- return null
51
- }
52
-
53
- return (
54
- <SidebarContext.Provider
55
- value={{ isSidebarOpen, toggleSidebar, isLoading }}
56
- >
57
- {children}
58
- </SidebarContext.Provider>
59
- )
60
- }
@@ -1,25 +0,0 @@
1
- import { StreamableValue, readStreamableValue } from 'ai/rsc'
2
- import { useEffect, useState } from 'react'
3
-
4
- export const useStreamableText = (
5
- content: string | StreamableValue<string>
6
- ) => {
7
- const [rawContent, setRawContent] = useState(
8
- typeof content === 'string' ? content : ''
9
- )
10
-
11
- useEffect(() => {
12
- ;(async () => {
13
- if (typeof content === 'object') {
14
- let value = ''
15
- for await (const delta of readStreamableValue(content)) {
16
- if (typeof delta === 'string') {
17
- setRawContent((value = value + delta))
18
- }
19
- }
20
- }
21
- })()
22
- }, [content])
23
-
24
- return rawContent
25
- }
@@ -1,41 +0,0 @@
1
- import { CoreMessage } from 'ai'
2
-
3
- export type Message = CoreMessage & {
4
- id: string
5
- }
6
-
7
- export interface Chat extends Record<string, any> {
8
- id: string
9
- title: string
10
- createdAt: Date
11
- userId: string
12
- path: string
13
- messages: Message[]
14
- sharePath?: string
15
- }
16
-
17
- export type ServerActionResult<Result> = Promise<
18
- | Result
19
- | {
20
- error: string
21
- }
22
- >
23
-
24
- export interface Session {
25
- user: {
26
- id: string
27
- email: string
28
- }
29
- }
30
-
31
- export interface AuthResult {
32
- type: string
33
- message: string
34
- }
35
-
36
- export interface User extends Record<string, any> {
37
- id: string
38
- email: string
39
- password: string
40
- salt: string
41
- }
@@ -1,89 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx'
2
- import { customAlphabet } from 'nanoid'
3
- import { twMerge } from 'tailwind-merge'
4
-
5
- export function cn(...inputs: ClassValue[]) {
6
- return twMerge(clsx(inputs))
7
- }
8
-
9
- export const nanoid = customAlphabet(
10
- '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
11
- 7
12
- ) // 7-character random string
13
-
14
- export async function fetcher<JSON = any>(
15
- input: RequestInfo,
16
- init?: RequestInit
17
- ): Promise<JSON> {
18
- const res = await fetch(input, init)
19
-
20
- if (!res.ok) {
21
- const json = await res.json()
22
- if (json.error) {
23
- const error = new Error(json.error) as Error & {
24
- status: number
25
- }
26
- error.status = res.status
27
- throw error
28
- } else {
29
- throw new Error('An unexpected error occurred')
30
- }
31
- }
32
-
33
- return res.json()
34
- }
35
-
36
- export function formatDate(input: string | number | Date): string {
37
- const date = new Date(input)
38
- return date.toLocaleDateString('en-US', {
39
- month: 'long',
40
- day: 'numeric',
41
- year: 'numeric'
42
- })
43
- }
44
-
45
- export const formatNumber = (value: number) =>
46
- new Intl.NumberFormat('en-US', {
47
- style: 'currency',
48
- currency: 'USD'
49
- }).format(value)
50
-
51
- export const runAsyncFnWithoutBlocking = (
52
- fn: (...args: any) => Promise<any>
53
- ) => {
54
- fn()
55
- }
56
-
57
- export const sleep = (ms: number) =>
58
- new Promise(resolve => setTimeout(resolve, ms))
59
-
60
- export const getStringFromBuffer = (buffer: ArrayBuffer) =>
61
- Array.from(new Uint8Array(buffer))
62
- .map(b => b.toString(16).padStart(2, '0'))
63
- .join('')
64
-
65
- export enum ResultCode {
66
- InvalidCredentials = 'INVALID_CREDENTIALS',
67
- InvalidSubmission = 'INVALID_SUBMISSION',
68
- UserAlreadyExists = 'USER_ALREADY_EXISTS',
69
- UnknownError = 'UNKNOWN_ERROR',
70
- UserCreated = 'USER_CREATED',
71
- UserLoggedIn = 'USER_LOGGED_IN'
72
- }
73
-
74
- export const getMessageFromCode = (resultCode: string) => {
75
- switch (resultCode) {
76
- case ResultCode.InvalidCredentials:
77
- return 'Invalid credentials!'
78
- case ResultCode.InvalidSubmission:
79
- return 'Invalid submission, please try again!'
80
- case ResultCode.UserAlreadyExists:
81
- return 'User already exists, please log in!'
82
- case ResultCode.UserCreated:
83
- return 'User created, welcome!'
84
- case ResultCode.UnknownError:
85
- return 'Something went wrong, please try again!'
86
- case ResultCode.UserLoggedIn:
87
- return 'Logged in!'
88
- }
89
- }
@@ -1,8 +0,0 @@
1
- import NextAuth from 'next-auth'
2
- import { authConfig } from './auth.config'
3
-
4
- export default NextAuth(authConfig).auth
5
-
6
- export const config = {
7
- matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)']
8
- }
@@ -1,5 +0,0 @@
1
- /// <reference types="next" />
2
- /// <reference types="next/image-types/global" />
3
-
4
- // NOTE: This file should not be edited
5
- // see https://nextjs.org/docs/basic-features/typescript for more information.
@@ -1,16 +0,0 @@
1
- /** @type {import('next').NextConfig} */
2
- module.exports = {
3
- experimental: {
4
- instrumentationHook: true,
5
- },
6
- images: {
7
- remotePatterns: [
8
- {
9
- protocol: 'https',
10
- hostname: 'avatars.githubusercontent.com',
11
- port: '',
12
- pathname: '**'
13
- }
14
- ]
15
- }
16
- }