diff --git a/docs/platforms/javascript/common/configuration/integrations/openai.mdx b/docs/platforms/javascript/common/configuration/integrations/openai.mdx new file mode 100644 index 0000000000000..c3d4d2734707b --- /dev/null +++ b/docs/platforms/javascript/common/configuration/integrations/openai.mdx @@ -0,0 +1,143 @@ +--- +title: OpenAI +description: "Adds instrumentation for OpenAI API." +supported: + - javascript.node + - javascript.aws-lambda + - javascript.azure-functions + - javascript.connect + - javascript.express + - javascript.fastify + - javascript.gcp-functions + - javascript.hapi + - javascript.hono + - javascript.koa + - javascript.nestjs + - javascript.electron + - javascript.nextjs + - javascript.nuxt + - javascript.solidstart + - javascript.sveltekit + - javascript.react-router + - javascript.remix + - javascript.astro + - javascript.bun + - javascript.tanstackstart-react + - javascript.cloudflare +--- + + + +This integration works in the Node.js, Cloudflare Workers, Vercel Edge Functions runtimes. It requires SDK version `10.2.0` or higher. + + + +_Import name: `Sentry.openAIIntegration`_ + +The `openAIIntegration` adds instrumentation for the `openai` API to capture spans by automatically wrapping OpenAI client calls and recording LLM interactions with configurable input/output recording. + + +It is enabled by default and will automatically capture spans for OpenAI API method calls. You can opt-in to capture inputs and outputs by setting `recordInputs` and `recordOutputs` in the integration config: + +```javascript +Sentry.init({ + dsn: "____PUBLIC_DSN____", + tracesSampleRate: 1.0, + integrations: [ + Sentry.openAIIntegration({ + recordInputs: true, + recordOutputs: true, + }), + ], +}); +``` + + + + +For Cloudflare Workers, you need to manually instrument the OpenAI client using the `instrumentOpenAiClient` helper: + +```javascript +import * as Sentry from "@sentry/cloudflare"; +import OpenAI from "openai"; + +const openai = new OpenAI(); +const client = Sentry.instrumentOpenAiClient(openai, { + recordInputs: true, + recordOutputs: true, +}); + +// Use the wrapped client instead of the original openai instance +const response = await client.chat.completions.create({ + model: "gpt-4o", + messages: [{ role: "user", content: "Hello!" }], +}); +``` + + + + + +This integration is automatically instrumented in the Node.js runtime. For Next.js applications using the Edge runtime, you need to manually instrument the OpenAI client: + +```javascript +import * as Sentry from "@sentry/nextjs"; +import OpenAI from "openai"; + +const openai = new OpenAI(); +const client = Sentry.instrumentOpenAiClient(openai, { + recordInputs: true, + recordOutputs: true, +}); + +// Use the wrapped client instead of the original openai instance +const response = await client.chat.completions.create({ + model: "gpt-4o", + messages: [{ role: "user", content: "Hello!" }], +}); +``` + + + +## Options + +### `recordInputs` + +_Type: `boolean`_ + +Records inputs to OpenAI API method calls (such as prompts and messages). + +Defaults to `true` if `sendDefaultPii` is `true`. + +```javascript +Sentry.init({ + integrations: [Sentry.openAIIntegration({ recordInputs: true })], +}); +``` + +### `recordOutputs` + +_Type: `boolean`_ + +Records outputs from OpenAI API method calls (such as generated text and responses). + +Defaults to `true` if `sendDefaultPii` is `true`. + +```javascript +Sentry.init({ + integrations: [Sentry.openAIIntegration({ recordOutputs: true })], +}); +``` + +## Configuration + +By default this integration adds tracing support to OpenAI API method calls including: + +- `chat.completions.create()` - Chat completion requests +- `responses.create()` - Response API requests + +The integration will automatically detect streaming vs non-streaming requests and handle them appropriately. + +## Supported Versions + +- `openai`: `>=4.0.0 <6` diff --git a/platform-includes/configuration/integrations/javascript.astro.mdx b/platform-includes/configuration/integrations/javascript.astro.mdx index 82a79000747cb..6714b5150fe30 100644 --- a/platform-includes/configuration/integrations/javascript.astro.mdx +++ b/platform-includes/configuration/integrations/javascript.astro.mdx @@ -81,3 +81,4 @@ Depending on whether an integration enhances the functionality of a particular r | [`localVariablesIntegration`](./localvariables) | | ✓ | | | | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.aws-lambda.mdx b/platform-includes/configuration/integrations/javascript.aws-lambda.mdx index da20b0d8372bb..fcb6851d4025a 100644 --- a/platform-includes/configuration/integrations/javascript.aws-lambda.mdx +++ b/platform-includes/configuration/integrations/javascript.aws-lambda.mdx @@ -18,6 +18,7 @@ | [`onUnhandledRejectionIntegration`](./unhandledrejection) | ✓ | ✓ | | | | [`childProcessIntegration`](./childProcess) | ✓ | | | ✓ | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`amqplibIntegration`](./amqplib) | | | ✓ | | | [`anrIntegration`](./anr) | | ✓ | | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | diff --git a/platform-includes/configuration/integrations/javascript.bun.mdx b/platform-includes/configuration/integrations/javascript.bun.mdx index da3c317d233cf..ad44371c98bac 100644 --- a/platform-includes/configuration/integrations/javascript.bun.mdx +++ b/platform-includes/configuration/integrations/javascript.bun.mdx @@ -30,6 +30,7 @@ | [`tediousIntegration`](./tedious) | ✓ | | ✓ | | | [`prismaIntegration`](./prisma) | ✓ | | ✓ | | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | | [`dataloaderIntegration`](./dataloader) | | | ✓ | | | [`extraErrorDataIntegration`](./extraerrordata) | | | | ✓ | diff --git a/platform-includes/configuration/integrations/javascript.connect.mdx b/platform-includes/configuration/integrations/javascript.connect.mdx index c5381631500bd..e767b5dcad9bd 100644 --- a/platform-includes/configuration/integrations/javascript.connect.mdx +++ b/platform-includes/configuration/integrations/javascript.connect.mdx @@ -31,6 +31,7 @@ | [`childProcessIntegration`](./childProcess) | ✓ | | | ✓ | | [`rewriteFramesIntegration`](./rewriteframes) | ✓ | ✓ | | | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`anrIntegration`](./anr) | | ✓ | | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | | [`eventLoopBlockIntegration`](./event-loop-block) | | ✓ | | | diff --git a/platform-includes/configuration/integrations/javascript.fastify.mdx b/platform-includes/configuration/integrations/javascript.fastify.mdx index 3e50202ca7c6c..37655ce773083 100644 --- a/platform-includes/configuration/integrations/javascript.fastify.mdx +++ b/platform-includes/configuration/integrations/javascript.fastify.mdx @@ -31,6 +31,7 @@ | [`childProcessIntegration`](./childProcess) | ✓ | | | ✓ | | [`prismaIntegration`](./prisma) | ✓ | | ✓ | | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`anrIntegration`](./anr) | | ✓ | | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | | [`eventLoopBlockIntegration`](./event-loop-block) | | ✓ | | | diff --git a/platform-includes/configuration/integrations/javascript.gcp-functions.mdx b/platform-includes/configuration/integrations/javascript.gcp-functions.mdx index 93e081114ab14..8c47081af6886 100644 --- a/platform-includes/configuration/integrations/javascript.gcp-functions.mdx +++ b/platform-includes/configuration/integrations/javascript.gcp-functions.mdx @@ -18,6 +18,7 @@ | [`onUnhandledRejectionIntegration`](./unhandledrejection) | ✓ | ✓ | | | | [`childProcessIntegration`](./childProcess) | ✓ | | | ✓ | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`amqplibIntegration`](./amqplib) | | | ✓ | | | [`anrIntegration`](./anr) | | ✓ | | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | diff --git a/platform-includes/configuration/integrations/javascript.hapi.mdx b/platform-includes/configuration/integrations/javascript.hapi.mdx index eeb97654ea56d..fdb2607e09a41 100644 --- a/platform-includes/configuration/integrations/javascript.hapi.mdx +++ b/platform-includes/configuration/integrations/javascript.hapi.mdx @@ -31,6 +31,7 @@ | [`childProcessIntegration`](./childProcess) | ✓ | | | ✓ | | [`prismaIntegration`](./prisma) | ✓ | | ✓ | | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | | [`anrIntegration`](./anr) | | ✓ | | | | [`captureConsoleIntegration`](./captureconsole) | | | | ✓ | | [`eventLoopBlockIntegration`](./event-loop-block) | | ✓ | | | diff --git a/platform-includes/configuration/integrations/javascript.nestjs.mdx b/platform-includes/configuration/integrations/javascript.nestjs.mdx index 5709781760c40..9e85b0fab02ac 100644 --- a/platform-includes/configuration/integrations/javascript.nestjs.mdx +++ b/platform-includes/configuration/integrations/javascript.nestjs.mdx @@ -44,3 +44,4 @@ | [`supabaseIntegration`](./supabase) | | ✓ | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | | [`unleashIntegration`](./unleash) | | | | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.nextjs.mdx b/platform-includes/configuration/integrations/javascript.nextjs.mdx index debf2424b04b2..de0210f691ca7 100644 --- a/platform-includes/configuration/integrations/javascript.nextjs.mdx +++ b/platform-includes/configuration/integrations/javascript.nextjs.mdx @@ -87,6 +87,7 @@ Depending on whether an integration enhances the functionality of a particular r | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | | [`vercelAiIntegration`](./vercelai) | ✓ | | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | ### Edge Integrations diff --git a/platform-includes/configuration/integrations/javascript.node.mdx b/platform-includes/configuration/integrations/javascript.node.mdx index 9fcc6fb42926d..d9be6d22d671c 100644 --- a/platform-includes/configuration/integrations/javascript.node.mdx +++ b/platform-includes/configuration/integrations/javascript.node.mdx @@ -42,3 +42,4 @@ | [`supabaseIntegration`](./supabase) | | ✓ | ✓ | | | [`tediousIntegration`](./tedious) | ✓ | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.nuxt.mdx b/platform-includes/configuration/integrations/javascript.nuxt.mdx index fe3227f1a55af..4b25f09ab5b0a 100644 --- a/platform-includes/configuration/integrations/javascript.nuxt.mdx +++ b/platform-includes/configuration/integrations/javascript.nuxt.mdx @@ -80,3 +80,4 @@ Depending on whether an integration enhances the functionality of a particular r | [`localVariablesIntegration`](./localvariables) | | ✓ | | | | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.remix.mdx b/platform-includes/configuration/integrations/javascript.remix.mdx index 243acaaca43af..8849cca15c3a0 100644 --- a/platform-includes/configuration/integrations/javascript.remix.mdx +++ b/platform-includes/configuration/integrations/javascript.remix.mdx @@ -80,3 +80,4 @@ Depending on whether an integration enhances the functionality of a particular r | [`localVariablesIntegration`](./localvariables) | | ✓ | | | | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.solidstart.mdx b/platform-includes/configuration/integrations/javascript.solidstart.mdx index 0bbe29a566028..f58c659fd8997 100644 --- a/platform-includes/configuration/integrations/javascript.solidstart.mdx +++ b/platform-includes/configuration/integrations/javascript.solidstart.mdx @@ -80,3 +80,4 @@ Depending on whether an integration enhances the functionality of a particular r | [`localVariablesIntegration`](./localvariables) | | ✓ | | | | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | | diff --git a/platform-includes/configuration/integrations/javascript.sveltekit.mdx b/platform-includes/configuration/integrations/javascript.sveltekit.mdx index 7769fc4adcb71..82da16a61135f 100644 --- a/platform-includes/configuration/integrations/javascript.sveltekit.mdx +++ b/platform-includes/configuration/integrations/javascript.sveltekit.mdx @@ -80,3 +80,4 @@ Depending on whether an integration enhances the functionality of a particular r | [`nodeProfilingIntegration`](./nodeprofiling) | | | ✓ | | | [`supabaseIntegration`](./supabase) | | ✓ | ✓ | | | [`trpcMiddleware`](./trpc) | | ✓ | ✓ | ✓ | +| [`openAIIntegration`](./openai) | ✓ | | ✓ | |