sentry-setup-ai-monitoring
npx machina-cli add skill troykelly/claude-skills/sentry-setup-ai-monitoring --openclawSOURCE: getsentry/sentry-for-claude
PATH: skills/sentry-setup-ai-monitoring/SKILL.md
DO NOT EDIT: This file is synced from external source
Setup Sentry AI Agent Monitoring
This skill helps configure Sentry's AI Agent Monitoring to track LLM calls, agent executions, tool usage, and token consumption.
When to Use This Skill
Invoke this skill when:
- User asks to "setup AI monitoring" or "add AI agent tracking"
- User wants to "monitor LLM calls" or "track OpenAI/Anthropic usage"
- User requests "AI observability" or "agent monitoring"
- User mentions tracking token usage, model latency, or AI costs
- User asks about instrumenting their AI/LLM code with Sentry
CRITICAL: Detection-First Approach
ALWAYS detect installed AI SDKs before suggesting configuration. Do not assume which AI library the user is using.
Step 1: Detect Platform and AI SDKs
For JavaScript/TypeScript Projects
Run these commands to detect installed AI packages:
# Check package.json for AI SDKs
grep -E '"(openai|@anthropic-ai/sdk|ai|@langchain|@google/genai|@langchain/langgraph)"' package.json
Supported JavaScript AI SDKs:
| Package | Sentry Integration | Min SDK Version | Package Version |
|---|---|---|---|
openai | openAIIntegration | 10.2.0 | >=4.0.0 <7 |
@anthropic-ai/sdk | anthropicAIIntegration | 10.12.0 | >=0.19.2 <1 |
ai (Vercel AI SDK) | vercelAIIntegration | 10.6.0 | >=3.0.0 <6 |
@langchain/* | langChainIntegration | 10.22.0 | >=0.1.0 <1 |
@google/genai | googleGenAIIntegration | 10.14.0 | >=0.10.0 <2 |
@langchain/langgraph | langGraphIntegration | 10.25.0 | >=0.2.0 <1 |
For Python Projects
# Check requirements.txt or pyproject.toml
grep -E '(openai|anthropic|langchain|huggingface)' requirements.txt pyproject.toml 2>/dev/null
Supported Python AI SDKs:
| Package | Sentry Extra | Min SDK Version | Package Version |
|---|---|---|---|
openai | sentry-sdk[openai] | 2.41.0 | >=1.0.0 |
anthropic | sentry-sdk[anthropic] | 2.x | >=0.16.0 |
langchain | sentry-sdk[langchain] | 2.x | >=0.1.11 |
huggingface_hub | sentry-sdk[huggingface_hub] | 2.x | >=0.22.0 |
Step 2: Verify Sentry SDK Version
JavaScript
grep -E '"@sentry/(nextjs|react|node)"' package.json
Check version meets minimum for detected AI SDK (see table above).
Upgrade if needed:
npm install @sentry/nextjs@latest # or appropriate package
Python
pip show sentry-sdk | grep Version
Upgrade if needed:
pip install --upgrade "sentry-sdk[openai]" # include detected extras
Step 3: Verify Tracing is Enabled
AI Agent Monitoring requires tracing. Check that tracesSampleRate is set in Sentry.init().
If not enabled, inform the user:
AI Agent Monitoring requires tracing to be enabled. I'll add tracesSampleRate to your Sentry configuration.
Step 4: Configure Based on Detected SDK
IMPORTANT: Present Detection Results First
Before configuring, tell the user what you found:
I detected the following AI SDK(s) in your project:
- [SDK NAME] (version X.X.X)
Sentry has automatic integration support for this SDK. I'll configure the appropriate integration.
If no supported SDK is detected:
I didn't detect any AI SDKs with automatic Sentry integration support in your project.
Your options:
1. Manual Instrumentation - I can help you set up custom spans for your AI calls
2. Install a supported SDK - If you're planning to add one of the supported SDKs
Would you like to proceed with manual instrumentation? If so, please describe where your AI/LLM calls are located.
JavaScript Integration Configurations
OpenAI Integration
Automatic - Enabled by default in SDK 10.2.0+
Explicit configuration (to enable input/output recording):
import * as Sentry from "@sentry/nextjs"; // or @sentry/node, @sentry/react
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [
Sentry.openAIIntegration({
recordInputs: true, // Capture prompts/messages
recordOutputs: true, // Capture responses
}),
],
});
Supported methods (auto-instrumented):
chat.completions.create()responses.create()
Example usage (no changes needed):
import OpenAI from "openai";
const openai = new OpenAI();
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
});
// Automatically captured by Sentry
Anthropic Integration
Automatic - Enabled by default in SDK 10.12.0+
Explicit configuration:
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [
Sentry.anthropicAIIntegration({
recordInputs: true,
recordOutputs: true,
}),
],
});
Supported methods (auto-instrumented):
messages.create()/messages.stream()messages.countTokens()completions.create()beta.messages.create()
Vercel AI SDK Integration
Automatic in Node runtime - Enabled by default in SDK 10.6.0+
For Edge runtime (Next.js) - Must be explicitly enabled in sentry.edge.config.ts:
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [Sentry.vercelAIIntegration()],
});
IMPORTANT: Telemetry must be enabled per-call:
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
const result = await generateText({
model: openai("gpt-4o"),
prompt: "Hello!",
experimental_telemetry: {
isEnabled: true,
recordInputs: true,
recordOutputs: true,
functionId: "my-generation", // Optional but recommended
},
});
Configuration options:
Sentry.vercelAIIntegration({
recordInputs: true,
recordOutputs: true,
force: false, // Force enable even if AI module not detected
})
LangChain Integration
Requires explicit integration in SDK 10.22.0+
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [
Sentry.langChainIntegration({
recordInputs: true,
recordOutputs: true,
}),
],
});
Auto-instrumented operations:
- Chat model calls (
gen_ai.request) - LLM pipeline executions (
gen_ai.pipeline) - Chain invocations (
gen_ai.invoke_agent) - Tool calls (
gen_ai.execute_tool) invoke(),stream(),batch()methods
LangGraph Integration
Requires explicit integration in SDK 10.25.0+
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [
Sentry.langGraphIntegration({
recordInputs: true,
recordOutputs: true,
}),
],
});
Auto-instrumented:
- Agent creation (StateGraph compilation)
- Agent invocation (
invoke()method)
Google GenAI Integration
Automatic - Enabled by default in SDK 10.14.0+
Explicit configuration:
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "YOUR_DSN_HERE",
tracesSampleRate: 1.0,
integrations: [
Sentry.googleGenAIIntegration({
recordInputs: true,
recordOutputs: true,
}),
],
});
Supported methods:
models.generateContent()/models.generateContentStream()chats.create()sendMessage()/sendMessageStream()
Python Integration Configurations
OpenAI Integration (Python)
Install with extra:
pip install "sentry-sdk[openai]"
Configuration:
import sentry_sdk
from sentry_sdk.integrations.openai import OpenAIIntegration
sentry_sdk.init(
dsn="YOUR_DSN_HERE",
traces_sample_rate=1.0,
send_default_pii=True, # Required for input/output capture
integrations=[
OpenAIIntegration(
include_prompts=True, # Capture inputs/outputs
tiktoken_encoding_name="cl100k_base", # For streaming token count
),
],
)
Usage (auto-instrumented):
from openai import OpenAI
client = OpenAI()
with sentry_sdk.start_transaction(name="AI inference"):
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}]
)
Anthropic Integration (Python)
Install with extra:
pip install "sentry-sdk[anthropic]"
Configuration:
import sentry_sdk
from sentry_sdk.integrations.anthropic import AnthropicIntegration
sentry_sdk.init(
dsn="YOUR_DSN_HERE",
traces_sample_rate=1.0,
send_default_pii=True,
integrations=[
AnthropicIntegration(
include_prompts=True,
),
],
)
Usage:
from anthropic import Anthropic
client = Anthropic()
with sentry_sdk.start_transaction(name="Claude inference"):
response = client.messages.create(
model="claude-3-5-sonnet-20240620",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello!"}]
)
LangChain Integration (Python)
Install with extra:
pip install "sentry-sdk[langchain]"
Configuration:
import sentry_sdk
from sentry_sdk.integrations.langchain import LangchainIntegration
sentry_sdk.init(
dsn="YOUR_DSN_HERE",
traces_sample_rate=1.0,
send_default_pii=True, # Required for LLM input/output capture
integrations=[
LangchainIntegration(
include_prompts=True,
),
],
)
Usage:
with sentry_sdk.start_transaction(name="LangChain agent"):
agent_executor = AgentExecutor(agent=agent, tools=tools)
result = agent_executor.invoke({"input": "your prompt"})
Hugging Face Hub Integration (Python)
Install with extra:
pip install "sentry-sdk[huggingface_hub]"
Configuration:
import sentry_sdk
from sentry_sdk.integrations.huggingface_hub import HuggingfaceHubIntegration
sentry_sdk.init(
dsn="YOUR_DSN_HERE",
traces_sample_rate=1.0,
send_default_pii=True,
integrations=[
HuggingfaceHubIntegration(
include_prompts=True,
),
],
)
Manual Instrumentation (Last Resort)
IMPORTANT: Only use manual instrumentation when:
- No supported AI SDK is detected
- User explicitly confirms they want manual instrumentation
- User describes where their AI calls are located
Ask User Before Proceeding
I'll help you set up manual AI instrumentation. To do this effectively, I need to know:
1. Where are your AI/LLM calls located? (file paths)
2. What AI provider/model are you using?
3. What operations do you want to track?
- LLM requests (prompts, completions)
- Agent executions
- Tool calls
- Agent handoffs
Manual Span Types
Four span types are required for AI Agents Insights:
1. AI Request Span (gen_ai.request)
Tracks individual LLM calls:
import * as Sentry from "@sentry/nextjs";
async function callLLM(prompt, model = "custom-model") {
return await Sentry.startSpan(
{
op: "gen_ai.request",
name: `LLM request ${model}`,
attributes: {
"gen_ai.request.model": model,
"gen_ai.request.temperature": 0.7,
"gen_ai.request.max_tokens": 1000,
},
},
async (span) => {
// Record input messages
span.setAttribute(
"gen_ai.request.messages",
JSON.stringify([{ role: "user", content: prompt }])
);
const startTime = performance.now();
// Your actual LLM call here
const result = await yourLLMClient.complete(prompt);
// Record output and metrics
span.setAttribute("gen_ai.response.text", result.text);
span.setAttribute("gen_ai.usage.input_tokens", result.inputTokens || 0);
span.setAttribute("gen_ai.usage.output_tokens", result.outputTokens || 0);
return result;
}
);
}
2. Invoke Agent Span (gen_ai.invoke_agent)
Tracks full agent execution lifecycle:
async function runAgent(task) {
return await Sentry.startSpan(
{
op: "gen_ai.invoke_agent",
name: "Execute AI Agent",
attributes: {
"gen_ai.agent.name": "my-agent",
"gen_ai.agent.available_tools": JSON.stringify(["search", "calculate"]),
},
},
async (span) => {
span.setAttribute("gen_ai.agent.input", task);
// Agent execution logic (may include multiple LLM calls and tool uses)
const result = await agent.execute(task);
span.setAttribute("gen_ai.agent.output", JSON.stringify(result));
span.setAttribute("gen_ai.usage.total_tokens", result.totalTokens || 0);
return result;
}
);
}
3. Execute Tool Span (gen_ai.execute_tool)
Tracks tool/function calls:
async function executeTool(toolName, toolInput) {
return await Sentry.startSpan(
{
op: "gen_ai.execute_tool",
name: `Tool: ${toolName}`,
attributes: {
"gen_ai.tool.name": toolName,
"gen_ai.tool.description": getToolDescription(toolName),
},
},
async (span) => {
span.setAttribute("gen_ai.tool.input", JSON.stringify(toolInput));
const result = await tools[toolName](toolInput);
span.setAttribute("gen_ai.tool.output", JSON.stringify(result));
return result;
}
);
}
4. Handoff Span (gen_ai.handoff)
Tracks agent-to-agent control transitions:
async function handoffToAgent(fromAgent, toAgent, context) {
return await Sentry.startSpan(
{
op: "gen_ai.handoff",
name: `Handoff: ${fromAgent} -> ${toAgent}`,
attributes: {
"gen_ai.handoff.from_agent": fromAgent,
"gen_ai.handoff.to_agent": toAgent,
},
},
async (span) => {
span.setAttribute("gen_ai.handoff.context", JSON.stringify(context));
// Perform handoff
const result = await agents[toAgent].receive(context);
return result;
}
);
}
Python Manual Instrumentation
import sentry_sdk
import json
def call_llm(prompt, model="custom-model"):
with sentry_sdk.start_span(
op="gen_ai.request",
name=f"LLM request {model}",
) as span:
span.set_data("gen_ai.request.model", model)
span.set_data("gen_ai.request.messages", json.dumps([
{"role": "user", "content": prompt}
]))
# Your actual LLM call
result = your_llm_client.complete(prompt)
span.set_data("gen_ai.response.text", result.text)
span.set_data("gen_ai.usage.input_tokens", result.input_tokens)
span.set_data("gen_ai.usage.output_tokens", result.output_tokens)
return result
Span Attributes Reference
Required Attributes
| Attribute | Description |
|---|---|
gen_ai.request.model | AI model identifier (e.g., "gpt-4o", "claude-3") |
Token Usage Attributes
| Attribute | Description |
|---|---|
gen_ai.usage.input_tokens | Tokens in prompt/input |
gen_ai.usage.output_tokens | Tokens in response/output |
gen_ai.usage.total_tokens | Total tokens used |
Request Attributes
| Attribute | Description |
|---|---|
gen_ai.request.messages | JSON string of input messages |
gen_ai.request.temperature | Temperature setting |
gen_ai.request.max_tokens | Max tokens limit |
gen_ai.request.top_p | Top-p sampling value |
Response Attributes
| Attribute | Description |
|---|---|
gen_ai.response.text | Generated text response |
gen_ai.response.tool_calls | JSON string of tool calls |
Agent Attributes
| Attribute | Description |
|---|---|
gen_ai.agent.name | Agent identifier |
gen_ai.agent.available_tools | JSON array of tool names |
gen_ai.agent.input | Agent input/task |
gen_ai.agent.output | Agent output/result |
Tool Attributes
| Attribute | Description |
|---|---|
gen_ai.tool.name | Tool identifier |
gen_ai.tool.description | Tool description |
gen_ai.tool.input | JSON string of tool input |
gen_ai.tool.output | JSON string of tool output |
Note: All complex data must be JSON stringified. Span attributes only allow primitive types.
Framework-Specific Notes
Next.js
- Configure in
instrumentation-client.ts,sentry.server.config.ts,sentry.edge.config.ts - Vercel AI SDK requires explicit edge runtime configuration
- Server-side LLM calls captured in server config
- Client-side calls (if any) in client config
Node.js / Express
- Configure in entry point or dedicated sentry config
- All integrations work in Node runtime
React (Client-Only)
- Limited usefulness - most LLM calls should be server-side
- Consider moving AI calls to API routes
Python (Django/Flask/FastAPI)
- Configure in settings or app initialization
- Wrap LLM calls in transactions for proper span hierarchy
Privacy and PII Considerations
Prompts and outputs are considered PII. To capture them:
JavaScript
Sentry.init({
sendDefaultPii: true,
// OR configure per-integration:
integrations: [
Sentry.openAIIntegration({
recordInputs: true,
recordOutputs: true,
}),
],
});
Python
sentry_sdk.init(
send_default_pii=True,
# OR configure per-integration:
integrations=[
OpenAIIntegration(include_prompts=True),
],
)
To exclude prompts/outputs:
- Set
recordInputs: false/recordOutputs: false(JS) - Set
include_prompts=False(Python)
Verification Steps
After setup, verify AI monitoring is working:
JavaScript
// Trigger a test LLM call
const response = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: "Say 'Sentry test successful'" }],
});
console.log("Test complete:", response.choices[0].message.content);
Python
with sentry_sdk.start_transaction(name="AI Test"):
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Say 'Sentry test'"}]
)
print("Test complete:", response.choices[0].message.content)
Check in Sentry:
- Go to Traces > AI Spans tab
- Look for spans with
gen_ai.*operations - Verify token usage and latency are captured
Common Issues and Solutions
Issue: AI spans not appearing
Solutions:
- Verify tracing is enabled (
tracesSampleRate > 0) - Check SDK version meets minimum requirements
- Ensure integration is properly configured
- For Vercel AI: Check
experimental_telemetry.isEnabled: true
Issue: Token counts missing
Solutions:
- Some providers don't return token counts for streaming
- For Python OpenAI streaming, install
tiktoken - Manual instrumentation: Ensure you're setting token attributes
Issue: Prompts/outputs not captured
Solutions:
- Enable
sendDefaultPii: trueor per-integration recording - Check
recordInputs/recordOutputsorinclude_promptssettings
Issue: Integration not detected
Solutions:
- Verify AI package is installed and version is compatible
- For Vercel AI edge runtime, explicitly add integration
- Use
force: trueoption if module detection fails
Summary Checklist
## Sentry AI Agent Monitoring Setup Complete
### Detection Results:
- [ ] AI SDK(s) detected: [LIST DETECTED SDKS]
- [ ] Sentry SDK version verified
- [ ] Tracing enabled
### Configuration Applied:
- [ ] Integration(s) added to Sentry.init()
- [ ] Input/output recording configured
- [ ] PII settings reviewed
### For Vercel AI SDK (if applicable):
- [ ] Edge runtime integration added
- [ ] experimental_telemetry enabled in function calls
### Next Steps:
1. Make an AI/LLM call to verify
2. Check Sentry > Traces > AI Spans
3. Review AI Agents Dashboard for metrics
Quick Reference
| AI SDK | JS Integration | Python Extra |
|---|---|---|
| OpenAI | openAIIntegration() | sentry-sdk[openai] |
| Anthropic | anthropicAIIntegration() | sentry-sdk[anthropic] |
| Vercel AI | vercelAIIntegration() | N/A |
| LangChain | langChainIntegration() | sentry-sdk[langchain] |
| LangGraph | langGraphIntegration() | N/A |
| Google GenAI | googleGenAIIntegration() | N/A |
| Hugging Face | N/A | sentry-sdk[huggingface_hub] |
Source
git clone https://github.com/troykelly/claude-skills/blob/main/external/skills/sentry-setup-ai-monitoring/SKILL.mdView on GitHub Overview
Configures Sentry's AI Agent Monitoring to track LLM calls, agent execution, tool usage, and token consumption. It automatically detects installed AI SDKs (JS/TS and Python) and wires the appropriate Sentry integration, simplifying AI observability.
How This Skill Works
The skill scans your project to detect AI SDKs, verifies that the corresponding Sentry SDK is present and up to date, and checks that tracing is enabled. Based on the detected SDK, it applies the matching Sentry integration and guides you through any missing steps.
When to Use It
- User asks to add AI agent monitoring or AI observability to a project
- You need to monitor LLM calls, token usage, or model latency
- Instrument OpenAI, Anthropic, Vercel AI, LangChain, or Google GenAI usage
- Upgrading AI SDKs and wiring in Sentry integrations
- Troubleshooting missing AI observability or tracing in a codebase
Quick Start
- Step 1: Detect installed AI SDKs in your project (JS/TS or Python) and review the detection output
- Step 2: Verify Sentry SDK version and ensure tracing is enabled (tracesSampleRate present)
- Step 3: Apply the recommended Sentry integration for the detected AI SDK and test with an LLM call
Best Practices
- Always run the detection step before suggesting configuration
- Verify and lock the AI SDKs and corresponding Sentry integration per the supported list
- Enable tracing in Sentry.init() (set tracesSampleRate)
- Test with a sample AI call to confirm the correct integration fires
- Document detected SDKs and the chosen Sentry integration for future maintenance
Example Use Cases
- A JS project using openai detected; automatically installs and enables openAIIntegration
- A Python project with openai and anthropic detected; enables extras like sentry-sdk[openai] and anthropic integration
- A project using Vercel AI's ai SDK detected; configures vercelAIIntegration
- A project with @langchain/* detected; enables langChainIntegration and related tracing
- No supported AI SDK detected; suggests manual instrumentation and custom spans