@posthog/ai 7.19.4 → 7.19.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/anthropic/index.cjs +1 -1
- package/dist/anthropic/index.mjs +1 -1
- package/dist/gemini/index.cjs +1 -1
- package/dist/gemini/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/langchain/index.cjs +1 -1
- package/dist/langchain/index.mjs +1 -1
- package/dist/openai/index.cjs +1 -1
- package/dist/openai/index.mjs +1 -1
- package/dist/openai-agents/index.cjs +1 -1
- package/dist/openai-agents/index.mjs +1 -1
- package/dist/otel/index.cjs +29 -6
- package/dist/otel/index.cjs.map +1 -1
- package/dist/otel/index.d.ts +30 -9
- package/dist/otel/index.mjs +29 -6
- package/dist/otel/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +1 -1
- package/dist/vercel/index.mjs +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -125,7 +125,7 @@ import { registerOTel } from '@vercel/otel'
|
|
|
125
125
|
registerOTel({
|
|
126
126
|
serviceName: 'my-app',
|
|
127
127
|
traceExporter: new PostHogTraceExporter({
|
|
128
|
-
|
|
128
|
+
projectToken: '<YOUR_PROJECT_TOKEN>',
|
|
129
129
|
host: 'https://us.i.posthog.com', // optional, defaults to https://us.i.posthog.com
|
|
130
130
|
}),
|
|
131
131
|
})
|
package/dist/anthropic/index.cjs
CHANGED
package/dist/anthropic/index.mjs
CHANGED
package/dist/gemini/index.cjs
CHANGED
package/dist/gemini/index.mjs
CHANGED
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED
package/dist/langchain/index.cjs
CHANGED
package/dist/langchain/index.mjs
CHANGED
package/dist/openai/index.cjs
CHANGED
package/dist/openai/index.mjs
CHANGED
package/dist/otel/index.cjs
CHANGED
|
@@ -22,13 +22,33 @@ function isAISpan(span) {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
const DEFAULT_OTEL_HOST$1 = 'https://us.i.posthog.com';
|
|
25
|
-
function
|
|
25
|
+
function normalizeToken(value) {
|
|
26
26
|
return typeof value === 'string' ? value.trim() : '';
|
|
27
27
|
}
|
|
28
28
|
function normalizeHost$1(value) {
|
|
29
29
|
const normalizedValue = typeof value === 'string' ? value.trim() : '';
|
|
30
30
|
return normalizedValue || DEFAULT_OTEL_HOST$1;
|
|
31
31
|
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Options for the PostHogTraceExporter. You must obligatorily provide `projectToken`. You can also
|
|
35
|
+
* optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
40
|
+
*
|
|
41
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...' })
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
47
|
+
*
|
|
48
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
|
|
32
52
|
/**
|
|
33
53
|
* An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP
|
|
34
54
|
* ingestion endpoint. PostHog converts `gen_ai.*` spans into
|
|
@@ -43,6 +63,9 @@ function normalizeHost$1(value) {
|
|
|
43
63
|
* plug PostHog into an existing processor chain. Otherwise prefer
|
|
44
64
|
* {@link PostHogSpanProcessor}, which is self-contained.
|
|
45
65
|
*
|
|
66
|
+
* You must obligatorily provide `projectToken`. You can also
|
|
67
|
+
* optionally override the `host` URL.
|
|
68
|
+
*
|
|
46
69
|
* @example
|
|
47
70
|
* ```ts
|
|
48
71
|
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
@@ -50,21 +73,21 @@ function normalizeHost$1(value) {
|
|
|
50
73
|
*
|
|
51
74
|
* registerOTel({
|
|
52
75
|
* serviceName: 'my-app',
|
|
53
|
-
* traceExporter: new PostHogTraceExporter({
|
|
76
|
+
* traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),
|
|
54
77
|
* })
|
|
55
78
|
* ```
|
|
56
79
|
*/
|
|
57
80
|
class PostHogTraceExporter extends exporterTraceOtlpHttp.OTLPTraceExporter {
|
|
58
81
|
constructor(options) {
|
|
59
|
-
const
|
|
60
|
-
if (!
|
|
61
|
-
throw new Error('PostHogTraceExporter requires
|
|
82
|
+
const token = 'projectToken' in options ? normalizeToken(options.projectToken) : normalizeToken(options.apiKey);
|
|
83
|
+
if (!token) {
|
|
84
|
+
throw new Error('PostHogTraceExporter requires a projectToken');
|
|
62
85
|
}
|
|
63
86
|
const host = new URL(normalizeHost$1(options.host)).origin;
|
|
64
87
|
super({
|
|
65
88
|
url: `${host}/i/v0/ai/otel`,
|
|
66
89
|
headers: {
|
|
67
|
-
Authorization: `Bearer ${
|
|
90
|
+
Authorization: `Bearer ${token}`
|
|
68
91
|
}
|
|
69
92
|
});
|
|
70
93
|
}
|
package/dist/otel/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogTraceExporterOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n}\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ apiKey: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n constructor(options: PostHogTraceExporterOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogTraceExporter requires an apiKey')\n }\n const host = new URL(normalizeHost(options.host)).origin\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans, resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogSpanProcessor requires an apiKey')\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(span)\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["AI_SPAN_PREFIXES","isAISpan","span","some","prefix","name","startsWith","attributes","Object","keys","key","DEFAULT_OTEL_HOST","normalizeApiKey","value","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","constructor","options","apiKey","Error","host","URL","origin","url","headers","Authorization","export","spans","resultCallback","aiSpans","filter","length","code","ExportResultCode","SUCCESS","PostHogSpanProcessor","_spanProcessor","inner","exporter","BatchSpanProcessor","onStart","parentContext","onEnd","shutdown","forceFlush"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. You must obligatorily provide `projectToken`. You can also\n * optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions =\n | { projectToken: string; apiKey?: never; host?: string }\n | {\n /** @deprecated Use `projectToken` instead */\n apiKey: string\n projectToken?: never\n host?: string\n }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * You must obligatorily provide `projectToken`. You can also\n * optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n constructor(options: PostHogTraceExporterOptions) {\n const token = 'projectToken' in options ? normalizeToken(options.projectToken) : normalizeToken(options.apiKey)\n if (!token) {\n throw new Error('PostHogTraceExporter requires a projectToken')\n }\n\n const host = new URL(normalizeHost(options.host)).origin\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans, resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogSpanProcessor requires an apiKey')\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(span)\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["AI_SPAN_PREFIXES","isAISpan","span","some","prefix","name","startsWith","attributes","Object","keys","key","DEFAULT_OTEL_HOST","normalizeToken","value","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","constructor","options","token","projectToken","apiKey","Error","host","URL","origin","url","headers","Authorization","export","spans","resultCallback","aiSpans","filter","length","code","ExportResultCode","SUCCESS","normalizeApiKey","PostHogSpanProcessor","_spanProcessor","inner","exporter","BatchSpanProcessor","onStart","parentContext","onEnd","shutdown","forceFlush"],"mappings":"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"}
|
package/dist/otel/index.d.ts
CHANGED
|
@@ -2,16 +2,34 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
|
2
2
|
import { ReadableSpan, SpanProcessor, Span } from '@opentelemetry/sdk-trace-base';
|
|
3
3
|
import { Context } from '@opentelemetry/api';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Options for the PostHogTraceExporter. You must obligatorily provide `projectToken`. You can also
|
|
7
|
+
* optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
12
|
+
*
|
|
13
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...' })
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
19
|
+
*
|
|
20
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
type PostHogTraceExporterOptions = {
|
|
24
|
+
projectToken: string;
|
|
25
|
+
apiKey?: never;
|
|
26
|
+
host?: string;
|
|
27
|
+
} | {
|
|
28
|
+
/** @deprecated Use `projectToken` instead */
|
|
9
29
|
apiKey: string;
|
|
10
|
-
|
|
11
|
-
* PostHog host URL. Defaults to `https://us.i.posthog.com`.
|
|
12
|
-
*/
|
|
30
|
+
projectToken?: never;
|
|
13
31
|
host?: string;
|
|
14
|
-
}
|
|
32
|
+
};
|
|
15
33
|
/**
|
|
16
34
|
* An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP
|
|
17
35
|
* ingestion endpoint. PostHog converts `gen_ai.*` spans into
|
|
@@ -26,6 +44,9 @@ interface PostHogTraceExporterOptions {
|
|
|
26
44
|
* plug PostHog into an existing processor chain. Otherwise prefer
|
|
27
45
|
* {@link PostHogSpanProcessor}, which is self-contained.
|
|
28
46
|
*
|
|
47
|
+
* You must obligatorily provide `projectToken`. You can also
|
|
48
|
+
* optionally override the `host` URL.
|
|
49
|
+
*
|
|
29
50
|
* @example
|
|
30
51
|
* ```ts
|
|
31
52
|
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
@@ -33,7 +54,7 @@ interface PostHogTraceExporterOptions {
|
|
|
33
54
|
*
|
|
34
55
|
* registerOTel({
|
|
35
56
|
* serviceName: 'my-app',
|
|
36
|
-
* traceExporter: new PostHogTraceExporter({
|
|
57
|
+
* traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),
|
|
37
58
|
* })
|
|
38
59
|
* ```
|
|
39
60
|
*/
|
package/dist/otel/index.mjs
CHANGED
|
@@ -20,13 +20,33 @@ function isAISpan(span) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const DEFAULT_OTEL_HOST$1 = 'https://us.i.posthog.com';
|
|
23
|
-
function
|
|
23
|
+
function normalizeToken(value) {
|
|
24
24
|
return typeof value === 'string' ? value.trim() : '';
|
|
25
25
|
}
|
|
26
26
|
function normalizeHost$1(value) {
|
|
27
27
|
const normalizedValue = typeof value === 'string' ? value.trim() : '';
|
|
28
28
|
return normalizedValue || DEFAULT_OTEL_HOST$1;
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Options for the PostHogTraceExporter. You must obligatorily provide `projectToken`. You can also
|
|
33
|
+
* optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
38
|
+
*
|
|
39
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...' })
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
45
|
+
*
|
|
46
|
+
* new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
|
|
30
50
|
/**
|
|
31
51
|
* An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP
|
|
32
52
|
* ingestion endpoint. PostHog converts `gen_ai.*` spans into
|
|
@@ -41,6 +61,9 @@ function normalizeHost$1(value) {
|
|
|
41
61
|
* plug PostHog into an existing processor chain. Otherwise prefer
|
|
42
62
|
* {@link PostHogSpanProcessor}, which is self-contained.
|
|
43
63
|
*
|
|
64
|
+
* You must obligatorily provide `projectToken`. You can also
|
|
65
|
+
* optionally override the `host` URL.
|
|
66
|
+
*
|
|
44
67
|
* @example
|
|
45
68
|
* ```ts
|
|
46
69
|
* import { PostHogTraceExporter } from '@posthog/ai/otel'
|
|
@@ -48,21 +71,21 @@ function normalizeHost$1(value) {
|
|
|
48
71
|
*
|
|
49
72
|
* registerOTel({
|
|
50
73
|
* serviceName: 'my-app',
|
|
51
|
-
* traceExporter: new PostHogTraceExporter({
|
|
74
|
+
* traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),
|
|
52
75
|
* })
|
|
53
76
|
* ```
|
|
54
77
|
*/
|
|
55
78
|
class PostHogTraceExporter extends OTLPTraceExporter {
|
|
56
79
|
constructor(options) {
|
|
57
|
-
const
|
|
58
|
-
if (!
|
|
59
|
-
throw new Error('PostHogTraceExporter requires
|
|
80
|
+
const token = 'projectToken' in options ? normalizeToken(options.projectToken) : normalizeToken(options.apiKey);
|
|
81
|
+
if (!token) {
|
|
82
|
+
throw new Error('PostHogTraceExporter requires a projectToken');
|
|
60
83
|
}
|
|
61
84
|
const host = new URL(normalizeHost$1(options.host)).origin;
|
|
62
85
|
super({
|
|
63
86
|
url: `${host}/i/v0/ai/otel`,
|
|
64
87
|
headers: {
|
|
65
|
-
Authorization: `Bearer ${
|
|
88
|
+
Authorization: `Bearer ${token}`
|
|
66
89
|
}
|
|
67
90
|
});
|
|
68
91
|
}
|
package/dist/otel/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogTraceExporterOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n}\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ apiKey: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n constructor(options: PostHogTraceExporterOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogTraceExporter requires an apiKey')\n }\n const host = new URL(normalizeHost(options.host)).origin\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans, resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogSpanProcessor requires an apiKey')\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(span)\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["AI_SPAN_PREFIXES","isAISpan","span","some","prefix","name","startsWith","attributes","Object","keys","key","DEFAULT_OTEL_HOST","normalizeApiKey","value","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","constructor","options","apiKey","Error","host","URL","origin","url","headers","Authorization","export","spans","resultCallback","aiSpans","filter","length","code","ExportResultCode","SUCCESS","PostHogSpanProcessor","_spanProcessor","inner","exporter","BatchSpanProcessor","onStart","parentContext","onEnd","shutdown","forceFlush"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. You must obligatorily provide `projectToken`. You can also\n * optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions =\n | { projectToken: string; apiKey?: never; host?: string }\n | {\n /** @deprecated Use `projectToken` instead */\n apiKey: string\n projectToken?: never\n host?: string\n }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * You must obligatorily provide `projectToken`. You can also\n * optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n constructor(options: PostHogTraceExporterOptions) {\n const token = 'projectToken' in options ? normalizeToken(options.projectToken) : normalizeToken(options.apiKey)\n if (!token) {\n throw new Error('PostHogTraceExporter requires a projectToken')\n }\n\n const host = new URL(normalizeHost(options.host)).origin\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans, resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n throw new Error('PostHogSpanProcessor requires an apiKey')\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(span)\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["AI_SPAN_PREFIXES","isAISpan","span","some","prefix","name","startsWith","attributes","Object","keys","key","DEFAULT_OTEL_HOST","normalizeToken","value","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","constructor","options","token","projectToken","apiKey","Error","host","URL","origin","url","headers","Authorization","export","spans","resultCallback","aiSpans","filter","length","code","ExportResultCode","SUCCESS","normalizeApiKey","PostHogSpanProcessor","_spanProcessor","inner","exporter","BatchSpanProcessor","onStart","parentContext","onEnd","shutdown","forceFlush"],"mappings":"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"}
|
package/dist/vercel/index.cjs
CHANGED
package/dist/vercel/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/ai",
|
|
3
|
-
"version": "7.19.
|
|
3
|
+
"version": "7.19.6",
|
|
4
4
|
"description": "PostHog Node.js AI integrations",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"@types/jest": "^29.5.14",
|
|
26
26
|
"jest": "29.7.0",
|
|
27
27
|
"node-fetch": "^3.3.2",
|
|
28
|
-
"posthog-
|
|
28
|
+
"@posthog-tooling/tsconfig-base": "1.1.1",
|
|
29
29
|
"@posthog-tooling/rollup-utils": "1.1.1",
|
|
30
|
-
"
|
|
30
|
+
"posthog-node": "5.35.5"
|
|
31
31
|
},
|
|
32
32
|
"keywords": [
|
|
33
33
|
"posthog",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"openai": "^6.25.0",
|
|
51
51
|
"uuid": "^11.1.0",
|
|
52
52
|
"zod": "^4.1.13",
|
|
53
|
-
"@posthog/core": "1.29.
|
|
53
|
+
"@posthog/core": "1.29.12"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"@opentelemetry/api": "^1.9.0",
|