UNPKG

@posthog/ai

Version:
95 lines (91 loc) 3.14 kB
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { ReadableSpan, SpanProcessor, Span } from '@opentelemetry/sdk-trace-base'; import { Context } from '@opentelemetry/api'; interface PostHogTraceExporterOptions { /** * Your PostHog project API key. */ apiKey: string; /** * PostHog host URL. Defaults to `https://us.i.posthog.com`. */ host?: string; } /** * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP * ingestion endpoint. PostHog converts `gen_ai.*` spans into * `$ai_generation` events server-side. * * Only AI-related spans (those whose name or attribute keys start with * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other * spans are silently dropped. * * Use this when the API you're integrating with only accepts a * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to * plug PostHog into an existing processor chain. Otherwise prefer * {@link PostHogSpanProcessor}, which is self-contained. * * @example * ```ts * import { PostHogTraceExporter } from '@posthog/ai/otel' * import { registerOTel } from '@vercel/otel' * * registerOTel({ * serviceName: 'my-app', * traceExporter: new PostHogTraceExporter({ apiKey: 'phc_...' }), * }) * ``` */ declare class PostHogTraceExporter extends OTLPTraceExporter { constructor(options: PostHogTraceExporterOptions); export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error; }) => void): void; } interface PostHogSpanProcessorOptions { /** * Your PostHog project API key. */ apiKey: string; /** * PostHog host URL. Defaults to `https://us.i.posthog.com`. */ host?: string; /** * @internal Injected processor for testing — bypasses exporter creation. */ _spanProcessor?: SpanProcessor; } /** * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog. * * Internally batches spans and exports them to PostHog's OTLP ingestion * endpoint. Only AI-related spans (those whose name or attribute keys * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; * all other spans are silently dropped. * * This is the recommended integration point when your setup accepts a * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for * Vercel's `registerOTel`), use {@link PostHogTraceExporter}. * * @example * ```ts * import { PostHogSpanProcessor } from '@posthog/ai/otel' * import { NodeSDK } from '@opentelemetry/sdk-node' * * const sdk = new NodeSDK({ * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })], * }) * sdk.start() * ``` */ declare class PostHogSpanProcessor implements SpanProcessor { private readonly inner; constructor(options: PostHogSpanProcessorOptions); onStart(span: Span, parentContext: Context): void; onEnd(span: ReadableSpan): void; shutdown(): Promise<void>; forceFlush(): Promise<void>; } export { PostHogSpanProcessor, type PostHogSpanProcessorOptions, PostHogTraceExporter, type PostHogTraceExporterOptions };