langwatch 0.2.0 → 0.3.0-prerelease.2
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/LICENSE +7 -0
- package/README.md +268 -1
- package/dist/chunk-4BZATFKJ.mjs +181 -0
- package/dist/chunk-4BZATFKJ.mjs.map +1 -0
- package/dist/chunk-CSC3CMIT.mjs +118 -0
- package/dist/chunk-CSC3CMIT.mjs.map +1 -0
- package/dist/chunk-F63YKTXA.mjs +47 -0
- package/dist/chunk-F63YKTXA.mjs.map +1 -0
- package/dist/chunk-G3AUABT7.js +4 -0
- package/dist/chunk-G3AUABT7.js.map +1 -0
- package/dist/chunk-HPC6Z7J4.js +118 -0
- package/dist/chunk-HPC6Z7J4.js.map +1 -0
- package/dist/chunk-KGDAENGD.js +50 -0
- package/dist/chunk-KGDAENGD.js.map +1 -0
- package/dist/chunk-LD74LVRU.js +47 -0
- package/dist/chunk-LD74LVRU.js.map +1 -0
- package/dist/chunk-OM7VY3XT.mjs +4 -0
- package/dist/chunk-PCQVQ7SB.js +45 -0
- package/dist/chunk-PCQVQ7SB.js.map +1 -0
- package/dist/chunk-PMBEK6YE.mjs +424 -0
- package/dist/chunk-PMBEK6YE.mjs.map +1 -0
- package/dist/chunk-PR3JDWC3.mjs +50 -0
- package/dist/chunk-PR3JDWC3.mjs.map +1 -0
- package/dist/chunk-PTJ6AAI7.js +360 -0
- package/dist/chunk-PTJ6AAI7.js.map +1 -0
- package/dist/chunk-QEWDG5QE.mjs +45 -0
- package/dist/chunk-QEWDG5QE.mjs.map +1 -0
- package/dist/chunk-REUCVT7A.mjs +39 -0
- package/dist/chunk-REUCVT7A.mjs.map +1 -0
- package/dist/chunk-SVJ7SCGB.js +424 -0
- package/dist/chunk-SVJ7SCGB.js.map +1 -0
- package/dist/chunk-VJSOCNPA.js +181 -0
- package/dist/chunk-VJSOCNPA.js.map +1 -0
- package/dist/chunk-WM2GRSRW.js +39 -0
- package/dist/chunk-WM2GRSRW.js.map +1 -0
- package/dist/chunk-Z5J5UI5E.mjs +360 -0
- package/dist/chunk-Z5J5UI5E.mjs.map +1 -0
- package/dist/client-B2HqIKg6.d.ts +51 -0
- package/dist/client-XyCqclCi.d.mts +51 -0
- package/dist/client-browser.d.mts +8 -0
- package/dist/client-browser.d.ts +8 -0
- package/dist/client-browser.js +83 -0
- package/dist/client-browser.js.map +1 -0
- package/dist/client-browser.mjs +83 -0
- package/dist/client-browser.mjs.map +1 -0
- package/dist/client-node.d.mts +8 -0
- package/dist/client-node.d.ts +8 -0
- package/dist/client-node.js +90 -0
- package/dist/client-node.js.map +1 -0
- package/dist/client-node.mjs +90 -0
- package/dist/client-node.mjs.map +1 -0
- package/dist/evaluation/index.d.mts +897 -0
- package/dist/evaluation/index.d.ts +897 -0
- package/dist/evaluation/index.js +13 -0
- package/dist/evaluation/index.js.map +1 -0
- package/dist/evaluation/index.mjs +13 -0
- package/dist/evaluation/index.mjs.map +1 -0
- package/dist/filterable-batch-span-processor-zO5kcjBY.d.mts +64 -0
- package/dist/filterable-batch-span-processor-zO5kcjBY.d.ts +64 -0
- package/dist/index.d.mts +45 -1027
- package/dist/index.d.ts +45 -1027
- package/dist/index.js +11 -27291
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +23 -956
- package/dist/index.mjs.map +1 -1
- package/dist/observability/index.d.mts +260 -0
- package/dist/observability/index.d.ts +260 -0
- package/dist/observability/index.js +20 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +20 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/observability/instrumentation/langchain/index.d.mts +40 -0
- package/dist/observability/instrumentation/langchain/index.d.ts +40 -0
- package/dist/observability/instrumentation/langchain/index.js +666 -0
- package/dist/observability/instrumentation/langchain/index.js.map +1 -0
- package/dist/observability/instrumentation/langchain/index.mjs +666 -0
- package/dist/observability/instrumentation/langchain/index.mjs.map +1 -0
- package/dist/prompt/index.d.mts +10 -0
- package/dist/prompt/index.d.ts +10 -0
- package/dist/prompt/index.js +18 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/index.mjs +18 -0
- package/dist/prompt/index.mjs.map +1 -0
- package/dist/prompt-BXJWdbQp.d.mts +1967 -0
- package/dist/prompt-BXJWdbQp.d.ts +1967 -0
- package/dist/record-evaluation-CmxMXa-3.d.mts +25 -0
- package/dist/record-evaluation-CmxMXa-3.d.ts +25 -0
- package/dist/trace-D-bZOuqb.d.mts +622 -0
- package/dist/trace-G2312klE.d.ts +622 -0
- package/package.json +86 -37
- package/.eslintrc.cjs +0 -37
- package/copy-types.sh +0 -17
- package/dist/chunk-LKD2K67J.mjs +0 -717
- package/dist/chunk-LKD2K67J.mjs.map +0 -1
- package/dist/utils-Cv-rUjJ1.d.mts +0 -313
- package/dist/utils-Cv-rUjJ1.d.ts +0 -313
- package/dist/utils.d.mts +0 -2
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -709
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -11
- package/example/.env.example +0 -12
- package/example/.eslintrc.json +0 -26
- package/example/LICENSE +0 -13
- package/example/README.md +0 -12
- package/example/app/(chat)/chat/[id]/page.tsx +0 -60
- package/example/app/(chat)/layout.tsx +0 -14
- package/example/app/(chat)/page.tsx +0 -27
- package/example/app/actions.ts +0 -156
- package/example/app/globals.css +0 -76
- package/example/app/guardrails/page.tsx +0 -26
- package/example/app/langchain/page.tsx +0 -27
- package/example/app/langchain-rag/page.tsx +0 -28
- package/example/app/late-update/page.tsx +0 -27
- package/example/app/layout.tsx +0 -64
- package/example/app/login/actions.ts +0 -71
- package/example/app/login/page.tsx +0 -18
- package/example/app/manual/page.tsx +0 -27
- package/example/app/new/page.tsx +0 -5
- package/example/app/opengraph-image.png +0 -0
- package/example/app/share/[id]/page.tsx +0 -58
- package/example/app/signup/actions.ts +0 -111
- package/example/app/signup/page.tsx +0 -18
- package/example/app/twitter-image.png +0 -0
- package/example/auth.config.ts +0 -42
- package/example/auth.ts +0 -45
- package/example/components/button-scroll-to-bottom.tsx +0 -36
- package/example/components/chat-history.tsx +0 -49
- package/example/components/chat-list.tsx +0 -52
- package/example/components/chat-message-actions.tsx +0 -40
- package/example/components/chat-message.tsx +0 -80
- package/example/components/chat-panel.tsx +0 -139
- package/example/components/chat-share-dialog.tsx +0 -95
- package/example/components/chat.tsx +0 -84
- package/example/components/clear-history.tsx +0 -75
- package/example/components/empty-screen.tsx +0 -38
- package/example/components/external-link.tsx +0 -29
- package/example/components/footer.tsx +0 -19
- package/example/components/header.tsx +0 -114
- package/example/components/login-button.tsx +0 -42
- package/example/components/login-form.tsx +0 -97
- package/example/components/markdown.tsx +0 -9
- package/example/components/prompt-form.tsx +0 -115
- package/example/components/providers.tsx +0 -17
- package/example/components/sidebar-actions.tsx +0 -125
- package/example/components/sidebar-desktop.tsx +0 -19
- package/example/components/sidebar-footer.tsx +0 -16
- package/example/components/sidebar-item.tsx +0 -124
- package/example/components/sidebar-items.tsx +0 -42
- package/example/components/sidebar-list.tsx +0 -38
- package/example/components/sidebar-mobile.tsx +0 -31
- package/example/components/sidebar-toggle.tsx +0 -24
- package/example/components/sidebar.tsx +0 -21
- package/example/components/signup-form.tsx +0 -95
- package/example/components/stocks/events-skeleton.tsx +0 -31
- package/example/components/stocks/events.tsx +0 -30
- package/example/components/stocks/index.tsx +0 -36
- package/example/components/stocks/message.tsx +0 -134
- package/example/components/stocks/spinner.tsx +0 -16
- package/example/components/stocks/stock-purchase.tsx +0 -146
- package/example/components/stocks/stock-skeleton.tsx +0 -22
- package/example/components/stocks/stock.tsx +0 -210
- package/example/components/stocks/stocks-skeleton.tsx +0 -9
- package/example/components/stocks/stocks.tsx +0 -67
- package/example/components/tailwind-indicator.tsx +0 -14
- package/example/components/theme-toggle.tsx +0 -31
- package/example/components/ui/alert-dialog.tsx +0 -141
- package/example/components/ui/badge.tsx +0 -36
- package/example/components/ui/button.tsx +0 -57
- package/example/components/ui/codeblock.tsx +0 -148
- package/example/components/ui/dialog.tsx +0 -122
- package/example/components/ui/dropdown-menu.tsx +0 -205
- package/example/components/ui/icons.tsx +0 -507
- package/example/components/ui/input.tsx +0 -25
- package/example/components/ui/label.tsx +0 -26
- package/example/components/ui/select.tsx +0 -164
- package/example/components/ui/separator.tsx +0 -31
- package/example/components/ui/sheet.tsx +0 -140
- package/example/components/ui/sonner.tsx +0 -31
- package/example/components/ui/switch.tsx +0 -29
- package/example/components/ui/textarea.tsx +0 -24
- package/example/components/ui/tooltip.tsx +0 -30
- package/example/components/user-menu.tsx +0 -53
- package/example/components.json +0 -17
- package/example/instrumentation.ts +0 -11
- package/example/lib/chat/guardrails.tsx +0 -181
- package/example/lib/chat/langchain-rag.tsx +0 -191
- package/example/lib/chat/langchain.tsx +0 -112
- package/example/lib/chat/late-update.tsx +0 -208
- package/example/lib/chat/manual.tsx +0 -605
- package/example/lib/chat/vercel-ai.tsx +0 -576
- package/example/lib/hooks/use-copy-to-clipboard.tsx +0 -33
- package/example/lib/hooks/use-enter-submit.tsx +0 -23
- package/example/lib/hooks/use-local-storage.ts +0 -24
- package/example/lib/hooks/use-scroll-anchor.tsx +0 -86
- package/example/lib/hooks/use-sidebar.tsx +0 -60
- package/example/lib/hooks/use-streamable-text.ts +0 -25
- package/example/lib/types.ts +0 -41
- package/example/lib/utils.ts +0 -89
- package/example/middleware.ts +0 -8
- package/example/next-env.d.ts +0 -5
- package/example/next.config.js +0 -16
- package/example/package-lock.json +0 -10917
- package/example/package.json +0 -84
- package/example/pnpm-lock.yaml +0 -5712
- package/example/postcss.config.js +0 -6
- package/example/prettier.config.cjs +0 -34
- package/example/public/apple-touch-icon.png +0 -0
- package/example/public/favicon-16x16.png +0 -0
- package/example/public/favicon.ico +0 -0
- package/example/public/next.svg +0 -1
- package/example/public/thirteen.svg +0 -1
- package/example/public/vercel.svg +0 -1
- package/example/tailwind.config.ts +0 -81
- package/example/tsconfig.json +0 -35
- package/src/LangWatchExporter.ts +0 -96
- package/src/evaluations.ts +0 -219
- package/src/index.test.ts +0 -402
- package/src/index.ts +0 -596
- package/src/langchain.ts +0 -557
- package/src/server/types/.gitkeep +0 -0
- package/src/typeUtils.ts +0 -89
- package/src/types.ts +0 -82
- package/src/utils.ts +0 -205
- package/ts-to-zod.config.js +0 -24
- package/tsconfig.json +0 -32
- package/tsup.config.ts +0 -10
- package/vitest.config.ts +0 -8
- /package/dist/{utils.mjs.map → chunk-OM7VY3XT.mjs.map} +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2025 LangWatch
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,270 @@
|
|
|
1
1
|
# LangWatch TypeScript SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://app.langwatch.ai/logo.svg" alt="LangWatch Logo" width="120"/>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<b>Observability, Prompt Management, and Evaluation for JS LLM/GenAI Apps</b><br/>
|
|
9
|
+
<a href="https://langwatch.ai">langwatch.ai</a> | <a href="https://github.com/langwatch/langwatch">GitHub</a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://www.npmjs.com/package/langwatch"><img src="https://img.shields.io/npm/v/langwatch.svg?style=flat-square" alt="npm version"></a>
|
|
14
|
+
<a href="https://opensource.org/licenses/Apache-2.0"><img src="https://img.shields.io/badge/license-Apache--2.0-blue.svg?style=flat-square" alt="License"></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
LangWatch helps you monitor, debug, and optimize your LLM/GenAI applications. This TypeScript SDK provides:
|
|
20
|
+
|
|
21
|
+
- **OpenTelemetry-based tracing** for LLM, RAG, tool, and workflow spans
|
|
22
|
+
- **Prompt management** with versioning and variable interpolation
|
|
23
|
+
- **Automated and custom evaluation** of model outputs
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Features
|
|
28
|
+
|
|
29
|
+
- 📊 **Observability**: Trace LLM, RAG, tool, and workflow operations with rich context
|
|
30
|
+
- 📝 **Prompt Management**: Fetch, version, and interpolate prompts with variables
|
|
31
|
+
- 🧪 **Evaluation**: Run and record evaluations, with results linked to traces
|
|
32
|
+
- 🔌 **OpenTelemetry**: Integrates with your existing observability stack
|
|
33
|
+
- 🦾 **TypeScript-first**: Full type safety and modern API design
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install langwatch
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 🚀 Getting Started
|
|
46
|
+
|
|
47
|
+
Here's the fastest way to get LangWatch working in your app:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { setupLangWatch } from "langwatch/node";
|
|
51
|
+
import { getLangWatchTracer } from "langwatch";
|
|
52
|
+
|
|
53
|
+
// 1. Initialize LangWatch (Node.js example)
|
|
54
|
+
await setupLangWatch({ apiKey: "YOUR_API_KEY" }); // By default, this will read the LANGWATCH_API_KEY environment variable
|
|
55
|
+
|
|
56
|
+
// 2. Create a tracer and span
|
|
57
|
+
const tracer = getLangWatchTracer("my-app");
|
|
58
|
+
const span = tracer.startSpan("my-operation");
|
|
59
|
+
span.setInput("User prompt");
|
|
60
|
+
span.setOutput("Model response");
|
|
61
|
+
span.end();
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
> **Tip:** For use in the browser, use `import { setupLangWatch } from "langwatch/browser"` instead.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Quick Start: Core Features
|
|
69
|
+
|
|
70
|
+
### 1. Tracing & Observability
|
|
71
|
+
|
|
72
|
+
- **Get a tracer:**
|
|
73
|
+
```ts
|
|
74
|
+
const tracer = getLangWatchTracer("my-app");
|
|
75
|
+
```
|
|
76
|
+
- **Start a span and record input/output:**
|
|
77
|
+
```ts
|
|
78
|
+
const span = tracer.startSpan("call-llm");
|
|
79
|
+
span.setType("llm");
|
|
80
|
+
span.setInput("User prompt"); // Main way to record input
|
|
81
|
+
span.setOutput("Model response"); // Main way to record output
|
|
82
|
+
span.end();
|
|
83
|
+
```
|
|
84
|
+
> **Note:** `setInput` and `setOutput` are the primary methods to record input/output. Use `setInputString`/`setOutputString` for plain text, or pass any serializable value.
|
|
85
|
+
|
|
86
|
+
- **Use withActiveSpan for automatic error handling:**
|
|
87
|
+
```ts
|
|
88
|
+
await tracer.withActiveSpan("my-operation", async (span) => {
|
|
89
|
+
span.setType("llm");
|
|
90
|
+
span.setInput("User prompt");
|
|
91
|
+
// ... your code ...
|
|
92
|
+
span.setOutput("Model response");
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- **Record an evaluation directly on a span:**
|
|
97
|
+
```ts
|
|
98
|
+
span.recordEvaluation({ name: "My Eval", passed: true, score: 1.0 });
|
|
99
|
+
```
|
|
100
|
+
> **Note:** This associates evaluation results with a specific span (operation or model call).
|
|
101
|
+
|
|
102
|
+
- **(Optional) Add GenAI message events:**
|
|
103
|
+
```ts
|
|
104
|
+
span.addGenAISystemMessageEvent({ content: "You are a helpful assistant." });
|
|
105
|
+
span.addGenAIUserMessageEvent({ content: "Hello!" });
|
|
106
|
+
span.addGenAIAssistantMessageEvent({ content: "Hi! How can I help you?" });
|
|
107
|
+
span.addGenAIToolMessageEvent({ content: "Tool result", id: "tool-1" });
|
|
108
|
+
span.addGenAIChoiceEvent({ finish_reason: "stop", index: 0, message: { content: "Response" } });
|
|
109
|
+
```
|
|
110
|
+
> **Advanced:** The `addGenAI...` methods are optional and mainly for advanced/manual instrumentation. Most users do not need these unless you want fine-grained message event logs.
|
|
111
|
+
|
|
112
|
+
- **RAG context, metrics, and model information:**
|
|
113
|
+
```ts
|
|
114
|
+
span.setRAGContexts([{ document_id: "doc1", chunk_id: "c1", content: "..." }]);
|
|
115
|
+
span.setMetrics({ promptTokens: 10, completionTokens: 20, cost: 0.002 });
|
|
116
|
+
span.setRequestModel("gpt-4");
|
|
117
|
+
span.setResponseModel("gpt-4");
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 2. Prompt Management
|
|
121
|
+
|
|
122
|
+
- **Fetch and format a prompt:**
|
|
123
|
+
```ts
|
|
124
|
+
import { getPrompt } from "langwatch/prompt";
|
|
125
|
+
const prompt = await getPrompt("prompt-id");
|
|
126
|
+
const compiledPrompt = await getPrompt("prompt-id", { user: "Alice" });
|
|
127
|
+
```
|
|
128
|
+
- **Fetch a specific prompt version:**
|
|
129
|
+
```ts
|
|
130
|
+
import { getPromptVersion } from "langwatch/prompt";
|
|
131
|
+
const compiledPrompt = await getPromptVersion("prompt-id", "version-id", {
|
|
132
|
+
user: "Alice",
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> **Note:** The prompt APIs (`getPrompt`, `getPromptVersion`) automatically create spans and add useful tracing information.
|
|
137
|
+
|
|
138
|
+
### 3. Evaluation
|
|
139
|
+
|
|
140
|
+
- **Run an evaluation:**
|
|
141
|
+
```ts
|
|
142
|
+
import { runEvaluation } from "langwatch/evaluation";
|
|
143
|
+
const result = await runEvaluation({
|
|
144
|
+
slug: "helpfulness",
|
|
145
|
+
data: { input: "Hi", output: "Hello!" }
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
- **Record a custom evaluation:**
|
|
149
|
+
```ts
|
|
150
|
+
import { recordEvaluation } from "langwatch/evaluation";
|
|
151
|
+
recordEvaluation({
|
|
152
|
+
name: "Manual Eval",
|
|
153
|
+
passed: true,
|
|
154
|
+
score: 0.9,
|
|
155
|
+
details: "Looks good!"
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
> **Note:** The evaluation APIs (`runEvaluation`, `recordEvaluation`) also create spans and add tracing/evaluation info automatically.
|
|
159
|
+
|
|
160
|
+
### 4. LangChain Integration
|
|
161
|
+
|
|
162
|
+
- **Use with LangChain:**
|
|
163
|
+
```ts
|
|
164
|
+
import { LangWatchCallbackHandler } from "langwatch/observability/instrumentation/langchain";
|
|
165
|
+
|
|
166
|
+
const chatModel = new ChatOpenAI({
|
|
167
|
+
callbacks: [new LangWatchCallbackHandler()],
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## API Reference
|
|
174
|
+
|
|
175
|
+
### Setup
|
|
176
|
+
- `setupLangWatch(options?)` → Initialize LangWatch (from `langwatch/node` or `langwatch/browser`)
|
|
177
|
+
|
|
178
|
+
### Observability
|
|
179
|
+
- `getLangWatchTracer(name, version?)` → `LangWatchTracer`
|
|
180
|
+
- `LangWatchTracer` methods: `.startSpan()`, `.startActiveSpan()`, `.withActiveSpan()`
|
|
181
|
+
- `LangWatchSpan` methods:
|
|
182
|
+
- `.setType()`, `.setInput()`, `.setOutput()`, `.setInputString()`, `.setOutputString()`
|
|
183
|
+
- `.recordEvaluation()`, `.setRequestModel()`, `.setResponseModel()`
|
|
184
|
+
- `.setRAGContexts()`, `.setRAGContext()`, `.setMetrics()`, `.setSelectedPrompt()`
|
|
185
|
+
- `.addGenAISystemMessageEvent()`, `.addGenAIUserMessageEvent()`, `.addGenAIAssistantMessageEvent()`, `.addGenAIToolMessageEvent()`, `.addGenAIChoiceEvent()`
|
|
186
|
+
|
|
187
|
+
### Prompt
|
|
188
|
+
- `getPrompt(promptId, variables?)` → fetches and formats a prompt (creates a span automatically)
|
|
189
|
+
- `getPromptVersion(promptId, versionId, variables?)` → fetches specific prompt version
|
|
190
|
+
|
|
191
|
+
### Evaluation
|
|
192
|
+
- `runEvaluation(details)` → runs an evaluation and returns result (creates a span automatically)
|
|
193
|
+
- `recordEvaluation(details, attributes?)` → records a custom evaluation span (creates a span automatically)
|
|
194
|
+
|
|
195
|
+
### LangChain Integration
|
|
196
|
+
- `LangWatchCallbackHandler` → LangChain callback handler for automatic instrumentation
|
|
197
|
+
|
|
198
|
+
### Exporters & Processors
|
|
199
|
+
- `LangWatchExporter` → Custom OpenTelemetry exporter
|
|
200
|
+
- `FilterableBatchSpanProcessor` → Span processor with filtering capabilities
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Types
|
|
205
|
+
|
|
206
|
+
### Core Types
|
|
207
|
+
- `LangWatchSpan` → Extended OpenTelemetry span with LangWatch methods
|
|
208
|
+
- `LangWatchTracer` → Extended OpenTelemetry tracer with LangWatch methods
|
|
209
|
+
- `SpanType` → Union of supported span types (`"llm"`, `"chain"`, `"tool"`, `"agent"`, etc.)
|
|
210
|
+
|
|
211
|
+
### Evaluation Types
|
|
212
|
+
- `EvaluationDetails` → Configuration for running evaluations
|
|
213
|
+
- `SingleEvaluationResult` → Result from evaluation runs
|
|
214
|
+
- `RecordedEvaluationDetails` → Configuration for recording custom evaluations
|
|
215
|
+
|
|
216
|
+
### Prompt Types
|
|
217
|
+
- `Prompt` → Prompt object with compilation capabilities
|
|
218
|
+
- `CompiledPrompt` → Compiled prompt with variables interpolated
|
|
219
|
+
- `TemplateVariables` → Variables for prompt compilation
|
|
220
|
+
|
|
221
|
+
### RAG & Metrics Types
|
|
222
|
+
- `LangWatchSpanRAGContext` → RAG context structure
|
|
223
|
+
- `LangWatchSpanMetrics` → Metrics structure (tokens, cost)
|
|
224
|
+
- `LangWatchSpanGenAI*EventBody` → GenAI message event structures
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Advanced
|
|
229
|
+
|
|
230
|
+
### Custom OpenTelemetry Integration
|
|
231
|
+
```ts
|
|
232
|
+
import { FilterableBatchSpanProcessor, LangWatchExporter } from "langwatch";
|
|
233
|
+
|
|
234
|
+
const processor = new FilterableBatchSpanProcessor(
|
|
235
|
+
new LangWatchExporter(apiKey, endpoint),
|
|
236
|
+
excludeRules
|
|
237
|
+
);
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Span Processing Rules
|
|
241
|
+
```ts
|
|
242
|
+
const excludeRules: SpanProcessingExcludeRule[] = [
|
|
243
|
+
{ attribute: "http.url", value: "/health" },
|
|
244
|
+
{ attribute: "span.type", value: "health" }
|
|
245
|
+
];
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Manual Instrumentation
|
|
249
|
+
```ts
|
|
250
|
+
import { semconv } from "langwatch/observability";
|
|
251
|
+
|
|
252
|
+
span.setAttributes({
|
|
253
|
+
[semconv.ATTR_LANGWATCH_THREAD_ID]: threadId,
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Community & Support
|
|
260
|
+
|
|
261
|
+
- [LangWatch Website](https://langwatch.ai)
|
|
262
|
+
- [Documentation](https://docs.langwatch.ai)
|
|
263
|
+
- [GitHub Issues](https://github.com/langwatch/langwatch/issues)
|
|
264
|
+
- [Discord Community](https://discord.gg/langwatch)
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## License
|
|
269
|
+
|
|
270
|
+
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/observability/semconv/attributes.ts
|
|
26
|
+
var ATTR_LANGWATCH_INPUT = "langwatch.input";
|
|
27
|
+
var ATTR_LANGWATCH_OUTPUT = "langwatch.output";
|
|
28
|
+
var ATTR_LANGWATCH_SPAN_TYPE = "langwatch.span.type";
|
|
29
|
+
var ATTR_LANGWATCH_RAG_CONTEXTS = "langwatch.contexts";
|
|
30
|
+
var ATTR_LANGWATCH_METRICS = "langwatch.metrics";
|
|
31
|
+
var ATTR_LANGWATCH_SDK_VERSION = "langwatch.sdk.version";
|
|
32
|
+
var ATTR_LANGWATCH_SDK_NAME = "langwatch.sdk.name";
|
|
33
|
+
var ATTR_LANGWATCH_SDK_LANGUAGE = "langwatch.sdk.language";
|
|
34
|
+
var ATTR_LANGWATCH_TIMESTAMPS = "langwatch.timestamps";
|
|
35
|
+
var ATTR_LANGWATCH_EVALUATION_CUSTOM = "langwatch.evaluation.custom";
|
|
36
|
+
var ATTR_LANGWATCH_PARAMS = "langwatch.params";
|
|
37
|
+
var ATTR_LANGWATCH_CUSTOMER_ID = "langwatch.customer.id";
|
|
38
|
+
var ATTR_LANGWATCH_THREAD_ID = "langwatch.thread.id";
|
|
39
|
+
var ATTR_LANGWATCH_STREAMING = "langwatch.gen_ai.streaming";
|
|
40
|
+
var ATTR_LANGWATCH_PROMPT_ID = "langwatch.prompt.id";
|
|
41
|
+
var ATTR_LANGWATCH_PROMPT_VERSION_ID = "langwatch.prompt.version.id";
|
|
42
|
+
var ATTR_LANGWATCH_PROMPT_VARIABLES = "langwatch.prompt.variables";
|
|
43
|
+
var ATTR_LANGWATCH_PROMPT_SELECTED_ID = "langwatch.prompt.selected.id";
|
|
44
|
+
var ATTR_LANGWATCH_PROMPT_VERSION_NUMBER = "langwatch.prompt.version.number";
|
|
45
|
+
var ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER = "langwatch.gen_ai.log_event.imposter";
|
|
46
|
+
var ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY = "langwatch.gen_ai.log_event.body";
|
|
47
|
+
var ATTR_LANGWATCH_LANGCHAIN_TAGS = "langwatch.langchain.tags";
|
|
48
|
+
var ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME = "langwatch.langchain.event_name";
|
|
49
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_ID = "langwatch.langchain.run.id";
|
|
50
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS = "langwatch.langchain.run.tags";
|
|
51
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE = "langwatch.langchain.run.type";
|
|
52
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA = "langwatch.langchain.run.metadata";
|
|
53
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS = "langwatch.langchain.run.extra_params";
|
|
54
|
+
var ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID = "langwatch.langchain.run.parent.id";
|
|
55
|
+
|
|
56
|
+
// src/observability/semconv/events.ts
|
|
57
|
+
var LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = "gen.ai.system_message";
|
|
58
|
+
var LOG_EVNT_GEN_AI_USER_MESSAGE = "gen.ai.user_message";
|
|
59
|
+
var LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = "gen.ai.assistant_message";
|
|
60
|
+
var LOG_EVNT_GEN_AI_TOOL_MESSAGE = "gen.ai.tool_message";
|
|
61
|
+
var LOG_EVNT_GEN_AI_CHOICE = "gen.ai.choice";
|
|
62
|
+
var EVNT_LANGWATCH_LANGCHAIN_CALLBACK = "langwatch.langchain.callback";
|
|
63
|
+
|
|
64
|
+
// src/observability/semconv/index.ts
|
|
65
|
+
var semconv_exports = {};
|
|
66
|
+
__export(semconv_exports, {
|
|
67
|
+
ATTR_LANGWATCH_CUSTOMER_ID: () => ATTR_LANGWATCH_CUSTOMER_ID,
|
|
68
|
+
ATTR_LANGWATCH_EVALUATION_CUSTOM: () => ATTR_LANGWATCH_EVALUATION_CUSTOM,
|
|
69
|
+
ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY: () => ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY,
|
|
70
|
+
ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER: () => ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER,
|
|
71
|
+
ATTR_LANGWATCH_INPUT: () => ATTR_LANGWATCH_INPUT,
|
|
72
|
+
ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME: () => ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME,
|
|
73
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS: () => ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS,
|
|
74
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_ID: () => ATTR_LANGWATCH_LANGCHAIN_RUN_ID,
|
|
75
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA: () => ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA,
|
|
76
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID: () => ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID,
|
|
77
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS: () => ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS,
|
|
78
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE: () => ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE,
|
|
79
|
+
ATTR_LANGWATCH_LANGCHAIN_TAGS: () => ATTR_LANGWATCH_LANGCHAIN_TAGS,
|
|
80
|
+
ATTR_LANGWATCH_METRICS: () => ATTR_LANGWATCH_METRICS,
|
|
81
|
+
ATTR_LANGWATCH_OUTPUT: () => ATTR_LANGWATCH_OUTPUT,
|
|
82
|
+
ATTR_LANGWATCH_PARAMS: () => ATTR_LANGWATCH_PARAMS,
|
|
83
|
+
ATTR_LANGWATCH_PROMPT_ID: () => ATTR_LANGWATCH_PROMPT_ID,
|
|
84
|
+
ATTR_LANGWATCH_PROMPT_SELECTED_ID: () => ATTR_LANGWATCH_PROMPT_SELECTED_ID,
|
|
85
|
+
ATTR_LANGWATCH_PROMPT_VARIABLES: () => ATTR_LANGWATCH_PROMPT_VARIABLES,
|
|
86
|
+
ATTR_LANGWATCH_PROMPT_VERSION_ID: () => ATTR_LANGWATCH_PROMPT_VERSION_ID,
|
|
87
|
+
ATTR_LANGWATCH_PROMPT_VERSION_NUMBER: () => ATTR_LANGWATCH_PROMPT_VERSION_NUMBER,
|
|
88
|
+
ATTR_LANGWATCH_RAG_CONTEXTS: () => ATTR_LANGWATCH_RAG_CONTEXTS,
|
|
89
|
+
ATTR_LANGWATCH_SDK_LANGUAGE: () => ATTR_LANGWATCH_SDK_LANGUAGE,
|
|
90
|
+
ATTR_LANGWATCH_SDK_NAME: () => ATTR_LANGWATCH_SDK_NAME,
|
|
91
|
+
ATTR_LANGWATCH_SDK_VERSION: () => ATTR_LANGWATCH_SDK_VERSION,
|
|
92
|
+
ATTR_LANGWATCH_SPAN_TYPE: () => ATTR_LANGWATCH_SPAN_TYPE,
|
|
93
|
+
ATTR_LANGWATCH_STREAMING: () => ATTR_LANGWATCH_STREAMING,
|
|
94
|
+
ATTR_LANGWATCH_THREAD_ID: () => ATTR_LANGWATCH_THREAD_ID,
|
|
95
|
+
ATTR_LANGWATCH_TIMESTAMPS: () => ATTR_LANGWATCH_TIMESTAMPS,
|
|
96
|
+
EVNT_LANGWATCH_LANGCHAIN_CALLBACK: () => EVNT_LANGWATCH_LANGCHAIN_CALLBACK,
|
|
97
|
+
LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE: () => LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
|
|
98
|
+
LOG_EVNT_GEN_AI_CHOICE: () => LOG_EVNT_GEN_AI_CHOICE,
|
|
99
|
+
LOG_EVNT_GEN_AI_SYSTEM_MESSAGE: () => LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
|
|
100
|
+
LOG_EVNT_GEN_AI_TOOL_MESSAGE: () => LOG_EVNT_GEN_AI_TOOL_MESSAGE,
|
|
101
|
+
LOG_EVNT_GEN_AI_USER_MESSAGE: () => LOG_EVNT_GEN_AI_USER_MESSAGE,
|
|
102
|
+
VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER: () => VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER,
|
|
103
|
+
VAL_GEN_AI_FINISH_REASON_ERROR: () => VAL_GEN_AI_FINISH_REASON_ERROR,
|
|
104
|
+
VAL_GEN_AI_FINISH_REASON_LENGTH: () => VAL_GEN_AI_FINISH_REASON_LENGTH,
|
|
105
|
+
VAL_GEN_AI_FINISH_REASON_STOP: () => VAL_GEN_AI_FINISH_REASON_STOP,
|
|
106
|
+
VAL_GEN_AI_FINISH_REASON_TOOL_CALLS: () => VAL_GEN_AI_FINISH_REASON_TOOL_CALLS,
|
|
107
|
+
VAL_GEN_AI_SYSTEM_ANTHROPIC: () => VAL_GEN_AI_SYSTEM_ANTHROPIC,
|
|
108
|
+
VAL_GEN_AI_SYSTEM_AWS_BEDROCK: () => VAL_GEN_AI_SYSTEM_AWS_BEDROCK,
|
|
109
|
+
VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE: () => VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE,
|
|
110
|
+
VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI: () => VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI,
|
|
111
|
+
VAL_GEN_AI_SYSTEM_COHERE: () => VAL_GEN_AI_SYSTEM_COHERE,
|
|
112
|
+
VAL_GEN_AI_SYSTEM_DEEPSEEK: () => VAL_GEN_AI_SYSTEM_DEEPSEEK,
|
|
113
|
+
VAL_GEN_AI_SYSTEM_GCP_GEMINI: () => VAL_GEN_AI_SYSTEM_GCP_GEMINI,
|
|
114
|
+
VAL_GEN_AI_SYSTEM_GCP_GEN_AI: () => VAL_GEN_AI_SYSTEM_GCP_GEN_AI,
|
|
115
|
+
VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI: () => VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI,
|
|
116
|
+
VAL_GEN_AI_SYSTEM_GROQ: () => VAL_GEN_AI_SYSTEM_GROQ,
|
|
117
|
+
VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI: () => VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI,
|
|
118
|
+
VAL_GEN_AI_SYSTEM_MISTRAL_AI: () => VAL_GEN_AI_SYSTEM_MISTRAL_AI,
|
|
119
|
+
VAL_GEN_AI_SYSTEM_OPENAI: () => VAL_GEN_AI_SYSTEM_OPENAI,
|
|
120
|
+
VAL_GEN_AI_SYSTEM_PERPLEXITY: () => VAL_GEN_AI_SYSTEM_PERPLEXITY,
|
|
121
|
+
VAL_GEN_AI_SYSTEM_XAI: () => VAL_GEN_AI_SYSTEM_XAI
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// src/observability/semconv/values.ts
|
|
125
|
+
var VAL_GEN_AI_SYSTEM_ANTHROPIC = "anthropic";
|
|
126
|
+
var VAL_GEN_AI_SYSTEM_AWS_BEDROCK = "aws.bedrock";
|
|
127
|
+
var VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE = "azure.ai.inference";
|
|
128
|
+
var VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI = "azure.ai.openai";
|
|
129
|
+
var VAL_GEN_AI_SYSTEM_COHERE = "cohere";
|
|
130
|
+
var VAL_GEN_AI_SYSTEM_DEEPSEEK = "deepseek";
|
|
131
|
+
var VAL_GEN_AI_SYSTEM_GCP_GEMINI = "gcp.gemini";
|
|
132
|
+
var VAL_GEN_AI_SYSTEM_GCP_GEN_AI = "gcp.gen_ai";
|
|
133
|
+
var VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI = "gcp.vertex_ai";
|
|
134
|
+
var VAL_GEN_AI_SYSTEM_GROQ = "groq";
|
|
135
|
+
var VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI = "ibm.watsonx.ai";
|
|
136
|
+
var VAL_GEN_AI_SYSTEM_MISTRAL_AI = "mistral_ai";
|
|
137
|
+
var VAL_GEN_AI_SYSTEM_OPENAI = "openai";
|
|
138
|
+
var VAL_GEN_AI_SYSTEM_PERPLEXITY = "perplexity";
|
|
139
|
+
var VAL_GEN_AI_SYSTEM_XAI = "xai";
|
|
140
|
+
var VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER = "content_filter";
|
|
141
|
+
var VAL_GEN_AI_FINISH_REASON_ERROR = "error";
|
|
142
|
+
var VAL_GEN_AI_FINISH_REASON_LENGTH = "length";
|
|
143
|
+
var VAL_GEN_AI_FINISH_REASON_STOP = "stop";
|
|
144
|
+
var VAL_GEN_AI_FINISH_REASON_TOOL_CALLS = "tool_calls";
|
|
145
|
+
|
|
146
|
+
export {
|
|
147
|
+
__spreadValues,
|
|
148
|
+
__spreadProps,
|
|
149
|
+
ATTR_LANGWATCH_INPUT,
|
|
150
|
+
ATTR_LANGWATCH_OUTPUT,
|
|
151
|
+
ATTR_LANGWATCH_SPAN_TYPE,
|
|
152
|
+
ATTR_LANGWATCH_RAG_CONTEXTS,
|
|
153
|
+
ATTR_LANGWATCH_METRICS,
|
|
154
|
+
ATTR_LANGWATCH_SDK_VERSION,
|
|
155
|
+
ATTR_LANGWATCH_SDK_NAME,
|
|
156
|
+
ATTR_LANGWATCH_SDK_LANGUAGE,
|
|
157
|
+
ATTR_LANGWATCH_EVALUATION_CUSTOM,
|
|
158
|
+
ATTR_LANGWATCH_PROMPT_ID,
|
|
159
|
+
ATTR_LANGWATCH_PROMPT_VERSION_ID,
|
|
160
|
+
ATTR_LANGWATCH_PROMPT_VARIABLES,
|
|
161
|
+
ATTR_LANGWATCH_PROMPT_SELECTED_ID,
|
|
162
|
+
ATTR_LANGWATCH_PROMPT_VERSION_NUMBER,
|
|
163
|
+
ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER,
|
|
164
|
+
ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY,
|
|
165
|
+
ATTR_LANGWATCH_LANGCHAIN_TAGS,
|
|
166
|
+
ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME,
|
|
167
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_ID,
|
|
168
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS,
|
|
169
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE,
|
|
170
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA,
|
|
171
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS,
|
|
172
|
+
ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID,
|
|
173
|
+
LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
|
|
174
|
+
LOG_EVNT_GEN_AI_USER_MESSAGE,
|
|
175
|
+
LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
|
|
176
|
+
LOG_EVNT_GEN_AI_TOOL_MESSAGE,
|
|
177
|
+
LOG_EVNT_GEN_AI_CHOICE,
|
|
178
|
+
EVNT_LANGWATCH_LANGCHAIN_CALLBACK,
|
|
179
|
+
semconv_exports
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=chunk-4BZATFKJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/observability/semconv/attributes.ts","../src/observability/semconv/events.ts","../src/observability/semconv/index.ts","../src/observability/semconv/values.ts"],"sourcesContent":["/*\n This file contains the semantic conventions for attributes either owned by LangWatch, or\n which are no yet part of the OpenTelemetry semantic conventions for Gen AI.\n\n Any that are not yet part of the OpenTelemetry semantic conventions for Gen AI are\n marked with an UNSTABLE_ prefix.\n*/\n\n/**\n * LangWatch input data attribute key\n * Used to store the input data for a span or event\n */\nexport const ATTR_LANGWATCH_INPUT = \"langwatch.input\";\n\n/**\n * LangWatch output data attribute key\n * Used to store the output data for a span or event\n */\nexport const ATTR_LANGWATCH_OUTPUT = \"langwatch.output\";\n\n/**\n * LangWatch span type attribute key\n * Used to identify the type of span being traced\n */\nexport const ATTR_LANGWATCH_SPAN_TYPE = \"langwatch.span.type\";\n\n/**\n * LangWatch RAG contexts attribute key\n * Used to store retrieval-augmented generation contexts\n */\nexport const ATTR_LANGWATCH_RAG_CONTEXTS = \"langwatch.contexts\";\n\n/**\n * LangWatch metrics attribute key\n * Used to store custom metrics data\n */\nexport const ATTR_LANGWATCH_METRICS = \"langwatch.metrics\";\n\n/**\n * LangWatch SDK version attribute key\n * Used to track the version of the LangWatch SDK being used\n */\nexport const ATTR_LANGWATCH_SDK_VERSION = \"langwatch.sdk.version\";\n\n/**\n * LangWatch SDK name attribute key\n * Used to identify the LangWatch SDK implementation\n */\nexport const ATTR_LANGWATCH_SDK_NAME = \"langwatch.sdk.name\";\n\n/**\n * LangWatch SDK language attribute key\n * Used to identify the programming language of the SDK\n */\nexport const ATTR_LANGWATCH_SDK_LANGUAGE = \"langwatch.sdk.language\";\n\n/**\n * LangWatch timestamps attribute key\n * Used to store timing information for events\n */\nexport const ATTR_LANGWATCH_TIMESTAMPS = \"langwatch.timestamps\";\n\n/**\n * LangWatch custom evaluation attribute key\n * Used to store custom evaluation data\n */\nexport const ATTR_LANGWATCH_EVALUATION_CUSTOM = \"langwatch.evaluation.custom\";\n\n/**\n * LangWatch parameters attribute key\n * Used to store parameter data for operations\n */\nexport const ATTR_LANGWATCH_PARAMS = \"langwatch.params\";\n\n/**\n * LangWatch customer ID attribute key\n * Used to identify the customer associated with the trace\n */\nexport const ATTR_LANGWATCH_CUSTOMER_ID = \"langwatch.customer.id\";\n\n/**\n * LangWatch thread ID attribute key\n * Used to group related operations within a conversation thread\n */\nexport const ATTR_LANGWATCH_THREAD_ID = \"langwatch.thread.id\";\n\n/**\n * LangWatch streaming attribute key\n * Used to indicate if the operation involves streaming\n */\nexport const ATTR_LANGWATCH_STREAMING = \"langwatch.gen_ai.streaming\";\n\n/**\n * LangWatch prompt ID attribute key\n * Used to identify the specific prompt being used\n */\nexport const ATTR_LANGWATCH_PROMPT_ID = \"langwatch.prompt.id\";\n\n/**\n * LangWatch prompt version ID attribute key\n * Used to identify the specific version of a prompt\n */\nexport const ATTR_LANGWATCH_PROMPT_VERSION_ID = \"langwatch.prompt.version.id\";\n\n/**\n * LangWatch prompt variables attribute key\n * Used to store variables used in prompt templates\n */\nexport const ATTR_LANGWATCH_PROMPT_VARIABLES = \"langwatch.prompt.variables\";\n\n/**\n * LangWatch prompt selected ID attribute key\n * Used to identify which prompt was selected from a set\n */\nexport const ATTR_LANGWATCH_PROMPT_SELECTED_ID = \"langwatch.prompt.selected.id\";\n\n/**\n * LangWatch prompt version number attribute key\n * Used to track the version number of a prompt\n */\nexport const ATTR_LANGWATCH_PROMPT_VERSION_NUMBER =\n \"langwatch.prompt.version.number\";\n\n/**\n * LangWatch gen AI log event imposter attribute key\n * Used to identify imposter events in log records\n */\nexport const ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER =\n \"langwatch.gen_ai.log_event.imposter\";\n\n/**\n * LangWatch gen AI log event body attribute key\n * Used to store the body content of log events\n */\nexport const ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY =\n \"langwatch.gen_ai.log_event.body\";\n\n/**\n * LangWatch LangChain tags attribute key\n * Used to store tags associated with LangChain operations\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_TAGS = \"langwatch.langchain.tags\";\n\n/**\n * LangWatch LangChain event name attribute key\n * Used to identify the specific LangChain event type\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME = \"langwatch.langchain.event_name\";\n\n/**\n * LangWatch LangChain run ID attribute key\n * Used to identify a specific LangChain run\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_ID = \"langwatch.langchain.run.id\";\n\n/**\n * LangWatch LangChain run tags attribute key\n * Used to store tags associated with a LangChain run\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS = \"langwatch.langchain.run.tags\";\n\n/**\n * LangWatch LangChain run type attribute key\n * Used to identify the type of LangChain run\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE = \"langwatch.langchain.run.type\";\n\n/**\n * LangWatch LangChain run metadata attribute key\n * Used to store metadata associated with a LangChain run\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA = \"langwatch.langchain.run.metadata\";\n\n/**\n * LangWatch LangChain run extra parameters attribute key\n * Used to store additional parameters for a LangChain run\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS = \"langwatch.langchain.run.extra_params\";\n\n/**\n * LangWatch LangChain run parent ID attribute key\n * Used to identify the parent run in a hierarchical structure\n */\nexport const ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID =\n \"langwatch.langchain.run.parent.id\";\n","/*\n This file contains the values for the OpenTelemetry semantic conventions for GenAI log\n record event names.\n\n 👉 https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/\n*/\n\n/**\n * GenAI system message event name\n * Used for log records representing system messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = \"gen.ai.system_message\";\n\n/**\n * GenAI user message event name\n * Used for log records representing user messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_USER_MESSAGE = \"gen.ai.user_message\";\n\n/**\n * GenAI assistant message event name\n * Used for log records representing assistant responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = \"gen.ai.assistant_message\";\n\n/**\n * GenAI tool message event name\n * Used for log records representing tool calls or responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_TOOL_MESSAGE = \"gen.ai.tool_message\";\n\n/**\n * GenAI choice event name\n * Used for log records representing choices made by AI models\n */\nexport const LOG_EVNT_GEN_AI_CHOICE = \"gen.ai.choice\";\n\n/**\n * LangWatch LangChain callback event name\n * Used for log records representing LangChain callback events\n */\nexport const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = \"langwatch.langchain.callback\";\n","/**\n * Semantic conventions module for LangWatch observability\n *\n * This module exports all semantic convention constants used for:\n * - Attributes: Key-value pairs for span and event metadata\n * - Values: Predefined values for semantic convention attributes\n * - Events: Event names for log records and traces\n *\n * @see {@link ./attributes} for attribute constants\n * @see {@link ./values} for value constants\n * @see {@link ./events} for event constants\n */\n\nexport * from \"./attributes\";\nexport * from \"./values\";\nexport * from \"./events\";\n","/*\n This file contains the values for the OpenTelemetry semantic conventions for Gen AI,\n some of which are still in development and therefor currently considered to be\n experimental.\n\n 👉 https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/\n*/\n\n/**\n * Anthropic AI system identifier\n * Used to identify Anthropic's Claude models\n */\nexport const VAL_GEN_AI_SYSTEM_ANTHROPIC = \"anthropic\";\n\n/**\n * AWS Bedrock system identifier\n * Used to identify AWS Bedrock AI services\n */\nexport const VAL_GEN_AI_SYSTEM_AWS_BEDROCK = \"aws.bedrock\";\n\n/**\n * Azure AI Inference system identifier\n * Used to identify Azure AI Inference services\n */\nexport const VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE = \"azure.ai.inference\";\n\n/**\n * Azure AI OpenAI system identifier\n * Used to identify Azure OpenAI services\n */\nexport const VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI = \"azure.ai.openai\";\n\n/**\n * Cohere system identifier\n * Used to identify Cohere AI models\n */\nexport const VAL_GEN_AI_SYSTEM_COHERE = \"cohere\";\n\n/**\n * DeepSeek system identifier\n * Used to identify DeepSeek AI models\n */\nexport const VAL_GEN_AI_SYSTEM_DEEPSEEK = \"deepseek\";\n\n/**\n * GCP Gemini system identifier\n * Used to identify Google Cloud Gemini models\n */\nexport const VAL_GEN_AI_SYSTEM_GCP_GEMINI = \"gcp.gemini\";\n\n/**\n * GCP Gen AI system identifier\n * Used to identify Google Cloud Generative AI services\n */\nexport const VAL_GEN_AI_SYSTEM_GCP_GEN_AI = \"gcp.gen_ai\";\n\n/**\n * GCP Vertex AI system identifier\n * Used to identify Google Cloud Vertex AI services\n */\nexport const VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI = \"gcp.vertex_ai\";\n\n/**\n * Groq system identifier\n * Used to identify Groq AI models\n */\nexport const VAL_GEN_AI_SYSTEM_GROQ = \"groq\";\n\n/**\n * IBM WatsonX AI system identifier\n * Used to identify IBM WatsonX AI services\n */\nexport const VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI = \"ibm.watsonx.ai\";\n\n/**\n * Mistral AI system identifier\n * Used to identify Mistral AI models\n */\nexport const VAL_GEN_AI_SYSTEM_MISTRAL_AI = \"mistral_ai\";\n\n/**\n * OpenAI system identifier\n * Used to identify OpenAI models and services\n */\nexport const VAL_GEN_AI_SYSTEM_OPENAI = \"openai\";\n\n/**\n * Perplexity system identifier\n * Used to identify Perplexity AI models\n */\nexport const VAL_GEN_AI_SYSTEM_PERPLEXITY = \"perplexity\";\n\n/**\n * XAI system identifier\n * Used to identify XAI models and services\n */\nexport const VAL_GEN_AI_SYSTEM_XAI = \"xai\";\n\n/**\n * Content filter finish reason\n * Used when generation stops due to content filtering\n */\nexport const VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER = \"content_filter\";\n\n/**\n * Error finish reason\n * Used when generation stops due to an error\n */\nexport const VAL_GEN_AI_FINISH_REASON_ERROR = \"error\";\n\n/**\n * Length finish reason\n * Used when generation stops due to length limits\n */\nexport const VAL_GEN_AI_FINISH_REASON_LENGTH = \"length\";\n\n/**\n * Stop finish reason\n * Used when generation stops due to stop tokens\n */\nexport const VAL_GEN_AI_FINISH_REASON_STOP = \"stop\";\n\n/**\n * Tool calls finish reason\n * Used when generation stops due to tool calls\n */\nexport const VAL_GEN_AI_FINISH_REASON_TOOL_CALLS = \"tool_calls\";\n\n/**\n * Union type of all supported GenAI system identifiers\n * Used for type safety when working with system identification\n */\nexport type VAL_GEN_AI_SYSTEMS =\n | typeof VAL_GEN_AI_SYSTEM_ANTHROPIC\n | typeof VAL_GEN_AI_SYSTEM_AWS_BEDROCK\n | typeof VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE\n | typeof VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI\n | typeof VAL_GEN_AI_SYSTEM_COHERE\n | typeof VAL_GEN_AI_SYSTEM_DEEPSEEK\n | typeof VAL_GEN_AI_SYSTEM_GCP_GEMINI\n | typeof VAL_GEN_AI_SYSTEM_GCP_GEN_AI\n | typeof VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI\n | typeof VAL_GEN_AI_SYSTEM_GROQ\n | typeof VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI\n | typeof VAL_GEN_AI_SYSTEM_MISTRAL_AI\n | typeof VAL_GEN_AI_SYSTEM_OPENAI\n | typeof VAL_GEN_AI_SYSTEM_PERPLEXITY\n | typeof VAL_GEN_AI_SYSTEM_XAI;\n\n/**\n * Union type of all supported GenAI finish reasons\n * Used for type safety when working with generation completion reasons\n */\nexport type VAL_GEN_AI_FINISH_REASONS =\n | typeof VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER\n | typeof VAL_GEN_AI_FINISH_REASON_ERROR\n | typeof VAL_GEN_AI_FINISH_REASON_LENGTH\n | typeof VAL_GEN_AI_FINISH_REASON_STOP\n | typeof VAL_GEN_AI_FINISH_REASON_TOOL_CALLS;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAYO,IAAM,uBAAuB;AAM7B,IAAM,wBAAwB;AAM9B,IAAM,2BAA2B;AAMjC,IAAM,8BAA8B;AAMpC,IAAM,yBAAyB;AAM/B,IAAM,6BAA6B;AAMnC,IAAM,0BAA0B;AAMhC,IAAM,8BAA8B;AAMpC,IAAM,4BAA4B;AAMlC,IAAM,mCAAmC;AAMzC,IAAM,wBAAwB;AAM9B,IAAM,6BAA6B;AAMnC,IAAM,2BAA2B;AAMjC,IAAM,2BAA2B;AAMjC,IAAM,2BAA2B;AAMjC,IAAM,mCAAmC;AAMzC,IAAM,kCAAkC;AAMxC,IAAM,oCAAoC;AAM1C,IAAM,uCACX;AAMK,IAAM,2CACX;AAMK,IAAM,uCACX;AAMK,IAAM,gCAAgC;AAMtC,IAAM,sCAAsC;AAM5C,IAAM,kCAAkC;AAMxC,IAAM,oCAAoC;AAM1C,IAAM,oCAAoC;AAM1C,IAAM,wCAAwC;AAM9C,IAAM,4CAA4C;AAMlD,IAAM,yCACX;;;AC7KK,IAAM,iCAAiC;AAMvC,IAAM,+BAA+B;AAMrC,IAAM,oCAAoC;AAM1C,IAAM,+BAA+B;AAMrC,IAAM,yBAAyB;AAM/B,IAAM,oCAAoC;;;ACzCjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACYO,IAAM,8BAA8B;AAMpC,IAAM,gCAAgC;AAMtC,IAAM,uCAAuC;AAM7C,IAAM,oCAAoC;AAM1C,IAAM,2BAA2B;AAMjC,IAAM,6BAA6B;AAMnC,IAAM,+BAA+B;AAMrC,IAAM,+BAA+B;AAMrC,IAAM,kCAAkC;AAMxC,IAAM,yBAAyB;AAM/B,IAAM,mCAAmC;AAMzC,IAAM,+BAA+B;AAMrC,IAAM,2BAA2B;AAMjC,IAAM,+BAA+B;AAMrC,IAAM,wBAAwB;AAM9B,IAAM,0CAA0C;AAMhD,IAAM,iCAAiC;AAMvC,IAAM,kCAAkC;AAMxC,IAAM,gCAAgC;AAMtC,IAAM,sCAAsC;","names":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
canAutomaticallyCaptureInput,
|
|
3
|
+
getApiKey,
|
|
4
|
+
getEndpoint
|
|
5
|
+
} from "./chunk-QEWDG5QE.mjs";
|
|
6
|
+
import {
|
|
7
|
+
tracer
|
|
8
|
+
} from "./chunk-PMBEK6YE.mjs";
|
|
9
|
+
|
|
10
|
+
// src/internal/api/errors.ts
|
|
11
|
+
var LangWatchApiError = class extends Error {
|
|
12
|
+
constructor(message, response) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.httpStatus = response.status;
|
|
15
|
+
this.httpStatusText = response.statusText;
|
|
16
|
+
}
|
|
17
|
+
async safeParseBody(response) {
|
|
18
|
+
var _a;
|
|
19
|
+
try {
|
|
20
|
+
if ((_a = response.headers.get("Content-Type")) == null ? void 0 : _a.includes("application/json")) {
|
|
21
|
+
const json = await response.json();
|
|
22
|
+
this.body = json;
|
|
23
|
+
if (json.error && typeof json.error === "string") {
|
|
24
|
+
this.apiError = json.error;
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.body = await response.text();
|
|
29
|
+
} catch (e) {
|
|
30
|
+
this.body = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// src/evaluation/run-evaluation.ts
|
|
36
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
37
|
+
async function runEvaluation(details) {
|
|
38
|
+
return await tracer.startActiveSpan("run evaluation", async (span) => {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
span.setType(details.asGuardrail ? "guardrail" : "evaluation");
|
|
41
|
+
try {
|
|
42
|
+
const evaluatorId = "slug" in details ? details.slug : details.evaluator;
|
|
43
|
+
const request = {
|
|
44
|
+
trace_id: span.spanContext().traceId,
|
|
45
|
+
span_id: span.spanContext().spanId,
|
|
46
|
+
data: details.data,
|
|
47
|
+
name: details.name,
|
|
48
|
+
settings: details.settings,
|
|
49
|
+
as_guardrail: details.asGuardrail
|
|
50
|
+
};
|
|
51
|
+
if (canAutomaticallyCaptureInput()) {
|
|
52
|
+
span.setInput(request);
|
|
53
|
+
}
|
|
54
|
+
const url = new URL(
|
|
55
|
+
`/api/evaluations/${evaluatorId}/evaluate`,
|
|
56
|
+
getEndpoint()
|
|
57
|
+
);
|
|
58
|
+
const response = await fetch(url.toString(), {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers: {
|
|
61
|
+
"X-Auth-Token": getApiKey(),
|
|
62
|
+
"Content-Type": "application/json"
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify(request)
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const err = new LangWatchApiError("Unable to run evaluation", response);
|
|
68
|
+
await err.safeParseBody(response);
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
const result = await response.json();
|
|
72
|
+
span.setMetrics({
|
|
73
|
+
cost: (_a = result.cost) == null ? void 0 : _a.amount
|
|
74
|
+
});
|
|
75
|
+
span.setOutputEvaluation((_b = details.asGuardrail) != null ? _b : false, result);
|
|
76
|
+
if (result.status === "processed") {
|
|
77
|
+
return {
|
|
78
|
+
status: "processed",
|
|
79
|
+
passed: result.passed,
|
|
80
|
+
score: result.score,
|
|
81
|
+
details: result.details,
|
|
82
|
+
label: result.label,
|
|
83
|
+
cost: result.cost
|
|
84
|
+
};
|
|
85
|
+
} else if (result.status === "skipped") {
|
|
86
|
+
return {
|
|
87
|
+
status: "skipped",
|
|
88
|
+
details: result.details
|
|
89
|
+
};
|
|
90
|
+
} else if (result.status === "error") {
|
|
91
|
+
return {
|
|
92
|
+
status: "error",
|
|
93
|
+
error_type: result.error_type || "Unknown",
|
|
94
|
+
details: result.details || "Unknown error",
|
|
95
|
+
traceback: result.traceback || []
|
|
96
|
+
};
|
|
97
|
+
} else {
|
|
98
|
+
return {
|
|
99
|
+
status: "error",
|
|
100
|
+
error_type: "UnknownStatus",
|
|
101
|
+
details: `Unknown evaluation status: ${result.status}`,
|
|
102
|
+
traceback: []
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
span.recordException(error);
|
|
107
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error == null ? void 0 : error.message });
|
|
108
|
+
throw error;
|
|
109
|
+
} finally {
|
|
110
|
+
span.end();
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export {
|
|
116
|
+
runEvaluation
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=chunk-CSC3CMIT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/api/errors.ts","../src/evaluation/run-evaluation.ts"],"sourcesContent":["export class LangWatchApiError extends Error {\n public readonly httpStatus: number;\n public readonly httpStatusText: string;\n public apiError: string | undefined;\n public body: unknown;\n\n constructor(message: string, response: Response) {\n super(message);\n this.httpStatus = response.status;\n this.httpStatusText = response.statusText;\n }\n\n async safeParseBody(response: Response): Promise<void> {\n try {\n if (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n const json = await response.json();\n\n this.body = json;\n\n if (json.error && typeof json.error === \"string\") {\n this.apiError = json.error;\n }\n\n return;\n }\n\n this.body = await response.text();\n } catch {\n this.body = null;\n }\n }\n}\n","import { LangWatchApiError } from \"../internal/api/errors\";\nimport { canAutomaticallyCaptureInput, getApiKey, getEndpoint } from \"../client\";\nimport { Conversation } from \"../internal/generated/types/evaluations\";\nimport {\n Evaluators,\n EvaluatorTypes,\n SingleEvaluationResult,\n} from \"../internal/generated/types/evaluators.generated\";\nimport { RAGChunk } from \"../internal/generated/types/tracer\";\nimport { tracer } from \"./tracer\";\nimport { EvaluationResultModel } from \"./types\";\nimport { SpanStatusCode } from \"@opentelemetry/api\";\n\nexport interface BasicEvaluationData {\n input?: string;\n output?: string;\n expected_output?: unknown;\n contexts?: RAGChunk[] | string[];\n expected_contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n}\n\nexport interface EvaluationDetailsBase {\n name?: string;\n data: BasicEvaluationData | Record<string, unknown>;\n contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n asGuardrail?: boolean;\n}\n\nexport interface SavedEvaluationDetails extends EvaluationDetailsBase {\n slug: string;\n settings?: Record<string, unknown>;\n}\n\nexport interface LangEvalsEvaluationDetails<T extends EvaluatorTypes>\n extends EvaluationDetailsBase {\n evaluator: T;\n settings?: Evaluators[T][\"settings\"];\n}\n\nexport type EvaluationDetails =\n | SavedEvaluationDetails\n | LangEvalsEvaluationDetails<EvaluatorTypes>;\n\nexport async function runEvaluation(\n details: EvaluationDetails,\n): Promise<SingleEvaluationResult> {\n return await tracer.startActiveSpan(\"run evaluation\", async (span) => {\n span.setType(details.asGuardrail ? \"guardrail\" : \"evaluation\");\n\n try {\n const evaluatorId =\n \"slug\" in details ? details.slug : details.evaluator;\n const request = {\n trace_id: span.spanContext().traceId,\n span_id: span.spanContext().spanId,\n data: details.data,\n name: details.name,\n settings: details.settings,\n as_guardrail: details.asGuardrail,\n };\n\n if (canAutomaticallyCaptureInput()) {\n span.setInput(request);\n }\n\n const url = new URL(\n `/api/evaluations/${evaluatorId}/evaluate`,\n getEndpoint(),\n );\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"X-Auth-Token\": getApiKey(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n if (!response.ok) {\n const err = new LangWatchApiError(\"Unable to run evaluation\", response);\n await err.safeParseBody(response);\n\n throw err;\n }\n\n const result: EvaluationResultModel = await response.json();\n\n span.setMetrics({\n cost: result.cost?.amount,\n });\n\n span.setOutputEvaluation(details.asGuardrail ?? false, result);\n\n if (result.status === \"processed\") {\n return {\n status: \"processed\",\n passed: result.passed,\n score: result.score,\n details: result.details,\n label: result.label,\n cost: result.cost,\n } as SingleEvaluationResult;\n } else if (result.status === \"skipped\") {\n return {\n status: \"skipped\",\n details: result.details,\n } as SingleEvaluationResult;\n } else if (result.status === \"error\") {\n return {\n status: \"error\",\n error_type: (result as any).error_type || \"Unknown\",\n details: result.details || \"Unknown error\",\n traceback: (result as any).traceback || [],\n } as SingleEvaluationResult;\n } else {\n return {\n status: \"error\",\n error_type: \"UnknownStatus\",\n details: `Unknown evaluation status: ${result.status}`,\n traceback: [],\n } as SingleEvaluationResult;\n }\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error)?.message });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n"],"mappings":";;;;;;;;;;AAAO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAM3C,YAAY,SAAiB,UAAoB;AAC/C,UAAM,OAAO;AACb,SAAK,aAAa,SAAS;AAC3B,SAAK,iBAAiB,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,UAAmC;AAZzD;AAaI,QAAI;AACF,WAAI,cAAS,QAAQ,IAAI,cAAc,MAAnC,mBAAsC,SAAS,qBAAqB;AACtE,cAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,aAAK,OAAO;AAEZ,YAAI,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AAChD,eAAK,WAAW,KAAK;AAAA,QACvB;AAEA;AAAA,MACF;AAEA,WAAK,OAAO,MAAM,SAAS,KAAK;AAAA,IAClC,SAAQ;AACN,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ACpBA,SAAS,sBAAsB;AAkC/B,eAAsB,cACpB,SACiC;AACjC,SAAO,MAAM,OAAO,gBAAgB,kBAAkB,OAAO,SAAS;AAhDxE;AAiDI,SAAK,QAAQ,QAAQ,cAAc,cAAc,YAAY;AAE7D,QAAI;AACF,YAAM,cACJ,UAAU,UAAU,QAAQ,OAAO,QAAQ;AAC7C,YAAM,UAAU;AAAA,QACd,UAAU,KAAK,YAAY,EAAE;AAAA,QAC7B,SAAS,KAAK,YAAY,EAAE;AAAA,QAC5B,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,UAAU,QAAQ;AAAA,QAClB,cAAc,QAAQ;AAAA,MACxB;AAEA,UAAI,6BAA6B,GAAG;AAClC,aAAK,SAAS,OAAO;AAAA,MACvB;AAEA,YAAM,MAAM,IAAI;AAAA,QACd,oBAAoB,WAAW;AAAA,QAC/B,YAAY;AAAA,MACd;AAEA,YAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,QAC3C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB,UAAU;AAAA,UAC1B,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,IAAI,kBAAkB,4BAA4B,QAAQ;AACtE,cAAM,IAAI,cAAc,QAAQ;AAEhC,cAAM;AAAA,MACR;AAEA,YAAM,SAAgC,MAAM,SAAS,KAAK;AAE1D,WAAK,WAAW;AAAA,QACd,OAAM,YAAO,SAAP,mBAAa;AAAA,MACrB,CAAC;AAED,WAAK,qBAAoB,aAAQ,gBAAR,YAAuB,OAAO,MAAM;AAE7D,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,UACd,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,QACf;AAAA,MACF,WAAW,OAAO,WAAW,WAAW;AACtC,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS,OAAO;AAAA,QAClB;AAAA,MACF,WAAW,OAAO,WAAW,SAAS;AACpC,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAa,OAAe,cAAc;AAAA,UAC1C,SAAS,OAAO,WAAW;AAAA,UAC3B,WAAY,OAAe,aAAa,CAAC;AAAA,QAC3C;AAAA,MACF,OAAO;AACL,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS,8BAA8B,OAAO,MAAM;AAAA,UACpD,WAAW,CAAC;AAAA,QACd;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,gBAAgB,KAAc;AACnC,WAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAU,+BAAiB,QAAQ,CAAC;AACjF,YAAM;AAAA,IACR,UAAE;AACA,WAAK,IAAI;AAAA,IACX;AAAA,EACF,CAAC;AACH;","names":[]}
|