langwatch 0.1.7 ā 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.
- package/.editorconfig +16 -0
- package/LICENSE +7 -0
- package/README.md +268 -1
- package/copy-types.sh +19 -8
- package/examples/langchain/.env.example +2 -0
- package/examples/langchain/README.md +42 -0
- package/examples/langchain/package-lock.json +2930 -0
- package/examples/langchain/package.json +27 -0
- package/examples/langchain/src/cli-markdown.d.ts +137 -0
- package/examples/langchain/src/index.ts +109 -0
- package/examples/langchain/tsconfig.json +25 -0
- package/examples/langgraph/.env.example +2 -0
- package/examples/langgraph/README.md +42 -0
- package/examples/langgraph/package-lock.json +3031 -0
- package/examples/langgraph/package.json +28 -0
- package/examples/langgraph/src/cli-markdown.d.ts +137 -0
- package/examples/langgraph/src/index.ts +196 -0
- package/examples/langgraph/tsconfig.json +25 -0
- package/examples/mastra/.env.example +2 -0
- package/examples/mastra/README.md +57 -0
- package/examples/mastra/package-lock.json +5296 -0
- package/examples/mastra/package.json +32 -0
- package/examples/mastra/src/cli-markdown.d.ts +137 -0
- package/examples/mastra/src/index.ts +120 -0
- package/examples/mastra/src/mastra/agents/weather-agent.ts +30 -0
- package/examples/mastra/src/mastra/index.ts +21 -0
- package/examples/mastra/src/mastra/tools/weather-tool.ts +102 -0
- package/examples/mastra/tsconfig.json +25 -0
- package/examples/vercel-ai/.env.example +2 -0
- package/examples/vercel-ai/README.md +38 -0
- package/examples/vercel-ai/package-lock.json +2571 -0
- package/examples/vercel-ai/package.json +27 -0
- package/examples/vercel-ai/src/cli-markdown.d.ts +137 -0
- package/examples/vercel-ai/src/index.ts +110 -0
- package/examples/vercel-ai/src/instrumentation.ts +9 -0
- package/examples/vercel-ai/tsconfig.json +25 -0
- package/package.json +80 -33
- package/src/__tests__/client-browser.test.ts +92 -0
- package/src/__tests__/client-node.test.ts +76 -0
- package/src/__tests__/client.test.ts +71 -0
- package/src/__tests__/integration/client-browser.test.ts +46 -0
- package/src/__tests__/integration/client-node.test.ts +46 -0
- package/src/client-browser.ts +70 -0
- package/src/client-node.ts +82 -0
- package/src/client-shared.ts +72 -0
- package/src/client.ts +119 -0
- package/src/evaluation/__tests__/record-evaluation.test.ts +112 -0
- package/src/evaluation/__tests__/run-evaluation.test.ts +171 -0
- package/src/evaluation/index.ts +2 -0
- package/src/evaluation/record-evaluation.ts +101 -0
- package/src/evaluation/run-evaluation.ts +133 -0
- package/src/evaluation/tracer.ts +3 -0
- package/src/evaluation/types.ts +23 -0
- package/src/index.ts +10 -591
- package/src/internal/api/__tests__/errors.test.ts +98 -0
- package/src/internal/api/client.ts +30 -0
- package/src/internal/api/errors.ts +32 -0
- package/src/internal/generated/types/.gitkeep +0 -0
- package/src/observability/__tests__/integration/base.test.ts +74 -0
- package/src/observability/__tests__/integration/browser-setup-ordering.test.ts +60 -0
- package/src/observability/__tests__/integration/complex-nested-spans.test.ts +29 -0
- package/src/observability/__tests__/integration/error-handling.test.ts +24 -0
- package/src/observability/__tests__/integration/langwatch-disabled-otel.test.ts +24 -0
- package/src/observability/__tests__/integration/langwatch-first-then-vercel.test.ts +24 -0
- package/src/observability/__tests__/integration/multiple-setup-attempts.test.ts +27 -0
- package/src/observability/__tests__/integration/otel-ordering.test.ts +27 -0
- package/src/observability/__tests__/integration/vercel-configurations.test.ts +20 -0
- package/src/observability/__tests__/integration/vercel-first-then-langwatch.test.ts +27 -0
- package/src/observability/__tests__/span.test.ts +214 -0
- package/src/observability/__tests__/trace.test.ts +180 -0
- package/src/observability/exporters/index.ts +1 -0
- package/src/observability/exporters/langwatch-exporter.ts +53 -0
- package/src/observability/index.ts +4 -0
- package/src/observability/instrumentation/langchain/__tests__/integration/langchain-chatbot.test.ts +112 -0
- package/src/observability/instrumentation/langchain/__tests__/langchain.test.ts +284 -0
- package/src/observability/instrumentation/langchain/index.ts +624 -0
- package/src/observability/processors/__tests__/filterable-batch-span-exporter.test.ts +98 -0
- package/src/observability/processors/filterable-batch-span-processor.ts +99 -0
- package/src/observability/processors/index.ts +1 -0
- package/src/observability/semconv/attributes.ts +185 -0
- package/src/observability/semconv/events.ts +42 -0
- package/src/observability/semconv/index.ts +16 -0
- package/src/observability/semconv/values.ts +159 -0
- package/src/observability/span.ts +728 -0
- package/src/observability/trace.ts +301 -0
- package/src/prompt/__tests__/prompt.test.ts +139 -0
- package/src/prompt/get-prompt-version.ts +49 -0
- package/src/prompt/get-prompt.ts +44 -0
- package/src/prompt/index.ts +3 -0
- package/src/prompt/prompt.ts +133 -0
- package/src/prompt/service.ts +221 -0
- package/src/prompt/tracer.ts +3 -0
- package/src/prompt/types.ts +0 -0
- package/ts-to-zod.config.js +11 -0
- package/tsconfig.json +3 -9
- package/tsup.config.ts +11 -1
- package/vitest.config.ts +1 -0
- package/dist/chunk-FWBCQQYZ.mjs +0 -711
- package/dist/chunk-FWBCQQYZ.mjs.map +0 -1
- package/dist/index.d.mts +0 -1010
- package/dist/index.d.ts +0 -1010
- package/dist/index.js +0 -27294
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -959
- package/dist/index.mjs.map +0 -1
- package/dist/utils-B0pgWcps.d.mts +0 -303
- package/dist/utils-B0pgWcps.d.ts +0 -303
- package/dist/utils.d.mts +0 -2
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -703
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -11
- package/dist/utils.mjs.map +0 -1
- 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 -9990
- 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 -91
- package/src/evaluations.ts +0 -219
- package/src/index.test.ts +0 -402
- package/src/langchain.ts +0 -557
- package/src/typeUtils.ts +0 -89
- package/src/types.ts +0 -79
- package/src/utils.ts +0 -205
- /package/src/{server/types ā internal/generated/openapi}/.gitkeep +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "langgraph-sdk-example",
|
|
3
|
+
"description": "",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"start": "tsc && dotenv -- node dist/index.js",
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [],
|
|
11
|
+
"author": "LangWatch",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@langchain/openai": "^0.6.3",
|
|
16
|
+
"@langchain/core": "^0.3.66",
|
|
17
|
+
"langchain": "^0.3.30",
|
|
18
|
+
"@langchain/langgraph": "^0.4.2",
|
|
19
|
+
"@opentelemetry/context-async-hooks": "^2.0.1",
|
|
20
|
+
"@opentelemetry/sdk-node": "^0.203.0",
|
|
21
|
+
"cli-markdown": "^3.5.1",
|
|
22
|
+
"langwatch": "file:../../"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"typescript": "^5.9.2",
|
|
26
|
+
"dotenv-cli": "^10.0.0"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
declare module 'cli-markdown' {
|
|
2
|
+
export interface CliMarkdownOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Custom styles for different markdown elements
|
|
5
|
+
*/
|
|
6
|
+
styles?: {
|
|
7
|
+
/**
|
|
8
|
+
* Style for headings (h1, h2, h3, etc.)
|
|
9
|
+
*/
|
|
10
|
+
heading?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Style for bold text
|
|
13
|
+
*/
|
|
14
|
+
bold?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Style for italic text
|
|
17
|
+
*/
|
|
18
|
+
italic?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Style for code blocks
|
|
21
|
+
*/
|
|
22
|
+
code?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Style for inline code
|
|
25
|
+
*/
|
|
26
|
+
inlineCode?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Style for links
|
|
29
|
+
*/
|
|
30
|
+
link?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Style for lists
|
|
33
|
+
*/
|
|
34
|
+
list?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Style for blockquotes
|
|
37
|
+
*/
|
|
38
|
+
blockquote?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Style for horizontal rules
|
|
41
|
+
*/
|
|
42
|
+
hr?: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Whether to preserve line breaks
|
|
46
|
+
*/
|
|
47
|
+
preserveLineBreaks?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Custom renderer functions for different markdown elements
|
|
50
|
+
*/
|
|
51
|
+
renderers?: {
|
|
52
|
+
/**
|
|
53
|
+
* Custom renderer for headings
|
|
54
|
+
*/
|
|
55
|
+
heading?: (text: string, level: number) => string;
|
|
56
|
+
/**
|
|
57
|
+
* Custom renderer for paragraphs
|
|
58
|
+
*/
|
|
59
|
+
paragraph?: (text: string) => string;
|
|
60
|
+
/**
|
|
61
|
+
* Custom renderer for lists
|
|
62
|
+
*/
|
|
63
|
+
list?: (items: string[], ordered: boolean) => string;
|
|
64
|
+
/**
|
|
65
|
+
* Custom renderer for list items
|
|
66
|
+
*/
|
|
67
|
+
listItem?: (text: string, index: number) => string;
|
|
68
|
+
/**
|
|
69
|
+
* Custom renderer for code blocks
|
|
70
|
+
*/
|
|
71
|
+
code?: (code: string, language?: string) => string;
|
|
72
|
+
/**
|
|
73
|
+
* Custom renderer for inline code
|
|
74
|
+
*/
|
|
75
|
+
inlineCode?: (code: string) => string;
|
|
76
|
+
/**
|
|
77
|
+
* Custom renderer for links
|
|
78
|
+
*/
|
|
79
|
+
link?: (text: string, url: string) => string;
|
|
80
|
+
/**
|
|
81
|
+
* Custom renderer for images
|
|
82
|
+
*/
|
|
83
|
+
image?: (alt: string, url: string) => string;
|
|
84
|
+
/**
|
|
85
|
+
* Custom renderer for blockquotes
|
|
86
|
+
*/
|
|
87
|
+
blockquote?: (text: string) => string;
|
|
88
|
+
/**
|
|
89
|
+
* Custom renderer for horizontal rules
|
|
90
|
+
*/
|
|
91
|
+
hr?: () => string;
|
|
92
|
+
/**
|
|
93
|
+
* Custom renderer for emphasis (bold/italic)
|
|
94
|
+
*/
|
|
95
|
+
emphasis?: (text: string, type: 'bold' | 'italic') => string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Maximum width for text wrapping
|
|
99
|
+
*/
|
|
100
|
+
maxWidth?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Whether to enable ANSI color codes
|
|
103
|
+
*/
|
|
104
|
+
colors?: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Custom color theme
|
|
107
|
+
*/
|
|
108
|
+
theme?: {
|
|
109
|
+
/**
|
|
110
|
+
* Color for headings
|
|
111
|
+
*/
|
|
112
|
+
heading?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Color for links
|
|
115
|
+
*/
|
|
116
|
+
link?: string;
|
|
117
|
+
/**
|
|
118
|
+
* Color for code
|
|
119
|
+
*/
|
|
120
|
+
code?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Color for blockquotes
|
|
123
|
+
*/
|
|
124
|
+
blockquote?: string;
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Converts markdown text to formatted CLI output
|
|
130
|
+
* @param markdown - The markdown text to convert
|
|
131
|
+
* @param options - Configuration options for the conversion
|
|
132
|
+
* @returns Formatted CLI text
|
|
133
|
+
*/
|
|
134
|
+
function cliMarkdown(markdown: string, options?: CliMarkdownOptions): string;
|
|
135
|
+
|
|
136
|
+
export = cliMarkdown;
|
|
137
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { setupLangWatch } from "langwatch/node";
|
|
2
|
+
import { LangWatchCallbackHandler } from "langwatch/observability/instrumentation/langchain";
|
|
3
|
+
import { getLangWatchTracer } from "langwatch";
|
|
4
|
+
import { semconv } from "langwatch/observability";
|
|
5
|
+
import { ChatOpenAI } from "@langchain/openai";
|
|
6
|
+
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
7
|
+
import * as readline from "readline";
|
|
8
|
+
import cliMarkdown from "cli-markdown";
|
|
9
|
+
|
|
10
|
+
await setupLangWatch();
|
|
11
|
+
|
|
12
|
+
const tracer = getLangWatchTracer("langgraph-sdk-example");
|
|
13
|
+
|
|
14
|
+
// Define the state interface for our multi-agent workflow
|
|
15
|
+
interface WorkflowState {
|
|
16
|
+
userQuery: string;
|
|
17
|
+
analysis: string;
|
|
18
|
+
recommendation: string;
|
|
19
|
+
finalResponse: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function main() {
|
|
23
|
+
const threadId = crypto.randomUUID();
|
|
24
|
+
const langWatchCallback = new LangWatchCallbackHandler();
|
|
25
|
+
|
|
26
|
+
const rl = readline.createInterface({
|
|
27
|
+
input: process.stdin,
|
|
28
|
+
output: process.stdout,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.log('š¤ Multi-Agent Workflow started! Type "quit" to exit.');
|
|
32
|
+
console.log("This example demonstrates a workflow with:");
|
|
33
|
+
console.log("1. Query Analysis Agent");
|
|
34
|
+
console.log("2. Recommendation Agent");
|
|
35
|
+
console.log("3. Response Synthesis Agent");
|
|
36
|
+
console.log("---");
|
|
37
|
+
|
|
38
|
+
// Initialize LangChain chat model
|
|
39
|
+
const chatModel = new ChatOpenAI({
|
|
40
|
+
modelName: "gpt-4o-mini",
|
|
41
|
+
temperature: 0.7,
|
|
42
|
+
callbacks: [langWatchCallback],
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Agent 1: Query Analysis Agent
|
|
46
|
+
const analyzeQuery = async (userQuery: string): Promise<string> => {
|
|
47
|
+
const analysisPrompt = new SystemMessage(
|
|
48
|
+
"You are an expert at analyzing user queries. Analyze the user's query and provide insights about what they're asking for, their intent, and any specific requirements."
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const result = await chatModel.invoke([
|
|
52
|
+
analysisPrompt,
|
|
53
|
+
new HumanMessage(`Analyze this query: ${userQuery}`)
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
return result.content as string;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Agent 2: Recommendation Agent
|
|
60
|
+
const generateRecommendation = async (userQuery: string, analysis: string): Promise<string> => {
|
|
61
|
+
const recommendationPrompt = new SystemMessage(
|
|
62
|
+
"You are an expert at providing helpful recommendations. Based on the analysis, provide specific, actionable recommendations."
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const result = await chatModel.invoke([
|
|
66
|
+
recommendationPrompt,
|
|
67
|
+
new HumanMessage(`Based on this analysis: ${analysis}\n\nProvide recommendations for: ${userQuery}`)
|
|
68
|
+
]);
|
|
69
|
+
|
|
70
|
+
return result.content as string;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Agent 3: Response Synthesis Agent
|
|
74
|
+
const synthesizeResponse = async (userQuery: string, analysis: string, recommendation: string): Promise<string> => {
|
|
75
|
+
const synthesisPrompt = new SystemMessage(
|
|
76
|
+
"You are an expert at synthesizing information into clear, helpful responses. Combine the analysis and recommendations into a comprehensive, well-structured response."
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const result = await chatModel.invoke([
|
|
80
|
+
synthesisPrompt,
|
|
81
|
+
new HumanMessage(`Original Query: ${userQuery}\n\nAnalysis: ${analysis}\n\nRecommendations: ${recommendation}\n\nSynthesize this into a comprehensive response.`)
|
|
82
|
+
]);
|
|
83
|
+
|
|
84
|
+
return result.content as string;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Main workflow function
|
|
88
|
+
const runWorkflow = async (userQuery: string): Promise<WorkflowState> => {
|
|
89
|
+
console.log("š Step 1: Analyzing query...");
|
|
90
|
+
const analysis = await analyzeQuery(userQuery);
|
|
91
|
+
|
|
92
|
+
console.log("š” Step 2: Generating recommendations...");
|
|
93
|
+
const recommendation = await generateRecommendation(userQuery, analysis);
|
|
94
|
+
|
|
95
|
+
console.log("šÆ Step 3: Synthesizing final response...");
|
|
96
|
+
const finalResponse = await synthesizeResponse(userQuery, analysis, recommendation);
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
userQuery,
|
|
100
|
+
analysis,
|
|
101
|
+
recommendation,
|
|
102
|
+
finalResponse,
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
while (true) {
|
|
107
|
+
let finish = false;
|
|
108
|
+
|
|
109
|
+
await tracer.withActiveSpan("workflow_iteration", {
|
|
110
|
+
attributes: {
|
|
111
|
+
[semconv.ATTR_LANGWATCH_THREAD_ID]: threadId,
|
|
112
|
+
},
|
|
113
|
+
}, async (span) => {
|
|
114
|
+
try {
|
|
115
|
+
// Get user input
|
|
116
|
+
const userInput = await new Promise<string>((resolve) => {
|
|
117
|
+
rl.question("You: ", resolve);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Check for exit command
|
|
121
|
+
if (
|
|
122
|
+
userInput.toLowerCase() === "quit" ||
|
|
123
|
+
userInput.toLowerCase() === "exit"
|
|
124
|
+
) {
|
|
125
|
+
console.log("š Goodbye!");
|
|
126
|
+
finish = true;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Skip empty input
|
|
131
|
+
if (!userInput.trim()) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
console.log("š¤ Processing through multi-agent workflow...");
|
|
136
|
+
|
|
137
|
+
// Execute the workflow
|
|
138
|
+
const result = await runWorkflow(userInput);
|
|
139
|
+
|
|
140
|
+
// Display the workflow results
|
|
141
|
+
console.log("\nš Workflow Results:");
|
|
142
|
+
console.log("---");
|
|
143
|
+
|
|
144
|
+
console.log("š Analysis:");
|
|
145
|
+
console.log(cliMarkdown(result.analysis, {
|
|
146
|
+
colors: true,
|
|
147
|
+
maxWidth: 80,
|
|
148
|
+
theme: {
|
|
149
|
+
heading: "cyan",
|
|
150
|
+
link: "blue",
|
|
151
|
+
code: "green",
|
|
152
|
+
blockquote: "yellow",
|
|
153
|
+
},
|
|
154
|
+
}));
|
|
155
|
+
|
|
156
|
+
console.log("\nš” Recommendations:");
|
|
157
|
+
console.log(cliMarkdown(result.recommendation, {
|
|
158
|
+
colors: true,
|
|
159
|
+
maxWidth: 80,
|
|
160
|
+
theme: {
|
|
161
|
+
heading: "cyan",
|
|
162
|
+
link: "blue",
|
|
163
|
+
code: "green",
|
|
164
|
+
blockquote: "yellow",
|
|
165
|
+
},
|
|
166
|
+
}));
|
|
167
|
+
|
|
168
|
+
console.log("\nšÆ Final Response:");
|
|
169
|
+
console.log(cliMarkdown(result.finalResponse, {
|
|
170
|
+
colors: true,
|
|
171
|
+
maxWidth: 80,
|
|
172
|
+
theme: {
|
|
173
|
+
heading: "cyan",
|
|
174
|
+
link: "blue",
|
|
175
|
+
code: "green",
|
|
176
|
+
blockquote: "yellow",
|
|
177
|
+
},
|
|
178
|
+
}));
|
|
179
|
+
|
|
180
|
+
console.log("---");
|
|
181
|
+
} catch (error) {
|
|
182
|
+
console.error("ā Error:", error);
|
|
183
|
+
console.log("Please try again.");
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
if (finish) {
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
rl.close();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Run the multi-agent workflow
|
|
196
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "node16",
|
|
5
|
+
"moduleResolution": "node16",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"allowSyntheticDefaultImports": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"declarationMap": true,
|
|
16
|
+
"sourceMap": true
|
|
17
|
+
},
|
|
18
|
+
"include": [
|
|
19
|
+
"src/**/*"
|
|
20
|
+
],
|
|
21
|
+
"exclude": [
|
|
22
|
+
"node_modules",
|
|
23
|
+
"dist"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Mastra Weather Agent Example
|
|
2
|
+
|
|
3
|
+
This example demonstrates how to use LangWatch with Mastra to create a weather agent that can provide weather information and suggest activities based on weather conditions.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Weather Agent**: An AI agent that can fetch weather data and suggest activities
|
|
8
|
+
- **Weather Tool**: A tool that fetches real-time weather data from Open-Meteo API
|
|
9
|
+
- **CLI Chatbox Interface**: Interactive command-line interface for chatting with the weather agent
|
|
10
|
+
- **LangWatch Integration**: Full observability and tracing with LangWatch
|
|
11
|
+
|
|
12
|
+
## Getting Started
|
|
13
|
+
|
|
14
|
+
1. Install dependencies:
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Set up your environment variables:
|
|
20
|
+
```bash
|
|
21
|
+
cp .env.example .env
|
|
22
|
+
# Add your OpenAI API key to .env
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
3. Run the CLI chatbox interface:
|
|
26
|
+
```bash
|
|
27
|
+
npm run cli
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
4. Or run the workflow example:
|
|
31
|
+
```bash
|
|
32
|
+
npm start
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
### CLI Chatbox Interface
|
|
38
|
+
|
|
39
|
+
The CLI interface allows you to interact with the weather agent in a conversational manner:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm run cli
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Example conversation:
|
|
46
|
+
```
|
|
47
|
+
š¤ļø Weather Agent Chatbot started! Type "quit" to exit.
|
|
48
|
+
Ask me about weather for any location and I'll help you plan activities!
|
|
49
|
+
---
|
|
50
|
+
You: What's the weather like in Paris?
|
|
51
|
+
š¤ļø Checking weather and planning activities...
|
|
52
|
+
[Agent responds with weather information and activity suggestions]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Workflow Example
|
|
56
|
+
|
|
57
|
+
The workflow example demonstrates how to use Mastra workflows to fetch weather data and plan activities programmatically.
|