@posthog/ai
Version:
PostHog Node.js AI integrations
95 lines (91 loc) • 3.14 kB
TypeScript
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 };