From 2d8b27f95b93be174eab50f8a9525766ddcbcdd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= Date: Tue, 3 Dec 2024 17:20:09 +0100 Subject: [PATCH 01/16] docs: add example with js sdk --- cookbook/js_langfuse_sdk.ipynb | 343 +++++++++++++++++++++ public/images/docs/js-any-llm-cookbook.png | Bin 0 -> 139050 bytes 2 files changed, 343 insertions(+) create mode 100644 cookbook/js_langfuse_sdk.ipynb create mode 100644 public/images/docs/js-any-llm-cookbook.png diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb new file mode 100644 index 000000000..dff54155e --- /dev/null +++ b/cookbook/js_langfuse_sdk.ipynb @@ -0,0 +1,343 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "28e400f4", + "metadata": {}, + "source": [ + "---\n", + "description: Learn how to use the Langfuse JS/TS SDK to log any LLM.\n", + "category: Integrations\n", + "---\n", + "\n", + "# Cookbook: Use the Langfuse JS/TS SDK to log any LLM.\n", + "\n", + "JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started." + ] + }, + { + "cell_type": "markdown", + "id": "849415ec", + "metadata": {}, + "source": [ + "## Step 1: Environment Variables\n", + "\n", + "*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.*\n", + "\n", + "Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "ec3e7874-e6db-44cd-9d55-7ffa72f630fa", + "metadata": {}, + "outputs": [], + "source": [ + "// Set env variables, Deno-specific syntax\n", + "Deno.env.set(\"OPENAI_API_KEY\", \"sk-...\");\n", + "\n", + "Deno.env.set(\"ANTHROPIC_API_KEY\", \"sk-...\");\n", + "\n", + "Deno.env.set(\"LANGFUSE_SECRET_KEY\", \"sk-...\");\n", + "Deno.env.set(\"LANGFUSE_PUBLIC_KEY\", \"pk-...\");\n", + "Deno.env.set(\"LANGFUSE_HOST\", \"https://cloud.langfuse.com\") // For US data region, set this to \"https://us.cloud.langfuse.com\"" + ] + }, + { + "cell_type": "markdown", + "id": "45b0d924", + "metadata": {}, + "source": [ + "Initialize the Langfuse client." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "e2b8bb18", + "metadata": {}, + "outputs": [], + "source": [ + "import Langfuse from \"npm:langfuse\";\n", + "\n", + "// Init Langfuse SDK\n", + "const langfuse = new Langfuse();" + ] + }, + { + "cell_type": "markdown", + "id": "a9802f80", + "metadata": {}, + "source": [ + "## Step 2: Create a Trace\n", + "\n", + "Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. \n", + "\n", + "To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "a68812d5", + "metadata": {}, + "outputs": [], + "source": [ + "// Creation of a unique trace id.\n", + "import { v4 as uuidv4 } from \"npm:uuid\";\n", + "\n", + "const traceId = uuidv4();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6987413c", + "metadata": {}, + "outputs": [], + "source": [ + "// Creation of the trace and assignment of metadata\n", + "const trace = langfuse.trace({\n", + " id: traceId,\n", + " name: \"anthropic-trace\",\n", + " userId: \"user_123456789\",\n", + " metadata: { user: \"user@langfuse.com\" },\n", + " tags: [\"production\"],\n", + "});\n", + " \n", + "// Example update, same params as create, cannot change id\n", + "trace.update({\n", + " metadata: {\n", + " tag: \"long-running\",\n", + " },\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "17ad59cb", + "metadata": {}, + "source": [ + "## Option 1: Log Any LLM\n", + "\n", + "This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide).\n", + "\n", + "We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK.\n", + "\n", + "Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "88ae3efe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " id: \"msg_01JaTqrfP1V93nxUKrCRgJo1\",\n", + " type: \"message\",\n", + " role: \"assistant\",\n", + " model: \"claude-3-5-sonnet-20241022\",\n", + " content: [\n", + " { type: \"text\", text: \"Hi! I'm Claude. How can I help you today?\" }\n", + " ],\n", + " stop_reason: \"end_turn\",\n", + " stop_sequence: null,\n", + " usage: { input_tokens: 10, output_tokens: 16 }\n", + "}\n" + ] + } + ], + "source": [ + "const msg = \"Hello, Claude\";\n", + "\n", + "// Example generation creation\n", + "const generation = trace.generation({\n", + " name: \"anthropic-generation01\",\n", + " input: msg,\n", + "});\n", + " \n", + "// Application code\n", + "const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n", + "\n", + "const chatCompletion = await anthropic.messages.create({\n", + " model: \"claude-3-5-sonnet-20241022\",\n", + " max_tokens: 1024,\n", + " messages: [{ role: \"user\", content: msg }],\n", + "});\n", + " \n", + "\n", + "// Example end - sets endTime, optionally pass a body\n", + "generation.end({\n", + " output: chatCompletion.content[0].text,\n", + " usage: {\n", + " promptTokens: chatCompletion.usage.input_tokens,\n", + " completionTokens: chatCompletion.usage.output_tokens,\n", + " },\n", + " model: chatCompletion.model,\n", + "\n", + "});\n", + "\n", + "console.log(chatCompletion);\n" + ] + }, + { + "cell_type": "markdown", + "id": "2b33b331", + "metadata": {}, + "source": [ + "![Example Trace](/images/docs/js-any-llm-cookbook.png)\n", + "\n", + "Example trace in the Langfuse UI." + ] + }, + { + "cell_type": "markdown", + "id": "a44200d4", + "metadata": {}, + "source": [ + "## Option 2: Using LangChain\n", + "\n", + "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "1b0ce7b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Why don't bears wear shoes?\n", + "\n", + "Because they have bear feet!\n" + ] + } + ], + "source": [ + "import { CallbackHandler } from \"npm:langfuse-langchain\"\n", + "const langfuseLangchainHandler = new CallbackHandler({\n", + " publicKey: Deno.env.get(\"LANGFUSE_PUBLIC_KEY\"),\n", + " secretKey: Deno.env.get(\"LANGFUSE_SECRET_KEY\"),\n", + " baseUrl: Deno.env.get(\"LANGFUSE_HOST\"),\n", + " flushAt: 1 // cookbook-only: do not batch events, send them immediately\n", + "})\n", + "\n", + "import { ChatOpenAI } from \"npm:@langchain/openai\"\n", + "import { PromptTemplate } from \"npm:@langchain/core/prompts\"\n", + " \n", + "const model = new ChatOpenAI({});\n", + "const promptTemplate = PromptTemplate.fromTemplate(\n", + " \"Tell me a joke about {topic}\"\n", + ");\n", + "\n", + "import { RunnableSequence } from \"npm:@langchain/core/runnables\";\n", + " \n", + "const chain = RunnableSequence.from([promptTemplate, model]);\n", + " \n", + "const res = await chain.invoke(\n", + " { topic: \"bears\" },\n", + " { callbacks: [langfuseLangchainHandler] }\n", + ");\n", + " \n", + "console.log(res.content)" + ] + }, + { + "cell_type": "markdown", + "id": "33e61e01", + "metadata": {}, + "source": [ + "## Option 3: Using OpenAI\n", + "\n", + "This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "59a87971", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Why couldn't the bicycle stand up by itself? Because it was two tired!\n" + ] + } + ], + "source": [ + "import OpenAI from \"npm:openai\";\n", + "import { observeOpenAI } from \"npm:langfuse\";\n", + " \n", + "// Configured via environment variables, see above\n", + "const openai = observeOpenAI(new OpenAI());\n", + " \n", + "const completion = await openai.chat.completions.create({\n", + " model: 'gpt-3.5-turbo',\n", + " messages: [{ role: \"system\", content: \"Tell me a joke.\" }],\n", + " max_tokens: 100,\n", + "});\n", + " \n", + "// notebook only: await events being flushed to Langfuse\n", + "await openai.flushAsync();\n", + " \n", + "console.log(completion.choices[0]?.message.content);" + ] + }, + { + "cell_type": "markdown", + "id": "29e44ef4", + "metadata": {}, + "source": [ + "## Step 3: Score the Trace (Optional)\n", + "\n", + "After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback.\n", + "\n", + "Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25d8220d", + "metadata": {}, + "outputs": [], + "source": [ + "langfuse.score({\n", + " id: traceId,\n", + " name: \"user-feedback\",\n", + " value: 3,\n", + " comment: \"This was a good interaction\",\n", + "});" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/public/images/docs/js-any-llm-cookbook.png b/public/images/docs/js-any-llm-cookbook.png new file mode 100644 index 0000000000000000000000000000000000000000..999e2405db857d41ca13ff7da987a3664b0660e0 GIT binary patch literal 139050 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�al=6_nO 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 Date: Tue, 3 Dec 2024 17:27:27 +0100 Subject: [PATCH 02/16] add notebook md --- cookbook/js_langfuse_sdk.md | 214 ++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 cookbook/js_langfuse_sdk.md diff --git a/cookbook/js_langfuse_sdk.md b/cookbook/js_langfuse_sdk.md new file mode 100644 index 000000000..97c3abe5c --- /dev/null +++ b/cookbook/js_langfuse_sdk.md @@ -0,0 +1,214 @@ +--- +description: Learn how to use the Langfuse JS/TS SDK to log any LLM. +category: Integrations +--- + +# Cookbook: Use the Langfuse JS/TS SDK to log any LLM. + +JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. + +## Step 1: Environment Variables + +*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.* + +Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. + + +```typescript +// Set env variables, Deno-specific syntax +Deno.env.set("OPENAI_API_KEY", "sk-..."); + +Deno.env.set("ANTHROPIC_API_KEY", "sk-..."); + +Deno.env.set("LANGFUSE_SECRET_KEY", "sk-..."); +Deno.env.set("LANGFUSE_PUBLIC_KEY", "pk-..."); +Deno.env.set("LANGFUSE_HOST", "https://cloud.langfuse.com") // For US data region, set this to "https://us.cloud.langfuse.com" +``` + +Initialize the Langfuse client. + + +```typescript +import Langfuse from "npm:langfuse"; + +// Init Langfuse SDK +const langfuse = new Langfuse(); +``` + +## Step 2: Create a Trace + +Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. + +To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. + + + +```typescript +// Creation of a unique trace id. +import { v4 as uuidv4 } from "npm:uuid"; + +const traceId = uuidv4(); +``` + + +```typescript +// Creation of the trace and assignment of metadata +const trace = langfuse.trace({ + id: traceId, + name: "anthropic-trace", + userId: "user_123456789", + metadata: { user: "user@langfuse.com" }, + tags: ["production"], +}); + +// Example update, same params as create, cannot change id +trace.update({ + metadata: { + tag: "long-running", + }, +}); +``` + +## Option 1: Log Any LLM + +This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). + +We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. + +Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI. + + +```typescript +const msg = "Hello, Claude"; + +// Example generation creation +const generation = trace.generation({ + name: "anthropic-generation01", + input: msg, +}); + +// Application code +const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); + +const chatCompletion = await anthropic.messages.create({ + model: "claude-3-5-sonnet-20241022", + max_tokens: 1024, + messages: [{ role: "user", content: msg }], +}); + + +// Example end - sets endTime, optionally pass a body +generation.end({ + output: chatCompletion.content[0].text, + usage: { + promptTokens: chatCompletion.usage.input_tokens, + completionTokens: chatCompletion.usage.output_tokens, + }, + model: chatCompletion.model, + +}); + +console.log(chatCompletion); + +``` + + { + id: "msg_01JaTqrfP1V93nxUKrCRgJo1", + type: "message", + role: "assistant", + model: "claude-3-5-sonnet-20241022", + content: [ + { type: "text", text: "Hi! I'm Claude. How can I help you today?" } + ], + stop_reason: "end_turn", + stop_sequence: null, + usage: { input_tokens: 10, output_tokens: 16 } + } + + +![Example Trace](/images/docs/js-any-llm-cookbook.png) + +Example trace in the Langfuse UI. + +## Option 2: Using LangChain + +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. + + +```typescript +import { CallbackHandler } from "npm:langfuse-langchain" +const langfuseLangchainHandler = new CallbackHandler({ + publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), + secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), + baseUrl: Deno.env.get("LANGFUSE_HOST"), + flushAt: 1 // cookbook-only: do not batch events, send them immediately +}) + +import { ChatOpenAI } from "npm:@langchain/openai" +import { PromptTemplate } from "npm:@langchain/core/prompts" + +const model = new ChatOpenAI({}); +const promptTemplate = PromptTemplate.fromTemplate( + "Tell me a joke about {topic}" +); + +import { RunnableSequence } from "npm:@langchain/core/runnables"; + +const chain = RunnableSequence.from([promptTemplate, model]); + +const res = await chain.invoke( + { topic: "bears" }, + { callbacks: [langfuseLangchainHandler] } +); + +console.log(res.content) +``` + + Why don't bears wear shoes? + + Because they have bear feet! + + +## Option 3: Using OpenAI + +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. + + + +```typescript +import OpenAI from "npm:openai"; +import { observeOpenAI } from "npm:langfuse"; + +// Configured via environment variables, see above +const openai = observeOpenAI(new OpenAI()); + +const completion = await openai.chat.completions.create({ + model: 'gpt-3.5-turbo', + messages: [{ role: "system", content: "Tell me a joke." }], + max_tokens: 100, +}); + +// notebook only: await events being flushed to Langfuse +await openai.flushAsync(); + +console.log(completion.choices[0]?.message.content); +``` + + Why couldn't the bicycle stand up by itself? Because it was two tired! + + +## Step 3: Score the Trace (Optional) + +After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. + +Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. + + +```typescript +langfuse.score({ + id: traceId, + name: "user-feedback", + value: 3, + comment: "This was a good interaction", +}); +``` From c722e1cdd600e6b1af3dfafc9135a41c15343a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= Date: Tue, 3 Dec 2024 17:33:58 +0100 Subject: [PATCH 03/16] add md file --- cookbook/_routes.json | 4 + pages/docs/sdk/typescript/_meta.tsx | 1 + pages/docs/sdk/typescript/example-notebook.md | 214 ++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 pages/docs/sdk/typescript/example-notebook.md diff --git a/cookbook/_routes.json b/cookbook/_routes.json index 55bd9550b..5632bc40c 100644 --- a/cookbook/_routes.json +++ b/cookbook/_routes.json @@ -154,5 +154,9 @@ { "notebook": "example_query_data_via_sdk.ipynb", "docsPath": null + }, + { + "notebook": "js_langfuse_sdk.ipynb", + "docsPath": "docs/sdk/typescript/example-notebook" } ] diff --git a/pages/docs/sdk/typescript/_meta.tsx b/pages/docs/sdk/typescript/_meta.tsx index 1a29bd949..4b93d7535 100644 --- a/pages/docs/sdk/typescript/_meta.tsx +++ b/pages/docs/sdk/typescript/_meta.tsx @@ -1,6 +1,7 @@ export default { guide: "Guide", "guide-web": "Guide (Web)", + "example-notebook": "Example Notebook", reference: { title: "Reference ↗", href: "https://js.reference.langfuse.com", diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md new file mode 100644 index 000000000..97c3abe5c --- /dev/null +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -0,0 +1,214 @@ +--- +description: Learn how to use the Langfuse JS/TS SDK to log any LLM. +category: Integrations +--- + +# Cookbook: Use the Langfuse JS/TS SDK to log any LLM. + +JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. + +## Step 1: Environment Variables + +*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.* + +Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. + + +```typescript +// Set env variables, Deno-specific syntax +Deno.env.set("OPENAI_API_KEY", "sk-..."); + +Deno.env.set("ANTHROPIC_API_KEY", "sk-..."); + +Deno.env.set("LANGFUSE_SECRET_KEY", "sk-..."); +Deno.env.set("LANGFUSE_PUBLIC_KEY", "pk-..."); +Deno.env.set("LANGFUSE_HOST", "https://cloud.langfuse.com") // For US data region, set this to "https://us.cloud.langfuse.com" +``` + +Initialize the Langfuse client. + + +```typescript +import Langfuse from "npm:langfuse"; + +// Init Langfuse SDK +const langfuse = new Langfuse(); +``` + +## Step 2: Create a Trace + +Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. + +To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. + + + +```typescript +// Creation of a unique trace id. +import { v4 as uuidv4 } from "npm:uuid"; + +const traceId = uuidv4(); +``` + + +```typescript +// Creation of the trace and assignment of metadata +const trace = langfuse.trace({ + id: traceId, + name: "anthropic-trace", + userId: "user_123456789", + metadata: { user: "user@langfuse.com" }, + tags: ["production"], +}); + +// Example update, same params as create, cannot change id +trace.update({ + metadata: { + tag: "long-running", + }, +}); +``` + +## Option 1: Log Any LLM + +This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). + +We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. + +Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI. + + +```typescript +const msg = "Hello, Claude"; + +// Example generation creation +const generation = trace.generation({ + name: "anthropic-generation01", + input: msg, +}); + +// Application code +const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); + +const chatCompletion = await anthropic.messages.create({ + model: "claude-3-5-sonnet-20241022", + max_tokens: 1024, + messages: [{ role: "user", content: msg }], +}); + + +// Example end - sets endTime, optionally pass a body +generation.end({ + output: chatCompletion.content[0].text, + usage: { + promptTokens: chatCompletion.usage.input_tokens, + completionTokens: chatCompletion.usage.output_tokens, + }, + model: chatCompletion.model, + +}); + +console.log(chatCompletion); + +``` + + { + id: "msg_01JaTqrfP1V93nxUKrCRgJo1", + type: "message", + role: "assistant", + model: "claude-3-5-sonnet-20241022", + content: [ + { type: "text", text: "Hi! I'm Claude. How can I help you today?" } + ], + stop_reason: "end_turn", + stop_sequence: null, + usage: { input_tokens: 10, output_tokens: 16 } + } + + +![Example Trace](/images/docs/js-any-llm-cookbook.png) + +Example trace in the Langfuse UI. + +## Option 2: Using LangChain + +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. + + +```typescript +import { CallbackHandler } from "npm:langfuse-langchain" +const langfuseLangchainHandler = new CallbackHandler({ + publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), + secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), + baseUrl: Deno.env.get("LANGFUSE_HOST"), + flushAt: 1 // cookbook-only: do not batch events, send them immediately +}) + +import { ChatOpenAI } from "npm:@langchain/openai" +import { PromptTemplate } from "npm:@langchain/core/prompts" + +const model = new ChatOpenAI({}); +const promptTemplate = PromptTemplate.fromTemplate( + "Tell me a joke about {topic}" +); + +import { RunnableSequence } from "npm:@langchain/core/runnables"; + +const chain = RunnableSequence.from([promptTemplate, model]); + +const res = await chain.invoke( + { topic: "bears" }, + { callbacks: [langfuseLangchainHandler] } +); + +console.log(res.content) +``` + + Why don't bears wear shoes? + + Because they have bear feet! + + +## Option 3: Using OpenAI + +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. + + + +```typescript +import OpenAI from "npm:openai"; +import { observeOpenAI } from "npm:langfuse"; + +// Configured via environment variables, see above +const openai = observeOpenAI(new OpenAI()); + +const completion = await openai.chat.completions.create({ + model: 'gpt-3.5-turbo', + messages: [{ role: "system", content: "Tell me a joke." }], + max_tokens: 100, +}); + +// notebook only: await events being flushed to Langfuse +await openai.flushAsync(); + +console.log(completion.choices[0]?.message.content); +``` + + Why couldn't the bicycle stand up by itself? Because it was two tired! + + +## Step 3: Score the Trace (Optional) + +After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. + +Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. + + +```typescript +langfuse.score({ + id: traceId, + name: "user-feedback", + value: 3, + comment: "This was a good interaction", +}); +``` From 27b8c218748e70b257de4d8b6ab3e917c972d11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= Date: Tue, 3 Dec 2024 17:35:16 +0100 Subject: [PATCH 04/16] remove wrong md file --- cookbook/js_langfuse_sdk.md | 214 ------------------------------------ 1 file changed, 214 deletions(-) delete mode 100644 cookbook/js_langfuse_sdk.md diff --git a/cookbook/js_langfuse_sdk.md b/cookbook/js_langfuse_sdk.md deleted file mode 100644 index 97c3abe5c..000000000 --- a/cookbook/js_langfuse_sdk.md +++ /dev/null @@ -1,214 +0,0 @@ ---- -description: Learn how to use the Langfuse JS/TS SDK to log any LLM. -category: Integrations ---- - -# Cookbook: Use the Langfuse JS/TS SDK to log any LLM. - -JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. - -## Step 1: Environment Variables - -*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.* - -Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. - - -```typescript -// Set env variables, Deno-specific syntax -Deno.env.set("OPENAI_API_KEY", "sk-..."); - -Deno.env.set("ANTHROPIC_API_KEY", "sk-..."); - -Deno.env.set("LANGFUSE_SECRET_KEY", "sk-..."); -Deno.env.set("LANGFUSE_PUBLIC_KEY", "pk-..."); -Deno.env.set("LANGFUSE_HOST", "https://cloud.langfuse.com") // For US data region, set this to "https://us.cloud.langfuse.com" -``` - -Initialize the Langfuse client. - - -```typescript -import Langfuse from "npm:langfuse"; - -// Init Langfuse SDK -const langfuse = new Langfuse(); -``` - -## Step 2: Create a Trace - -Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. - -To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. - - - -```typescript -// Creation of a unique trace id. -import { v4 as uuidv4 } from "npm:uuid"; - -const traceId = uuidv4(); -``` - - -```typescript -// Creation of the trace and assignment of metadata -const trace = langfuse.trace({ - id: traceId, - name: "anthropic-trace", - userId: "user_123456789", - metadata: { user: "user@langfuse.com" }, - tags: ["production"], -}); - -// Example update, same params as create, cannot change id -trace.update({ - metadata: { - tag: "long-running", - }, -}); -``` - -## Option 1: Log Any LLM - -This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). - -We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. - -Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI. - - -```typescript -const msg = "Hello, Claude"; - -// Example generation creation -const generation = trace.generation({ - name: "anthropic-generation01", - input: msg, -}); - -// Application code -const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); - -const chatCompletion = await anthropic.messages.create({ - model: "claude-3-5-sonnet-20241022", - max_tokens: 1024, - messages: [{ role: "user", content: msg }], -}); - - -// Example end - sets endTime, optionally pass a body -generation.end({ - output: chatCompletion.content[0].text, - usage: { - promptTokens: chatCompletion.usage.input_tokens, - completionTokens: chatCompletion.usage.output_tokens, - }, - model: chatCompletion.model, - -}); - -console.log(chatCompletion); - -``` - - { - id: "msg_01JaTqrfP1V93nxUKrCRgJo1", - type: "message", - role: "assistant", - model: "claude-3-5-sonnet-20241022", - content: [ - { type: "text", text: "Hi! I'm Claude. How can I help you today?" } - ], - stop_reason: "end_turn", - stop_sequence: null, - usage: { input_tokens: 10, output_tokens: 16 } - } - - -![Example Trace](/images/docs/js-any-llm-cookbook.png) - -Example trace in the Langfuse UI. - -## Option 2: Using LangChain - -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. - - -```typescript -import { CallbackHandler } from "npm:langfuse-langchain" -const langfuseLangchainHandler = new CallbackHandler({ - publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), - secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), - baseUrl: Deno.env.get("LANGFUSE_HOST"), - flushAt: 1 // cookbook-only: do not batch events, send them immediately -}) - -import { ChatOpenAI } from "npm:@langchain/openai" -import { PromptTemplate } from "npm:@langchain/core/prompts" - -const model = new ChatOpenAI({}); -const promptTemplate = PromptTemplate.fromTemplate( - "Tell me a joke about {topic}" -); - -import { RunnableSequence } from "npm:@langchain/core/runnables"; - -const chain = RunnableSequence.from([promptTemplate, model]); - -const res = await chain.invoke( - { topic: "bears" }, - { callbacks: [langfuseLangchainHandler] } -); - -console.log(res.content) -``` - - Why don't bears wear shoes? - - Because they have bear feet! - - -## Option 3: Using OpenAI - -This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. - - - -```typescript -import OpenAI from "npm:openai"; -import { observeOpenAI } from "npm:langfuse"; - -// Configured via environment variables, see above -const openai = observeOpenAI(new OpenAI()); - -const completion = await openai.chat.completions.create({ - model: 'gpt-3.5-turbo', - messages: [{ role: "system", content: "Tell me a joke." }], - max_tokens: 100, -}); - -// notebook only: await events being flushed to Langfuse -await openai.flushAsync(); - -console.log(completion.choices[0]?.message.content); -``` - - Why couldn't the bicycle stand up by itself? Because it was two tired! - - -## Step 3: Score the Trace (Optional) - -After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. - -Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. - - -```typescript -langfuse.score({ - id: traceId, - name: "user-feedback", - value: 3, - comment: "This was a good interaction", -}); -``` From 2b880191c5941423db7e65c68f1a0412d2acafc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= Date: Tue, 3 Dec 2024 18:57:24 +0100 Subject: [PATCH 05/16] update notebook --- cookbook/js_langfuse_sdk.ipynb | 150 ++++++++++-------- pages/docs/sdk/typescript/example-notebook.md | 113 +++++++------ 2 files changed, 149 insertions(+), 114 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index dff54155e..9df80a68f 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -10,9 +10,11 @@ "category: Integrations\n", "---\n", "\n", - "# Cookbook: Use the Langfuse JS/TS SDK to log any LLM.\n", + "# Cookbook: Langfuse JS/TS SDK\n", "\n", - "JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started." + "JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started.\n", + "\n", + "For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). " ] }, { @@ -20,7 +22,7 @@ "id": "849415ec", "metadata": {}, "source": [ - "## Step 1: Environment Variables\n", + "## Step 1: Setup\n", "\n", "*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.*\n", "\n", @@ -29,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 65, "id": "ec3e7874-e6db-44cd-9d55-7ffa72f630fa", "metadata": {}, "outputs": [], @@ -54,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 66, "id": "e2b8bb18", "metadata": {}, "outputs": [], @@ -79,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 67, "id": "a68812d5", "metadata": {}, "outputs": [], "source": [ - "// Creation of a unique trace id.\n", + "// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. \n", "import { v4 as uuidv4 } from \"npm:uuid\";\n", "\n", "const traceId = uuidv4();" @@ -100,7 +102,7 @@ "// Creation of the trace and assignment of metadata\n", "const trace = langfuse.trace({\n", " id: traceId,\n", - " name: \"anthropic-trace\",\n", + " name: \"JS-SDK-Trace\",\n", " userId: \"user_123456789\",\n", " metadata: { user: \"user@langfuse.com\" },\n", " tags: [\"production\"],\n", @@ -123,14 +125,16 @@ "\n", "This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide).\n", "\n", - "We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK.\n", + "We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace.\n", + "\n", + "We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK.\n", "\n", - "Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI." + "Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI." ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 73, "id": "88ae3efe", "metadata": {}, "outputs": [ @@ -138,32 +142,28 @@ "name": "stdout", "output_type": "stream", "text": [ - "{\n", - " id: \"msg_01JaTqrfP1V93nxUKrCRgJo1\",\n", - " type: \"message\",\n", - " role: \"assistant\",\n", - " model: \"claude-3-5-sonnet-20241022\",\n", - " content: [\n", - " { type: \"text\", text: \"Hi! I'm Claude. How can I help you today?\" }\n", - " ],\n", - " stop_reason: \"end_turn\",\n", - " stop_sequence: null,\n", - " usage: { input_tokens: 10, output_tokens: 16 }\n", - "}\n" + "Hello! How can I help you today?\n" ] } ], "source": [ "const msg = \"Hello, Claude\";\n", "\n", + "// Create span\n", + "const span_name = \"Anthropic-Span\";\n", + "const span = trace.span({ name: span_name });\n", + "\n", "// Example generation creation\n", - "const generation = trace.generation({\n", + "const generation = span.generation({\n", " name: \"anthropic-generation01\",\n", + " model: \"claude-3-5-sonnet-20241022\",\n", " input: msg,\n", "});\n", " \n", "// Application code\n", - "const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n", + "import Anthropic from \"npm:@anthropic-ai/sdk\";\n", + "\n", + "const anthropic = new Anthropic({ apiKey: Deno.env.get(\"ANTHROPIC_API_KEY\") });\n", "\n", "const chatCompletion = await anthropic.messages.create({\n", " model: \"claude-3-5-sonnet-20241022\",\n", @@ -176,24 +176,15 @@ "generation.end({\n", " output: chatCompletion.content[0].text,\n", " usage: {\n", - " promptTokens: chatCompletion.usage.input_tokens,\n", - " completionTokens: chatCompletion.usage.output_tokens,\n", + " input: chatCompletion.usage.input_tokens,\n", + " output: chatCompletion.usage.output_tokens,\n", " },\n", - " model: chatCompletion.model,\n", - "\n", "});\n", "\n", - "console.log(chatCompletion);\n" - ] - }, - { - "cell_type": "markdown", - "id": "2b33b331", - "metadata": {}, - "source": [ - "![Example Trace](/images/docs/js-any-llm-cookbook.png)\n", + "// End span to get span-level latencies\n", + "span.end();\n", "\n", - "Example trace in the Langfuse UI." + "console.log(chatCompletion.content[0].text);\n" ] }, { @@ -203,12 +194,12 @@ "source": [ "## Option 2: Using LangChain\n", "\n", - "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured." + "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`." ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 70, "id": "1b0ce7b5", "metadata": {}, "outputs": [ @@ -216,15 +207,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "Why don't bears wear shoes?\n", + "Why did the bear break up with his girlfriend?\n", "\n", - "Because they have bear feet!\n" + "Because she was too grizzly for him!\n" ] } ], "source": [ + "// Create span\n", + "const span_name = \"Langchain-Span\";\n", + "const span = trace.span({ name: span_name });\n", + "\n", "import { CallbackHandler } from \"npm:langfuse-langchain\"\n", "const langfuseLangchainHandler = new CallbackHandler({\n", + " root: span,\n", " publicKey: Deno.env.get(\"LANGFUSE_PUBLIC_KEY\"),\n", " secretKey: Deno.env.get(\"LANGFUSE_SECRET_KEY\"),\n", " baseUrl: Deno.env.get(\"LANGFUSE_HOST\"),\n", @@ -247,6 +243,9 @@ " { topic: \"bears\" },\n", " { callbacks: [langfuseLangchainHandler] }\n", ");\n", + "\n", + "// End span to get span-level latencies\n", + "span.end();\n", " \n", "console.log(res.content)" ] @@ -258,40 +257,41 @@ "source": [ "## Option 3: Using OpenAI\n", "\n", - "This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured.\n" + "This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function.\n" ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "59a87971", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Why couldn't the bicycle stand up by itself? Because it was two tired!\n" - ] - } - ], + "outputs": [], "source": [ - "import OpenAI from \"npm:openai\";\n", - "import { observeOpenAI } from \"npm:langfuse\";\n", + "// Initialize SDKs\n", + "const openai = new OpenAI();\n", " \n", - "// Configured via environment variables, see above\n", - "const openai = observeOpenAI(new OpenAI());\n", + "// Create span\n", + "const span_name = \"OpenAI-Span\";\n", + "const span = trace.span({ name: span_name });\n", " \n", - "const completion = await openai.chat.completions.create({\n", - " model: 'gpt-3.5-turbo',\n", - " messages: [{ role: \"system\", content: \"Tell me a joke.\" }],\n", - " max_tokens: 100,\n", - "});\n", + "// Call OpenAI\n", + "const joke = (\n", + " await observeOpenAI(openai, {\n", + " parent: span,\n", + " generationName: \"OpenAI-Generation\",\n", + " }).chat.completions.create({\n", + " model: \"gpt-3.5-turbo\",\n", + " messages: [\n", + " { role: \"system\", content: \"Tell me a joke.\" },\n", + " ],\n", + " })\n", + ").choices[0].message.content;\n", " \n", - "// notebook only: await events being flushed to Langfuse\n", - "await openai.flushAsync();\n", + "// End span to get span-level latencies\n", + "span.end();\n", " \n", - "console.log(completion.choices[0]?.message.content);" + "// Flush the Langfuse client belonging to the parent span\n", + "await langfuse.flushAsync();" ] }, { @@ -320,6 +320,24 @@ " comment: \"This was a good interaction\",\n", "});" ] + }, + { + "cell_type": "markdown", + "id": "ab1dbbd5", + "metadata": {}, + "source": [ + "## Step 4: View the Trace in Langfuse" + ] + }, + { + "cell_type": "markdown", + "id": "fc8185af", + "metadata": {}, + "source": [ + "![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif)\n", + "\n", + "[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details)." + ] } ], "metadata": { diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index 97c3abe5c..f640a4d53 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -3,11 +3,13 @@ description: Learn how to use the Langfuse JS/TS SDK to log any LLM. category: Integrations --- -# Cookbook: Use the Langfuse JS/TS SDK to log any LLM. +# Cookbook: Langfuse JS/TS SDK JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. -## Step 1: Environment Variables +For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). + +## Step 1: Setup *Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.* @@ -44,7 +46,7 @@ To log an LLM call, we will first create a trace. In this step, we can also assi ```typescript -// Creation of a unique trace id. +// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. import { v4 as uuidv4 } from "npm:uuid"; const traceId = uuidv4(); @@ -55,7 +57,7 @@ const traceId = uuidv4(); // Creation of the trace and assignment of metadata const trace = langfuse.trace({ id: traceId, - name: "anthropic-trace", + name: "JS-SDK-Trace", userId: "user_123456789", metadata: { user: "user@langfuse.com" }, tags: ["production"], @@ -73,22 +75,31 @@ trace.update({ This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). -We first create a observation of the type `Generation` which will be assigned to the trace we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. +We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace. + +We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. -Lastly, we pass the model output, the mode name and usage metrics to the generation. We can now see this trace in the Langfuse UI. +Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI. ```typescript const msg = "Hello, Claude"; +// Create span +const span_name = "Anthropic-Span"; +const span = trace.span({ name: span_name }); + // Example generation creation -const generation = trace.generation({ +const generation = span.generation({ name: "anthropic-generation01", + model: "claude-3-5-sonnet-20241022", input: msg, }); // Application code -const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); +import Anthropic from "npm:@anthropic-ai/sdk"; + +const anthropic = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY") }); const chatCompletion = await anthropic.messages.create({ model: "claude-3-5-sonnet-20241022", @@ -101,43 +112,34 @@ const chatCompletion = await anthropic.messages.create({ generation.end({ output: chatCompletion.content[0].text, usage: { - promptTokens: chatCompletion.usage.input_tokens, - completionTokens: chatCompletion.usage.output_tokens, + input: chatCompletion.usage.input_tokens, + output: chatCompletion.usage.output_tokens, }, - model: chatCompletion.model, - }); -console.log(chatCompletion); - -``` +// End span to get span-level latencies +span.end(); - { - id: "msg_01JaTqrfP1V93nxUKrCRgJo1", - type: "message", - role: "assistant", - model: "claude-3-5-sonnet-20241022", - content: [ - { type: "text", text: "Hi! I'm Claude. How can I help you today?" } - ], - stop_reason: "end_turn", - stop_sequence: null, - usage: { input_tokens: 10, output_tokens: 16 } - } +console.log(chatCompletion.content[0].text); +``` -![Example Trace](/images/docs/js-any-llm-cookbook.png) + Hello! How can I help you today? -Example trace in the Langfuse UI. ## Option 2: Using LangChain -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`. ```typescript +// Create span +const span_name = "Langchain-Span"; +const span = trace.span({ name: span_name }); + import { CallbackHandler } from "npm:langfuse-langchain" const langfuseLangchainHandler = new CallbackHandler({ + root: span, publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), baseUrl: Deno.env.get("LANGFUSE_HOST"), @@ -160,43 +162,52 @@ const res = await chain.invoke( { topic: "bears" }, { callbacks: [langfuseLangchainHandler] } ); + +// End span to get span-level latencies +span.end(); console.log(res.content) ``` - Why don't bears wear shoes? + Why did the bear break up with his girlfriend? - Because they have bear feet! + Because she was too grizzly for him! ## Option 3: Using OpenAI -This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function. ```typescript -import OpenAI from "npm:openai"; -import { observeOpenAI } from "npm:langfuse"; +// Initialize SDKs +const openai = new OpenAI(); -// Configured via environment variables, see above -const openai = observeOpenAI(new OpenAI()); +// Create span +const span_name = "OpenAI-Span"; +const span = trace.span({ name: span_name }); -const completion = await openai.chat.completions.create({ - model: 'gpt-3.5-turbo', - messages: [{ role: "system", content: "Tell me a joke." }], - max_tokens: 100, -}); +// Call OpenAI +const joke = ( + await observeOpenAI(openai, { + parent: span, + generationName: "OpenAI-Generation", + }).chat.completions.create({ + model: "gpt-3.5-turbo", + messages: [ + { role: "system", content: "Tell me a joke." }, + ], + }) +).choices[0].message.content; -// notebook only: await events being flushed to Langfuse -await openai.flushAsync(); +// End span to get span-level latencies +span.end(); -console.log(completion.choices[0]?.message.content); +// Flush the Langfuse client belonging to the parent span +await langfuse.flushAsync(); ``` - Why couldn't the bicycle stand up by itself? Because it was two tired! - - ## Step 3: Score the Trace (Optional) After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. @@ -212,3 +223,9 @@ langfuse.score({ comment: "This was a good interaction", }); ``` + +## Step 4: View the Trace in Langfuse + +![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) + +[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details). From 01d59d30ea7ea9cdfc4d609a25db4b78b6e9cefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= Date: Tue, 3 Dec 2024 18:58:53 +0100 Subject: [PATCH 06/16] remove image --- public/images/docs/js-any-llm-cookbook.png | Bin 139050 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/docs/js-any-llm-cookbook.png diff --git a/public/images/docs/js-any-llm-cookbook.png b/public/images/docs/js-any-llm-cookbook.png deleted file mode 100644 index 999e2405db857d41ca13ff7da987a3664b0660e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139050 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�al=6_nO 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 Date: Wed, 4 Dec 2024 00:34:25 +0100 Subject: [PATCH 07/16] push cookbook --- pages/guides/cookbook/js_langfuse_sdk.md | 231 +++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 pages/guides/cookbook/js_langfuse_sdk.md diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md new file mode 100644 index 000000000..f640a4d53 --- /dev/null +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -0,0 +1,231 @@ +--- +description: Learn how to use the Langfuse JS/TS SDK to log any LLM. +category: Integrations +--- + +# Cookbook: Langfuse JS/TS SDK + +JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. + +For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). + +## Step 1: Setup + +*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.* + +Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. + + +```typescript +// Set env variables, Deno-specific syntax +Deno.env.set("OPENAI_API_KEY", "sk-..."); + +Deno.env.set("ANTHROPIC_API_KEY", "sk-..."); + +Deno.env.set("LANGFUSE_SECRET_KEY", "sk-..."); +Deno.env.set("LANGFUSE_PUBLIC_KEY", "pk-..."); +Deno.env.set("LANGFUSE_HOST", "https://cloud.langfuse.com") // For US data region, set this to "https://us.cloud.langfuse.com" +``` + +Initialize the Langfuse client. + + +```typescript +import Langfuse from "npm:langfuse"; + +// Init Langfuse SDK +const langfuse = new Langfuse(); +``` + +## Step 2: Create a Trace + +Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. + +To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. + + + +```typescript +// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. +import { v4 as uuidv4 } from "npm:uuid"; + +const traceId = uuidv4(); +``` + + +```typescript +// Creation of the trace and assignment of metadata +const trace = langfuse.trace({ + id: traceId, + name: "JS-SDK-Trace", + userId: "user_123456789", + metadata: { user: "user@langfuse.com" }, + tags: ["production"], +}); + +// Example update, same params as create, cannot change id +trace.update({ + metadata: { + tag: "long-running", + }, +}); +``` + +## Option 1: Log Any LLM + +This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). + +We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace. + +We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. + +Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI. + + +```typescript +const msg = "Hello, Claude"; + +// Create span +const span_name = "Anthropic-Span"; +const span = trace.span({ name: span_name }); + +// Example generation creation +const generation = span.generation({ + name: "anthropic-generation01", + model: "claude-3-5-sonnet-20241022", + input: msg, +}); + +// Application code +import Anthropic from "npm:@anthropic-ai/sdk"; + +const anthropic = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY") }); + +const chatCompletion = await anthropic.messages.create({ + model: "claude-3-5-sonnet-20241022", + max_tokens: 1024, + messages: [{ role: "user", content: msg }], +}); + + +// Example end - sets endTime, optionally pass a body +generation.end({ + output: chatCompletion.content[0].text, + usage: { + input: chatCompletion.usage.input_tokens, + output: chatCompletion.usage.output_tokens, + }, +}); + +// End span to get span-level latencies +span.end(); + +console.log(chatCompletion.content[0].text); + +``` + + Hello! How can I help you today? + + +## Option 2: Using LangChain + +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`. + + +```typescript +// Create span +const span_name = "Langchain-Span"; +const span = trace.span({ name: span_name }); + +import { CallbackHandler } from "npm:langfuse-langchain" +const langfuseLangchainHandler = new CallbackHandler({ + root: span, + publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), + secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), + baseUrl: Deno.env.get("LANGFUSE_HOST"), + flushAt: 1 // cookbook-only: do not batch events, send them immediately +}) + +import { ChatOpenAI } from "npm:@langchain/openai" +import { PromptTemplate } from "npm:@langchain/core/prompts" + +const model = new ChatOpenAI({}); +const promptTemplate = PromptTemplate.fromTemplate( + "Tell me a joke about {topic}" +); + +import { RunnableSequence } from "npm:@langchain/core/runnables"; + +const chain = RunnableSequence.from([promptTemplate, model]); + +const res = await chain.invoke( + { topic: "bears" }, + { callbacks: [langfuseLangchainHandler] } +); + +// End span to get span-level latencies +span.end(); + +console.log(res.content) +``` + + Why did the bear break up with his girlfriend? + + Because she was too grizzly for him! + + +## Option 3: Using OpenAI + +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function. + + + +```typescript +// Initialize SDKs +const openai = new OpenAI(); + +// Create span +const span_name = "OpenAI-Span"; +const span = trace.span({ name: span_name }); + +// Call OpenAI +const joke = ( + await observeOpenAI(openai, { + parent: span, + generationName: "OpenAI-Generation", + }).chat.completions.create({ + model: "gpt-3.5-turbo", + messages: [ + { role: "system", content: "Tell me a joke." }, + ], + }) +).choices[0].message.content; + +// End span to get span-level latencies +span.end(); + +// Flush the Langfuse client belonging to the parent span +await langfuse.flushAsync(); +``` + +## Step 3: Score the Trace (Optional) + +After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. + +Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. + + +```typescript +langfuse.score({ + id: traceId, + name: "user-feedback", + value: 3, + comment: "This was a good interaction", +}); +``` + +## Step 4: View the Trace in Langfuse + +![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) + +[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details). From 0609a9aad43fd4e8bcf3942e46985ded3f3d1fb5 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 00:47:36 +0100 Subject: [PATCH 08/16] add example and cross references across docs --- components-mdx/get-started-js-sdk.mdx | 28 +++++++++++++++++++++++ pages/docs/get-started.mdx | 32 +++------------------------ pages/docs/sdk/python/decorators.mdx | 2 +- pages/docs/sdk/typescript/guide.mdx | 13 +++++++++-- 4 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 components-mdx/get-started-js-sdk.mdx diff --git a/components-mdx/get-started-js-sdk.mdx b/components-mdx/get-started-js-sdk.mdx new file mode 100644 index 000000000..dee49aa13 --- /dev/null +++ b/components-mdx/get-started-js-sdk.mdx @@ -0,0 +1,28 @@ +```ts filename="server.ts" +import { Langfuse } from "langfuse"; + +const langfuse = new Langfuse(); + +const trace = langfuse.trace({ + name: "my-AI-application-endpoint", +}); + +// Example generation creation +const generation = trace.generation({ + name: "chat-completion", + model: "gpt-3.5-turbo", + modelParameters: { + temperature: 0.9, + maxTokens: 2000, + }, + input: messages, +}); + +// Application code +const chatCompletion = await llm.respond(prompt); + +// End generation - sets endTime +generation.end({ + output: chatCompletion, +}); +``` diff --git a/pages/docs/get-started.mdx b/pages/docs/get-started.mdx index 4d1f66fbb..80291fe13 100644 --- a/pages/docs/get-started.mdx +++ b/pages/docs/get-started.mdx @@ -18,6 +18,7 @@ If you are looking for other features, see the [overview](/docs). import GetStartedLangchainPythonArgs from "@/components-mdx/get-started-langchain-python-constructor-args.mdx"; import GetStartedLangchainJsArgs from "@/components-mdx/get-started-langchain-js-constructor-args.mdx"; +import GetStartedJsSdk from "@/components-mdx/get-started-js-sdk.mdx"; import GetStartedLlamaindexPythonArgs from "@/components-mdx/get-started-llamaindex-python-constructor-args.mdx"; import EnvPython from "@/components-mdx/env-python.mdx"; import EnvJs from "@/components-mdx/env-js.mdx"; @@ -73,36 +74,9 @@ import { Langfuse } from "https://esm.sh/langfuse" -Example usage, most of the parameters are optional and depend on the use case. For more information, see the [typescript SDK docs](/docs/sdk/typescript/guide). +Example usage, most of the parameters are optional and depend on the use case. For more information, see the [JS/TS SDK docs](/docs/sdk/typescript/guide) or [end-to-end example notebook](/docs/sdk/typescript/example-notebook). -```ts filename="server.ts" -import { Langfuse } from "langfuse"; - -const langfuse = new Langfuse(); - -const trace = langfuse.trace({ - name: "my-AI-application-endpoint", -}); - -// Example generation creation -const generation = trace.generation({ - name: "chat-completion", - model: "gpt-3.5-turbo", - modelParameters: { - temperature: 0.9, - maxTokens: 2000, - }, - input: messages, -}); - -// Application code -const chatCompletion = await llm.respond(prompt); - -// End generation - sets endTime -generation.end({ - output: chatCompletion, -}); -``` + diff --git a/pages/docs/sdk/python/decorators.mdx b/pages/docs/sdk/python/decorators.mdx index 243c02127..2879a3c9a 100644 --- a/pages/docs/sdk/python/decorators.mdx +++ b/pages/docs/sdk/python/decorators.mdx @@ -22,7 +22,7 @@ Want more control over the traces logged to Langfuse? Check out the [low-level P ## Example -_Simple example (decorator + openai integration)_ +Simple example (decorator + OpenAI integration) from the [end-to-end example notebook](/docs/sdk/python/example): import GetStarted from "@/components-mdx/get-started-python-decorator-openai.mdx"; diff --git a/pages/docs/sdk/typescript/guide.mdx b/pages/docs/sdk/typescript/guide.mdx index c1a5527ef..ea12a3b84 100644 --- a/pages/docs/sdk/typescript/guide.mdx +++ b/pages/docs/sdk/typescript/guide.mdx @@ -33,7 +33,7 @@ import { Callout } from "nextra/components"; -If you are working with Node.js, Deno, or Edge functions, the `langfuse` library is the simplest way to integrate Langfuse into your application. The library queues calls to make them non-blocking. +If you are working with Node.js, Deno, or Edge functions, the `langfuse` library is the simplest way to integrate [Langfuse Tracing](/docs/tracing) into your application. The library queues calls to make them non-blocking. Supported runtimes: @@ -41,8 +41,17 @@ Supported runtimes: - [x] Edge: Vercel, Cloudflare, ... - [x] Deno -Want to capture data (e.g. user feedback) from the browser? Use [LangfuseWeb](/docs/sdk/typescript/guide-web) +Want to capture data (e.g. user feedback) from the browser? Use [`LangfuseWeb`](/docs/sdk/typescript/guide-web). +Before getting started, please read the conceptual introduction to [tracing](/docs/tracing). + +## Example + +Simple example from the [end-to-end example notebook](/docs/sdk/typescript/example-notebook): + +import GetStartedJsSdk from "@/components-mdx/get-started-js-sdk.mdx"; + + ## Installation ```sh From 762b404f8cafd3c79b529c535d8722a25c809853 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 00:51:50 +0100 Subject: [PATCH 09/16] improve introduction --- cookbook/js_langfuse_sdk.ipynb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index 9df80a68f..d401a24d3 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -12,9 +12,16 @@ "\n", "# Cookbook: Langfuse JS/TS SDK\n", "\n", - "JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started.\n", + "JS/TS applications can either be traced via the [low-level Langfuse JS/TS SDK](https://langfuse.com/docs/sdk/typescript/guide), or by using one of the native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk).\n", "\n", - "For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). " + "In this notebook, we will walk you through a simple examples that:\n", + "- uses the core features of the Langfuse JS/TS SDK\n", + "- shows how to log any LLM call using the example of Anthropic\n", + "- use integrations that are interoperable with low-level SDK\n", + " - Langchain integration \n", + " - OpenAI integration\n", + "\n", + "For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing." ] }, { From 671cd516b20ccc8928803a1ee50adcb575d4cc70 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:11:19 +0100 Subject: [PATCH 10/16] notebook edits --- cookbook/js_langfuse_sdk.ipynb | 147 +++++++++++------- pages/docs/sdk/typescript/example-notebook.md | 135 +++++++++------- pages/guides/cookbook/js_langfuse_sdk.md | 135 +++++++++------- 3 files changed, 256 insertions(+), 161 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index d401a24d3..95f0a97b4 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -14,14 +14,19 @@ "\n", "JS/TS applications can either be traced via the [low-level Langfuse JS/TS SDK](https://langfuse.com/docs/sdk/typescript/guide), or by using one of the native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk).\n", "\n", - "In this notebook, we will walk you through a simple examples that:\n", - "- uses the core features of the Langfuse JS/TS SDK\n", - "- shows how to log any LLM call using the example of Anthropic\n", - "- use integrations that are interoperable with low-level SDK\n", + "In this notebook, we will walk you through a **simple end-to-end example** that:\n", + "\n", + "- Uses the core features of the Langfuse JS/TS SDK\n", + "- Shows how to log any LLM call via the low-level SDK\n", + "- Uses integrations that are interoperable with low-level SDK\n", " - Langchain integration \n", " - OpenAI integration\n", "\n", - "For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing." + "For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing.\n", + "\n", + "[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) that we will create in this notebook:\n", + "\n", + "![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif)" ] }, { @@ -33,7 +38,9 @@ "\n", "*Note: This cookbook uses Deno.js, which requires different syntax for importing packages and setting environment variables.*\n", "\n", - "Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers." + "Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers.\n", + "\n", + "See [SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) for more details on how to initialize the SDK." ] }, { @@ -83,7 +90,7 @@ "\n", "Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. \n", "\n", - "To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags.\n" + "To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. The tracing documentation includes more details on all trace features." ] }, { @@ -93,7 +100,9 @@ "metadata": {}, "outputs": [], "source": [ - "// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. \n", + "// Creation of a unique trace id.\n", + "// It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. \n", + "\n", "import { v4 as uuidv4 } from \"npm:uuid\";\n", "\n", "const traceId = uuidv4();" @@ -118,7 +127,7 @@ "// Example update, same params as create, cannot change id\n", "trace.update({\n", " metadata: {\n", - " tag: \"long-running\",\n", + " foo: \"bar\",\n", " },\n", "});" ] @@ -128,15 +137,24 @@ "id": "17ad59cb", "metadata": {}, "source": [ - "## Option 1: Log Any LLM\n", + "## Step 3: Log LLM Calls\n", + "\n", + "You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it.\n", "\n", - "This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide).\n", + "In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations.\n", "\n", - "We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace.\n", + "### Option 1: Log Any LLM with low-level Langfuse SDK\n", "\n", - "We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK.\n", + "This part shows how to log any LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide).\n", "\n", - "Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI." + "Steps:\n", + "\n", + "1. Create span to contain this section within the trace\n", + "2. Create generation, log input and model name as it is already known\n", + "3. Call the LLM SDK and log the output\n", + "4. End generation and span\n", + "\n", + "Teams typically wrap their LLM SDK calls in a helper function that manages tracing internally. This implementation occurs once and is then reused for all LLM calls." ] }, { @@ -154,31 +172,30 @@ } ], "source": [ + "import Anthropic from \"npm:@anthropic-ai/sdk\";\n", + "\n", "const msg = \"Hello, Claude\";\n", "\n", - "// Create span\n", + "// 1. Create wrapper span\n", "const span_name = \"Anthropic-Span\";\n", "const span = trace.span({ name: span_name });\n", "\n", - "// Example generation creation\n", + "// 2. Create generation, log input and model name as it is already known\n", "const generation = span.generation({\n", " name: \"anthropic-generation01\",\n", " model: \"claude-3-5-sonnet-20241022\",\n", " input: msg,\n", "});\n", " \n", - "// Application code\n", - "import Anthropic from \"npm:@anthropic-ai/sdk\";\n", - "\n", + "// 3. Call the LLM SDK and log the output\n", "const anthropic = new Anthropic({ apiKey: Deno.env.get(\"ANTHROPIC_API_KEY\") });\n", - "\n", "const chatCompletion = await anthropic.messages.create({\n", " model: \"claude-3-5-sonnet-20241022\",\n", " max_tokens: 1024,\n", " messages: [{ role: \"user\", content: msg }],\n", "});\n", " \n", - "\n", + "// 4. End generation and span\n", "// Example end - sets endTime, optionally pass a body\n", "generation.end({\n", " output: chatCompletion.content[0].text,\n", @@ -187,11 +204,10 @@ " output: chatCompletion.usage.output_tokens,\n", " },\n", "});\n", - "\n", "// End span to get span-level latencies\n", "span.end();\n", "\n", - "console.log(chatCompletion.content[0].text);\n" + "console.log(chatCompletion.content[0].text);" ] }, { @@ -199,9 +215,18 @@ "id": "a44200d4", "metadata": {}, "source": [ - "## Option 2: Using LangChain\n", + "### Option 2: Using LangChain\n", + "\n", + "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK.\n", + "\n", + "Since this is a native integration, the model parameters and outputs are automatically captured.\n", "\n", - "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`." + "Steps:\n", + "\n", + "1. Create wrapper span to contain this section within the trace\n", + "2. Create Langchain handler scoped to this span by passing `root`\n", + "3. Pass handler to Langchain to natively capture Langchain traces\n", + "4. End wrapper span to get span-level latencies" ] }, { @@ -221,37 +246,30 @@ } ], "source": [ - "// Create span\n", + "import { CallbackHandler } from \"npm:langfuse-langchain\"\n", + "import { ChatOpenAI } from \"npm:@langchain/openai\"\n", + "import { PromptTemplate } from \"npm:@langchain/core/prompts\"\n", + "import { RunnableSequence } from \"npm:@langchain/core/runnables\";\n", + "\n", + "// 1. Create wrapper span\n", "const span_name = \"Langchain-Span\";\n", "const span = trace.span({ name: span_name });\n", "\n", - "import { CallbackHandler } from \"npm:langfuse-langchain\"\n", - "const langfuseLangchainHandler = new CallbackHandler({\n", - " root: span,\n", - " publicKey: Deno.env.get(\"LANGFUSE_PUBLIC_KEY\"),\n", - " secretKey: Deno.env.get(\"LANGFUSE_SECRET_KEY\"),\n", - " baseUrl: Deno.env.get(\"LANGFUSE_HOST\"),\n", - " flushAt: 1 // cookbook-only: do not batch events, send them immediately\n", - "})\n", + "// 2. Create Langchain handler scoped to this span\n", + "const langfuseLangchainHandler = new CallbackHandler({root: span})\n", "\n", - "import { ChatOpenAI } from \"npm:@langchain/openai\"\n", - "import { PromptTemplate } from \"npm:@langchain/core/prompts\"\n", - " \n", + "// 3. Pass handler to Langchain to natively capture Langchain traces\n", "const model = new ChatOpenAI({});\n", "const promptTemplate = PromptTemplate.fromTemplate(\n", " \"Tell me a joke about {topic}\"\n", ");\n", - "\n", - "import { RunnableSequence } from \"npm:@langchain/core/runnables\";\n", - " \n", "const chain = RunnableSequence.from([promptTemplate, model]);\n", - " \n", "const res = await chain.invoke(\n", " { topic: \"bears\" },\n", - " { callbacks: [langfuseLangchainHandler] }\n", + " { callbacks: [langfuseLangchainHandler] } // Pass handler to Langchain\n", ");\n", "\n", - "// End span to get span-level latencies\n", + "// 4. End wrapper span to get span-level latencies\n", "span.end();\n", " \n", "console.log(res.content)" @@ -262,9 +280,16 @@ "id": "33e61e01", "metadata": {}, "source": [ - "## Option 3: Using OpenAI\n", + "### Option 3: Using OpenAI\n", + "\n", + "This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started) which is interoperable with the Langfuse SDK. \n", "\n", - "This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function.\n" + "Since this is a native integration, the model parameters and outputs are automatically captured.\n", + "\n", + "Steps:\n", + "1. Create wrapper span to contain this section within the trace\n", + "2. Call OpenAI and pass `parent` to the `observeOpenAI` function\n", + "3. End wrapper span to get span-level latencies" ] }, { @@ -277,11 +302,11 @@ "// Initialize SDKs\n", "const openai = new OpenAI();\n", " \n", - "// Create span\n", + "// 1. Create wrapper span\n", "const span_name = \"OpenAI-Span\";\n", "const span = trace.span({ name: span_name });\n", " \n", - "// Call OpenAI\n", + "// 2. Call OpenAI and pass `parent` to the `observeOpenAI` function to nest the generation within the span\n", "const joke = (\n", " await observeOpenAI(openai, {\n", " parent: span,\n", @@ -294,11 +319,8 @@ " })\n", ").choices[0].message.content;\n", " \n", - "// End span to get span-level latencies\n", - "span.end();\n", - " \n", - "// Flush the Langfuse client belonging to the parent span\n", - "await langfuse.flushAsync();" + "// 3. End wrapper span to get span-level latencies\n", + "span.end();" ] }, { @@ -306,11 +328,11 @@ "id": "29e44ef4", "metadata": {}, "source": [ - "## Step 3: Score the Trace (Optional)\n", + "## Step 4: Score the Trace (Optional)\n", "\n", "After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback.\n", "\n", - "Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace." + "Since the scoring usually happens after the generation is complete, we use the user-defined trace id to score the trace." ] }, { @@ -333,7 +355,7 @@ "id": "ab1dbbd5", "metadata": {}, "source": [ - "## Step 4: View the Trace in Langfuse" + "## Step 5: View the Trace in Langfuse" ] }, { @@ -341,9 +363,20 @@ "id": "fc8185af", "metadata": {}, "source": [ - "![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif)\n", + "[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) in the Langfuse UI.\n", + "\n", + "![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif)" + ] + }, + { + "cell_type": "markdown", + "id": "5015c149", + "metadata": {}, + "source": [ + "## Learn More\n", "\n", - "[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details)." + "- [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide)\n", + "- [Langfuse Integrations](https://langfuse.com/docs/integrations)" ] } ], diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index f640a4d53..0e6e9e439 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -5,9 +5,21 @@ category: Integrations # Cookbook: Langfuse JS/TS SDK -JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. +JS/TS applications can either be traced via the [low-level Langfuse JS/TS SDK](https://langfuse.com/docs/sdk/typescript/guide), or by using one of the native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). -For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). +In this notebook, we will walk you through a **simple end-to-end example** that: + +- Uses the core features of the Langfuse JS/TS SDK +- Shows how to log any LLM call via the low-level SDK +- Uses integrations that are interoperable with low-level SDK + - Langchain integration + - OpenAI integration + +For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing. + +[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) that we will create in this notebook: + +![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) ## Step 1: Setup @@ -15,6 +27,8 @@ For this guide, we assume, that you are already familiar with the Langfuse data Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. +See [SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) for more details on how to initialize the SDK. + ```typescript // Set env variables, Deno-specific syntax @@ -41,12 +55,13 @@ const langfuse = new Langfuse(); Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. -To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. - +To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. The tracing documentation includes more details on all trace features. ```typescript -// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. +// Creation of a unique trace id. +// It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. + import { v4 as uuidv4 } from "npm:uuid"; const traceId = uuidv4(); @@ -66,48 +81,56 @@ const trace = langfuse.trace({ // Example update, same params as create, cannot change id trace.update({ metadata: { - tag: "long-running", + foo: "bar", }, }); ``` -## Option 1: Log Any LLM +## Step 3: Log LLM Calls + +You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it. + +In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations. + +### Option 1: Log Any LLM with low-level Langfuse SDK -This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). +This part shows how to log any LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). -We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace. +Steps: -We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. +1. Create span to contain this section within the trace +2. Create generation, log input and model name as it is already known +3. Call the LLM SDK and log the output +4. End generation and span -Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI. +Teams typically wrap their LLM SDK calls in a helper function that manages tracing internally. This implementation occurs once and is then reused for all LLM calls. ```typescript +import Anthropic from "npm:@anthropic-ai/sdk"; + const msg = "Hello, Claude"; -// Create span +// 1. Create wrapper span const span_name = "Anthropic-Span"; const span = trace.span({ name: span_name }); -// Example generation creation +// 2. Create generation, log input and model name as it is already known const generation = span.generation({ name: "anthropic-generation01", model: "claude-3-5-sonnet-20241022", input: msg, }); -// Application code -import Anthropic from "npm:@anthropic-ai/sdk"; - +// 3. Call the LLM SDK and log the output const anthropic = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY") }); - const chatCompletion = await anthropic.messages.create({ model: "claude-3-5-sonnet-20241022", max_tokens: 1024, messages: [{ role: "user", content: msg }], }); - +// 4. End generation and span // Example end - sets endTime, optionally pass a body generation.end({ output: chatCompletion.content[0].text, @@ -116,54 +139,54 @@ generation.end({ output: chatCompletion.usage.output_tokens, }, }); - // End span to get span-level latencies span.end(); console.log(chatCompletion.content[0].text); - ``` Hello! How can I help you today? -## Option 2: Using LangChain +### Option 2: Using LangChain + +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK. + +Since this is a native integration, the model parameters and outputs are automatically captured. -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`. +Steps: + +1. Create wrapper span to contain this section within the trace +2. Create Langchain handler scoped to this span by passing `root` +3. Pass handler to Langchain to natively capture Langchain traces +4. End wrapper span to get span-level latencies ```typescript -// Create span +import { CallbackHandler } from "npm:langfuse-langchain" +import { ChatOpenAI } from "npm:@langchain/openai" +import { PromptTemplate } from "npm:@langchain/core/prompts" +import { RunnableSequence } from "npm:@langchain/core/runnables"; + +// 1. Create wrapper span const span_name = "Langchain-Span"; const span = trace.span({ name: span_name }); -import { CallbackHandler } from "npm:langfuse-langchain" -const langfuseLangchainHandler = new CallbackHandler({ - root: span, - publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), - secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), - baseUrl: Deno.env.get("LANGFUSE_HOST"), - flushAt: 1 // cookbook-only: do not batch events, send them immediately -}) +// 2. Create Langchain handler scoped to this span +const langfuseLangchainHandler = new CallbackHandler({root: span}) -import { ChatOpenAI } from "npm:@langchain/openai" -import { PromptTemplate } from "npm:@langchain/core/prompts" - +// 3. Pass handler to Langchain to natively capture Langchain traces const model = new ChatOpenAI({}); const promptTemplate = PromptTemplate.fromTemplate( "Tell me a joke about {topic}" ); - -import { RunnableSequence } from "npm:@langchain/core/runnables"; - const chain = RunnableSequence.from([promptTemplate, model]); - const res = await chain.invoke( { topic: "bears" }, - { callbacks: [langfuseLangchainHandler] } + { callbacks: [langfuseLangchainHandler] } // Pass handler to Langchain ); -// End span to get span-level latencies +// 4. End wrapper span to get span-level latencies span.end(); console.log(res.content) @@ -174,21 +197,27 @@ console.log(res.content) Because she was too grizzly for him! -## Option 3: Using OpenAI +### Option 3: Using OpenAI -This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function. +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started) which is interoperable with the Langfuse SDK. +Since this is a native integration, the model parameters and outputs are automatically captured. + +Steps: +1. Create wrapper span to contain this section within the trace +2. Call OpenAI and pass `parent` to the `observeOpenAI` function +3. End wrapper span to get span-level latencies ```typescript // Initialize SDKs const openai = new OpenAI(); -// Create span +// 1. Create wrapper span const span_name = "OpenAI-Span"; const span = trace.span({ name: span_name }); -// Call OpenAI +// 2. Call OpenAI and pass `parent` to the `observeOpenAI` function to nest the generation within the span const joke = ( await observeOpenAI(openai, { parent: span, @@ -201,18 +230,15 @@ const joke = ( }) ).choices[0].message.content; -// End span to get span-level latencies +// 3. End wrapper span to get span-level latencies span.end(); - -// Flush the Langfuse client belonging to the parent span -await langfuse.flushAsync(); ``` -## Step 3: Score the Trace (Optional) +## Step 4: Score the Trace (Optional) After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. -Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. +Since the scoring usually happens after the generation is complete, we use the user-defined trace id to score the trace. ```typescript @@ -224,8 +250,13 @@ langfuse.score({ }); ``` -## Step 4: View the Trace in Langfuse +## Step 5: View the Trace in Langfuse + +[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) in the Langfuse UI. ![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) -[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details). +## Learn More + +- [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) +- [Langfuse Integrations](https://langfuse.com/docs/integrations) diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md index f640a4d53..0e6e9e439 100644 --- a/pages/guides/cookbook/js_langfuse_sdk.md +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -5,9 +5,21 @@ category: Integrations # Cookbook: Langfuse JS/TS SDK -JS/TS applications can either be traces via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide) by wrapping any LLM model, or by using one of our native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain/example-javascript) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). In this cookbook, we show you both methods to get you started. +JS/TS applications can either be traced via the [low-level Langfuse JS/TS SDK](https://langfuse.com/docs/sdk/typescript/guide), or by using one of the native integrations such as [OpenAI](https://langfuse.com/docs/integrations/openai/js/get-started), [LangChain](https://langfuse.com/docs/integrations/langchain) or [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk). -For this guide, we assume, that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, have a look [here](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). +In this notebook, we will walk you through a **simple end-to-end example** that: + +- Uses the core features of the Langfuse JS/TS SDK +- Shows how to log any LLM call via the low-level SDK +- Uses integrations that are interoperable with low-level SDK + - Langchain integration + - OpenAI integration + +For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing. + +[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) that we will create in this notebook: + +![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) ## Step 1: Setup @@ -15,6 +27,8 @@ For this guide, we assume, that you are already familiar with the Langfuse data Set your Langfuse API keys, the Langfuse host name and keys for the used LLM providers. +See [SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) for more details on how to initialize the SDK. + ```typescript // Set env variables, Deno-specific syntax @@ -41,12 +55,13 @@ const langfuse = new Langfuse(); Langfuse observability is structured around [traces](https://langfuse.com/docs/tracing#introduction-to-observability--traces-in-langfuse). Each trace can contain multiple observations to log the individual steps of the execution. Observation can be `Events`, the basic building blocks which are used to track discrete events in a trace, `Spans`, representing durations of units of work in a trace, or `Generations`, used to log model calls. -To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. - +To log an LLM call, we will first create a trace. In this step, we can also assign the trace metadata such as the a user id or tags. The tracing documentation includes more details on all trace features. ```typescript -// Creation of a unique trace id. It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. +// Creation of a unique trace id. +// It is optional, but this makes it easier for us to score the trace (add user feedback, etc.) afterwards. + import { v4 as uuidv4 } from "npm:uuid"; const traceId = uuidv4(); @@ -66,48 +81,56 @@ const trace = langfuse.trace({ // Example update, same params as create, cannot change id trace.update({ metadata: { - tag: "long-running", + foo: "bar", }, }); ``` -## Option 1: Log Any LLM +## Step 3: Log LLM Calls + +You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it. + +In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations. + +### Option 1: Log Any LLM with low-level Langfuse SDK -This part shows how to log an LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). +This part shows how to log any LLM call by passing the model in and outputs via the [Langfuse SDK](https://langfuse.com/docs/sdk/typescript/guide). -We first create an observation of the type `Span` to which we assign the `Generation` observation. This setp is optional but lets us structure the trace. +Steps: -We then create a observation of the type `Generation` which will be assigned to the `Span` we created earlier. In the second step, we use the Anthropic SDK to call the Clause 3.5 Sonnet model. This step can be replaced with any other LLM SDK. +1. Create span to contain this section within the trace +2. Create generation, log input and model name as it is already known +3. Call the LLM SDK and log the output +4. End generation and span -Lastly, we pass the model output, the mode name and usage metrics to the `Generation`. We can now see this trace in the Langfuse UI. +Teams typically wrap their LLM SDK calls in a helper function that manages tracing internally. This implementation occurs once and is then reused for all LLM calls. ```typescript +import Anthropic from "npm:@anthropic-ai/sdk"; + const msg = "Hello, Claude"; -// Create span +// 1. Create wrapper span const span_name = "Anthropic-Span"; const span = trace.span({ name: span_name }); -// Example generation creation +// 2. Create generation, log input and model name as it is already known const generation = span.generation({ name: "anthropic-generation01", model: "claude-3-5-sonnet-20241022", input: msg, }); -// Application code -import Anthropic from "npm:@anthropic-ai/sdk"; - +// 3. Call the LLM SDK and log the output const anthropic = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY") }); - const chatCompletion = await anthropic.messages.create({ model: "claude-3-5-sonnet-20241022", max_tokens: 1024, messages: [{ role: "user", content: msg }], }); - +// 4. End generation and span // Example end - sets endTime, optionally pass a body generation.end({ output: chatCompletion.content[0].text, @@ -116,54 +139,54 @@ generation.end({ output: chatCompletion.usage.output_tokens, }, }); - // End span to get span-level latencies span.end(); console.log(chatCompletion.content[0].text); - ``` Hello! How can I help you today? -## Option 2: Using LangChain +### Option 2: Using LangChain + +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK. + +Since this is a native integration, the model parameters and outputs are automatically captured. -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript). Since this is a native integration, the model parameters and outputs are automatically captured. We create a new span in our trace and assign the Langchain generation to it by passing `root: span` in the `CallbackHandler`. +Steps: + +1. Create wrapper span to contain this section within the trace +2. Create Langchain handler scoped to this span by passing `root` +3. Pass handler to Langchain to natively capture Langchain traces +4. End wrapper span to get span-level latencies ```typescript -// Create span +import { CallbackHandler } from "npm:langfuse-langchain" +import { ChatOpenAI } from "npm:@langchain/openai" +import { PromptTemplate } from "npm:@langchain/core/prompts" +import { RunnableSequence } from "npm:@langchain/core/runnables"; + +// 1. Create wrapper span const span_name = "Langchain-Span"; const span = trace.span({ name: span_name }); -import { CallbackHandler } from "npm:langfuse-langchain" -const langfuseLangchainHandler = new CallbackHandler({ - root: span, - publicKey: Deno.env.get("LANGFUSE_PUBLIC_KEY"), - secretKey: Deno.env.get("LANGFUSE_SECRET_KEY"), - baseUrl: Deno.env.get("LANGFUSE_HOST"), - flushAt: 1 // cookbook-only: do not batch events, send them immediately -}) +// 2. Create Langchain handler scoped to this span +const langfuseLangchainHandler = new CallbackHandler({root: span}) -import { ChatOpenAI } from "npm:@langchain/openai" -import { PromptTemplate } from "npm:@langchain/core/prompts" - +// 3. Pass handler to Langchain to natively capture Langchain traces const model = new ChatOpenAI({}); const promptTemplate = PromptTemplate.fromTemplate( "Tell me a joke about {topic}" ); - -import { RunnableSequence } from "npm:@langchain/core/runnables"; - const chain = RunnableSequence.from([promptTemplate, model]); - const res = await chain.invoke( { topic: "bears" }, - { callbacks: [langfuseLangchainHandler] } + { callbacks: [langfuseLangchainHandler] } // Pass handler to Langchain ); -// End span to get span-level latencies +// 4. End wrapper span to get span-level latencies span.end(); console.log(res.content) @@ -174,21 +197,27 @@ console.log(res.content) Because she was too grizzly for him! -## Option 3: Using OpenAI +### Option 3: Using OpenAI -This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started). Since this is a native integration, the model parameters and outputs are automatically captured. To add the OpenAI generation to our trace as well, we first create a span and then pass `parent: span` in the `observeOpenAI` function. +This step shows how to trace OpenAI applications using the [OpenAI integration](https://langfuse.com/docs/integrations/openai/js/get-started) which is interoperable with the Langfuse SDK. +Since this is a native integration, the model parameters and outputs are automatically captured. + +Steps: +1. Create wrapper span to contain this section within the trace +2. Call OpenAI and pass `parent` to the `observeOpenAI` function +3. End wrapper span to get span-level latencies ```typescript // Initialize SDKs const openai = new OpenAI(); -// Create span +// 1. Create wrapper span const span_name = "OpenAI-Span"; const span = trace.span({ name: span_name }); -// Call OpenAI +// 2. Call OpenAI and pass `parent` to the `observeOpenAI` function to nest the generation within the span const joke = ( await observeOpenAI(openai, { parent: span, @@ -201,18 +230,15 @@ const joke = ( }) ).choices[0].message.content; -// End span to get span-level latencies +// 3. End wrapper span to get span-level latencies span.end(); - -// Flush the Langfuse client belonging to the parent span -await langfuse.flushAsync(); ``` -## Step 3: Score the Trace (Optional) +## Step 4: Score the Trace (Optional) After logging the trace, we can add [scores](https://langfuse.com/docs/scores/custom) to it. This can help in evaluating the quality of the interaction. Scores can be any metric that is important to your application. In this example, we are scoring the trace based on user feedback. -Since the scoring usually happens after the generation is complete, we use our unique trace id to score the trace. +Since the scoring usually happens after the generation is complete, we use the user-defined trace id to score the trace. ```typescript @@ -224,8 +250,13 @@ langfuse.score({ }); ``` -## Step 4: View the Trace in Langfuse +## Step 5: View the Trace in Langfuse + +[Example trace](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details) in the Langfuse UI. ![Example trace with the three generations](https://static.langfuse.com/cookbooks/js-sdk-example/js-sdk-example.gif) -[Example trace in the Langfuse UI](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/8d580443-519e-4713-9859-eff4a7193f87?timestamp=2024-12-03T17%3A45%3A16.787Z&observation=26ff69ed-8ba8-4bfe-9029-14a179828044&display=details). +## Learn More + +- [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) +- [Langfuse Integrations](https://langfuse.com/docs/integrations) From 8badda338611141acd3bdf0493547b03fd4f711f Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:12:24 +0100 Subject: [PATCH 11/16] seo description --- cookbook/js_langfuse_sdk.ipynb | 2 +- pages/docs/sdk/typescript/example-notebook.md | 2 +- pages/guides/cookbook/js_langfuse_sdk.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index 95f0a97b4..b772436d2 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "---\n", - "description: Learn how to use the Langfuse JS/TS SDK to log any LLM.\n", + "description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain.\n", "category: Integrations\n", "---\n", "\n", diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index 0e6e9e439..392d0e236 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -1,5 +1,5 @@ --- -description: Learn how to use the Langfuse JS/TS SDK to log any LLM. +description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain. category: Integrations --- diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md index 0e6e9e439..392d0e236 100644 --- a/pages/guides/cookbook/js_langfuse_sdk.md +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -1,5 +1,5 @@ --- -description: Learn how to use the Langfuse JS/TS SDK to log any LLM. +description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain. category: Integrations --- From af3b019b652f3c0f31bcbd8f0795adc687b8caa6 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:13:14 +0100 Subject: [PATCH 12/16] fix link --- cookbook/js_langfuse_sdk.ipynb | 2 +- pages/docs/sdk/typescript/example-notebook.md | 2 +- pages/guides/cookbook/js_langfuse_sdk.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index b772436d2..38754d087 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -217,7 +217,7 @@ "source": [ "### Option 2: Using LangChain\n", "\n", - "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK.\n", + "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK.\n", "\n", "Since this is a native integration, the model parameters and outputs are automatically captured.\n", "\n", diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index 392d0e236..12b7d3b44 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -150,7 +150,7 @@ console.log(chatCompletion.content[0].text); ### Option 2: Using LangChain -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK. +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. Since this is a native integration, the model parameters and outputs are automatically captured. diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md index 392d0e236..12b7d3b44 100644 --- a/pages/guides/cookbook/js_langfuse_sdk.md +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -150,7 +150,7 @@ console.log(chatCompletion.content[0].text); ### Option 2: Using LangChain -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/example-javascript) which is fully interoperable with the Langfuse SDK. +This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. Since this is a native integration, the model parameters and outputs are automatically captured. From b18a3cd62d8c75e7183c0efd90fd28a8a9830f61 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:16:07 +0100 Subject: [PATCH 13/16] typo --- cookbook/js_langfuse_sdk.ipynb | 10 +++++----- pages/docs/sdk/typescript/example-notebook.md | 10 +++++----- pages/guides/cookbook/js_langfuse_sdk.md | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index 38754d087..505d3f663 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -19,7 +19,7 @@ "- Uses the core features of the Langfuse JS/TS SDK\n", "- Shows how to log any LLM call via the low-level SDK\n", "- Uses integrations that are interoperable with low-level SDK\n", - " - Langchain integration \n", + " - LangChain integration \n", " - OpenAI integration\n", "\n", "For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing.\n", @@ -141,7 +141,7 @@ "\n", "You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it.\n", "\n", - "In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations.\n", + "In the following, we will demonstrate how to log LLM calls using the low-level SDK, LangChain, and OpenAI integrations.\n", "\n", "### Option 1: Log Any LLM with low-level Langfuse SDK\n", "\n", @@ -217,15 +217,15 @@ "source": [ "### Option 2: Using LangChain\n", "\n", - "This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK.\n", + "This step shows how to trace LangChain applications using the [LangChain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK.\n", "\n", "Since this is a native integration, the model parameters and outputs are automatically captured.\n", "\n", "Steps:\n", "\n", "1. Create wrapper span to contain this section within the trace\n", - "2. Create Langchain handler scoped to this span by passing `root`\n", - "3. Pass handler to Langchain to natively capture Langchain traces\n", + "2. Create LangChain handler scoped to this span by passing `root`\n", + "3. Pass handler to LangChain to natively capture LangChain traces\n", "4. End wrapper span to get span-level latencies" ] }, diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index 12b7d3b44..61045ff9b 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -12,7 +12,7 @@ In this notebook, we will walk you through a **simple end-to-end example** that: - Uses the core features of the Langfuse JS/TS SDK - Shows how to log any LLM call via the low-level SDK - Uses integrations that are interoperable with low-level SDK - - Langchain integration + - LangChain integration - OpenAI integration For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing. @@ -90,7 +90,7 @@ trace.update({ You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it. -In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations. +In the following, we will demonstrate how to log LLM calls using the low-level SDK, LangChain, and OpenAI integrations. ### Option 1: Log Any LLM with low-level Langfuse SDK @@ -150,15 +150,15 @@ console.log(chatCompletion.content[0].text); ### Option 2: Using LangChain -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. +This step shows how to trace LangChain applications using the [LangChain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. Since this is a native integration, the model parameters and outputs are automatically captured. Steps: 1. Create wrapper span to contain this section within the trace -2. Create Langchain handler scoped to this span by passing `root` -3. Pass handler to Langchain to natively capture Langchain traces +2. Create LangChain handler scoped to this span by passing `root` +3. Pass handler to LangChain to natively capture LangChain traces 4. End wrapper span to get span-level latencies diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md index 12b7d3b44..61045ff9b 100644 --- a/pages/guides/cookbook/js_langfuse_sdk.md +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -12,7 +12,7 @@ In this notebook, we will walk you through a **simple end-to-end example** that: - Uses the core features of the Langfuse JS/TS SDK - Shows how to log any LLM call via the low-level SDK - Uses integrations that are interoperable with low-level SDK - - Langchain integration + - LangChain integration - OpenAI integration For this guide, we assume that you are already familiar with the Langfuse data model (traces, spans, generations, etc.). If not, please read the [conceptual introduction](https://langfuse.com/docs/tracing) to tracing. @@ -90,7 +90,7 @@ trace.update({ You can use the low-level Langfuse SDK to log any LLM call or any of the [integrations](https://langfuse.com/docs/integrations) that are interoperable with it. -In the following, we will demonstrate how to log LLM calls using the low-level SDK, Langchain, and OpenAI integrations. +In the following, we will demonstrate how to log LLM calls using the low-level SDK, LangChain, and OpenAI integrations. ### Option 1: Log Any LLM with low-level Langfuse SDK @@ -150,15 +150,15 @@ console.log(chatCompletion.content[0].text); ### Option 2: Using LangChain -This step shows how to trace Langchain applications using the [Langchain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. +This step shows how to trace LangChain applications using the [LangChain integration](https://langfuse.com/docs/integrations/langchain/tracing) which is fully interoperable with the Langfuse SDK. Since this is a native integration, the model parameters and outputs are automatically captured. Steps: 1. Create wrapper span to contain this section within the trace -2. Create Langchain handler scoped to this span by passing `root` -3. Pass handler to Langchain to natively capture Langchain traces +2. Create LangChain handler scoped to this span by passing `root` +3. Pass handler to LangChain to natively capture LangChain traces 4. End wrapper span to get span-level latencies From 384127e4255e1afa89a3ab43f0a7055eddc1d889 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:24:43 +0100 Subject: [PATCH 14/16] changelog --- ...2-04-extensive-end-to-end-example-for-js-ts.mdx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx diff --git a/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx b/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx new file mode 100644 index 000000000..6e7ea82d1 --- /dev/null +++ b/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx @@ -0,0 +1,14 @@ +--- +date: 2024-12-04 +title: Extensive end-to-end example notebook for JS/TS SDK +description: To make it easier to get started with the Langfuse JS/TS SDK, we've created an extensive end-to-end example notebook. It includes a general introduction and examples for Anthropic, OpenAI SDK and LangChain. +author: Jannik +--- + +import { ChangelogHeader } from "@/components/changelog/ChangelogHeader"; + + + +Check out our comprehensive [JS/TS example notebook](/docs/sdk/typescript/example-notebook) to see Langfuse in action. + +While we maintain various examples in the [Langfuse cookbook](/guides#cookbook), this notebook is our most detailed JS/TS example yet. From cd5c05e747adf33027588a3a2efac0cffde43588 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:24:46 +0100 Subject: [PATCH 15/16] push --- cookbook/js_langfuse_sdk.ipynb | 4 +++- pages/docs/sdk/typescript/example-notebook.md | 2 ++ pages/guides/cookbook/js_langfuse_sdk.md | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cookbook/js_langfuse_sdk.ipynb b/cookbook/js_langfuse_sdk.ipynb index 505d3f663..c8e85e539 100644 --- a/cookbook/js_langfuse_sdk.ipynb +++ b/cookbook/js_langfuse_sdk.ipynb @@ -6,6 +6,7 @@ "metadata": {}, "source": [ "---\n", + "title: Langfuse JS/TS SDK\n", "description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain.\n", "category: Integrations\n", "---\n", @@ -376,7 +377,8 @@ "## Learn More\n", "\n", "- [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide)\n", - "- [Langfuse Integrations](https://langfuse.com/docs/integrations)" + "- [Langfuse Integrations](https://langfuse.com/docs/integrations)\n", + "- [Support](/support)" ] } ], diff --git a/pages/docs/sdk/typescript/example-notebook.md b/pages/docs/sdk/typescript/example-notebook.md index 61045ff9b..f01a84a71 100644 --- a/pages/docs/sdk/typescript/example-notebook.md +++ b/pages/docs/sdk/typescript/example-notebook.md @@ -1,4 +1,5 @@ --- +title: Langfuse JS/TS SDK description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain. category: Integrations --- @@ -260,3 +261,4 @@ langfuse.score({ - [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) - [Langfuse Integrations](https://langfuse.com/docs/integrations) +- [Support](/support) diff --git a/pages/guides/cookbook/js_langfuse_sdk.md b/pages/guides/cookbook/js_langfuse_sdk.md index 61045ff9b..f01a84a71 100644 --- a/pages/guides/cookbook/js_langfuse_sdk.md +++ b/pages/guides/cookbook/js_langfuse_sdk.md @@ -1,4 +1,5 @@ --- +title: Langfuse JS/TS SDK description: End-to-end example of how to use the Langfuse Open Source Tracing via the low-level Langfuse JS/TS SDK. Includes examples for Anthropic, OpenAI and LangChain. category: Integrations --- @@ -260,3 +261,4 @@ langfuse.score({ - [Langfuse JS/TS SDK Guide](https://langfuse.com/docs/sdk/typescript/guide) - [Langfuse Integrations](https://langfuse.com/docs/integrations) +- [Support](/support) From 63ca4f405a23ed862512463efc5d52f71fe7da23 Mon Sep 17 00:00:00 2001 From: Marc Klingen Date: Wed, 4 Dec 2024 01:25:30 +0100 Subject: [PATCH 16/16] title --- .../2024-12-04-extensive-end-to-end-example-for-js-ts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx b/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx index 6e7ea82d1..662c35188 100644 --- a/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx +++ b/pages/changelog/2024-12-04-extensive-end-to-end-example-for-js-ts.mdx @@ -1,6 +1,6 @@ --- date: 2024-12-04 -title: Extensive end-to-end example notebook for JS/TS SDK +title: Extensive example notebook for JS/TS SDK description: To make it easier to get started with the Langfuse JS/TS SDK, we've created an extensive end-to-end example notebook. It includes a general introduction and examples for Anthropic, OpenAI SDK and LangChain. author: Jannik ---