add-ai-integration

작성자: sentry

Sentry JavaScript SDK에 새로운 AI 제공자 통합을 추가합니다. 새로운 AI 계측(OpenAI, Anthropic, Vercel AI, LangChain 등)을 기여할 때 사용하세요.

npx skills add https://github.com/getsentry/sentry-javascript --skill add-ai-integration

Adding a New AI Integration

Decision Tree

Does the AI SDK have native OpenTelemetry support?
|- YES -> Does it emit OTel spans automatically?
|   |- YES (like Vercel AI) -> Pattern 1: OTel Span Processors
|   +- NO -> Pattern 2: OTel Instrumentation (wrap client)
+- NO -> Does the SDK provide hooks/callbacks?
    |- YES (like LangChain) -> Pattern 3: Callback/Hook Based
    +- NO -> Pattern 4: Client Wrapping

Runtime-Specific Placement

If an AI SDK only works in one runtime, code lives exclusively in that runtime's package. Do NOT add it to packages/core/.

  • Node.js-only -> packages/node/src/integrations/tracing/{provider}/
  • Cloudflare-only -> packages/cloudflare/src/integrations/tracing/{provider}.ts
  • Browser-only -> packages/browser/src/integrations/tracing/{provider}/
  • Multi-runtime -> shared core in packages/core/src/tracing/{provider}/ with runtime-specific wrappers

Span Hierarchy

  • gen_ai.invoke_agent — parent/pipeline spans (chains, agents, orchestration)
  • gen_ai.chat, gen_ai.generate_text, etc. — child spans (actual LLM calls)

Shared Utilities (packages/core/src/tracing/ai/)

  • gen-ai-attributes.ts — OTel Semantic Convention attribute constants. Always use these, never hardcode.
  • utils.tssetTokenUsageAttributes(), getTruncatedJsonString(), truncateGenAiMessages(), buildMethodPath()
  • Only use attributes from Sentry Gen AI Conventions.

Streaming

  • Non-streaming: startSpan(), set attributes from response
  • Streaming: startSpanManual(), accumulate state via async generator or event listeners, set GEN_AI_RESPONSE_STREAMING_ATTRIBUTE: true, call span.end() in finally block
  • Detect via params.stream === true
  • References: openai/streaming.ts (async generator), anthropic-ai/streaming.ts (event listeners)

Token Accumulation

  • Child spans: Set tokens directly from API response via setTokenUsageAttributes()
  • Parent spans (invoke_agent): Accumulate from children using event processor (see vercel-ai/)

Pattern 1: OTel Span Processors

Use when: SDK emits OTel spans automatically (Vercel AI)

  1. Core: Create add{Provider}Processors() in packages/core/src/tracing/{provider}/index.ts — registers spanStart listener + event processor
  2. Node.js: Add callWhenPatched() optimization in packages/node/src/integrations/tracing/{provider}/index.ts — defers registration until package is imported
  3. Edge: Direct registration in packages/cloudflare/src/integrations/tracing/{provider}.ts — no OTel, call processors immediately

Reference: packages/node/src/integrations/tracing/vercelai/

Pattern 2: OTel Instrumentation (Client Wrapping)

Use when: SDK has no native OTel support (OpenAI, Anthropic, Google GenAI)

  1. Core: Create instrument{Provider}Client() in packages/core/src/tracing/{provider}/index.ts — Proxy to wrap client methods, create spans manually
  2. Node.js instrumentation.ts: Patch module exports, wrap client constructor. Check _INTERNAL_shouldSkipAiProviderWrapping() for LangChain compatibility.
  3. Node.js index.ts: Export integration function using generateInstrumentOnce() helper

Reference: packages/node/src/integrations/tracing/openai/

Pattern 3: Callback/Hook Based

Use when: SDK provides lifecycle hooks (LangChain, LangGraph)

  1. Core: Create create{Provider}CallbackHandler() — implement SDK's callback interface, create spans in callbacks
  2. Node.js instrumentation.ts: Auto-inject callbacks by patching runnable methods. Disable underlying AI provider wrapping.

Reference: packages/node/src/integrations/tracing/langchain/

Auto-Instrumentation (Node.js)

Mandatory for Node.js AI integrations. OTel only patches when the package is imported (zero cost if unused).

Steps

  1. Add to getAutoPerformanceIntegrations() in packages/node/src/integrations/tracing/index.ts — LangChain MUST come first
  2. Add to getOpenTelemetryInstrumentationToPreload() for OTel-based integrations
  3. Export from packages/node/src/index.ts: integration function + options type
  4. Add E2E tests:
    • Node.js: dev-packages/node-integration-tests/suites/tracing/{provider}/
    • Cloudflare: dev-packages/cloudflare-integration-tests/suites/tracing/{provider}/
    • Browser: dev-packages/browser-integration-tests/suites/tracing/ai-providers/{provider}/

Key Rules

  1. Respect sendDefaultPii for recordInputs/recordOutputs
  2. Set SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'auto.ai.{provider}' (alphanumerics, _, . only)
  3. Truncate large data with helper functions from utils.ts
  4. gen_ai.invoke_agent for parent ops, gen_ai.chat for child ops

Checklist

  • Runtime-specific code placed only in that runtime's package
  • Added to getAutoPerformanceIntegrations() in correct order (Node.js)
  • Added to getOpenTelemetryInstrumentationToPreload() (Node.js with OTel)
  • Exported from appropriate package index
  • E2E tests added and verifying auto-instrumentation
  • Only used attributes from Sentry Gen AI Conventions
  • JSDoc says "enabled by default" or "not enabled by default"
  • Documented how to disable (if auto-enabled)
  • Verified OTel only patches when package imported (Node.js)

Reference Implementations

  • Pattern 1 (Span Processors): packages/node/src/integrations/tracing/vercelai/
  • Pattern 2 (Client Wrapping): packages/node/src/integrations/tracing/openai/
  • Pattern 3 (Callback/Hooks): packages/node/src/integrations/tracing/langchain/

When in doubt, follow the pattern of the most similar existing integration.

sentry의 다른 스킬

generate-frontend-forms
sentry
Sentry의 새로운 폼 시스템을 사용하여 폼을 생성하는 가이드입니다. 폼, 폼 필드, 유효성 검사 또는 자동 저장 기능을 구현할 때 사용하세요.
official
sentry-snapshots-cocoa
sentry
Apple/Cocoa 프로젝트를 위한 전체 Sentry Snapshots 설정입니다. "SnapshotPreviews 설정", "Apple 스냅샷 테스트 설정", "Apple 스냅샷 업로드" 요청 시 사용하세요.
official
architecture-review
sentry
직원 수준의 코드베이스 건강 검토. 모놀리식 모듈, 무음 실패, 타입 안전성 격차, 테스트 커버리지 구멍, LLM 친화성 문제를 찾습니다.
official
linear-type-labeler
sentry
Linear 이슈를 분류하고, 각 이슈의 제목과 설명 내용을 기반으로 Sentry 워크스페이스의 레이블 분류 체계에서 Type 레이블을 적용합니다.
official
sentry-flutter-sdk
sentry
Flutter 및 Dart를 위한 완전한 Sentry SDK 설정입니다. "Flutter에 Sentry 추가", "sentry_flutter 설치", "Dart에서 Sentry 설정" 또는 오류 구성을 요청받았을 때 사용하세요.
official
sentry-svelte-sdk
sentry
Svelte 및 SvelteKit을 위한 완전한 Sentry SDK 설정입니다. "Svelte에 Sentry 추가", "SvelteKit에 Sentry 추가", "@sentry/sveltekit 설치" 또는 구성 요청 시 사용하세요.
official
vercel-react-best-practices
sentry
Vercel Engineering의 React 및 Next.js 성능 최적화 가이드라인입니다. 이 스킬은 React/Next.js 코드를 작성, 검토 또는 리팩토링할 때 사용해야 합니다.
official
sentry-tanstack-start-sdk
sentry
TanStack Start React용 전체 Sentry SDK 설정. "TanStack Start에 Sentry 추가", "@sentry/tanstackstart-react 설치" 또는 오류 구성 요청 시 사용…
official