@illuma-ai/observability-node 0.1.0 → 0.2.0

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.
@@ -0,0 +1,60 @@
1
+ import type { Observability } from './client.js';
2
+ /**
3
+ * Represents the minimal shape of an Anthropic client we need to instrument.
4
+ * We avoid importing the `@anthropic-ai/sdk` package directly to keep it as an optional peer dependency.
5
+ */
6
+ interface AnthropicLike {
7
+ messages: {
8
+ create: (...args: unknown[]) => Promise<unknown>;
9
+ };
10
+ }
11
+ /**
12
+ * Options for configuring the Anthropic observation wrapper.
13
+ */
14
+ export interface ObserveAnthropicOptions {
15
+ /** Parent trace name. Defaults to "anthropic-call". */
16
+ traceName?: string;
17
+ /** Additional metadata to attach to each generation event */
18
+ generationMetadata?: Record<string, unknown>;
19
+ /** User ID to associate with traces */
20
+ userId?: string;
21
+ /** Session ID to group related traces */
22
+ sessionId?: string;
23
+ /** Environment name (e.g., 'production', 'staging', 'development') */
24
+ environment?: string;
25
+ }
26
+ /**
27
+ * Wraps an Anthropic client instance with automatic observability instrumentation.
28
+ *
29
+ * Uses ES Proxy to intercept calls to `messages.create()`, automatically creating
30
+ * trace and generation events with model, usage, and timing information.
31
+ *
32
+ * The returned client has the same interface as the original — existing code
33
+ * works unchanged.
34
+ *
35
+ * @param anthropic - An Anthropic client instance (from the `@anthropic-ai/sdk` npm package)
36
+ * @param observability - An initialized Observability client
37
+ * @param options - Optional configuration for trace naming and metadata
38
+ * @returns A proxied Anthropic client with the same interface
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import Anthropic from '@anthropic-ai/sdk';
43
+ * import { Observability, observeAnthropic } from '@illuma-ai/observability-node';
44
+ *
45
+ * const client = new Anthropic();
46
+ * const observability = new Observability(); // reads env vars
47
+ *
48
+ * const traced = observeAnthropic(client, observability);
49
+ *
50
+ * // Works exactly like the original client, but now all calls are traced
51
+ * const response = await traced.messages.create({
52
+ * model: 'claude-sonnet-4-20250514',
53
+ * max_tokens: 1024,
54
+ * messages: [{ role: 'user', content: 'Hello!' }],
55
+ * });
56
+ * ```
57
+ */
58
+ export declare function observeAnthropic<T extends AnthropicLike>(anthropic: T, observability: Observability, options?: ObserveAnthropicOptions): T;
59
+ export {};
60
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../src/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,UAAU,aAAa;IACrB,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAClD,CAAC;CACH;AA2BD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EACtD,SAAS,EAAE,CAAC,EACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,GAAE,uBAA4B,GACpC,CAAC,CA4JH"}
@@ -0,0 +1,164 @@
1
+ import { ObservationLevel } from '@illuma-ai/observability-core';
2
+ /**
3
+ * Wraps an Anthropic client instance with automatic observability instrumentation.
4
+ *
5
+ * Uses ES Proxy to intercept calls to `messages.create()`, automatically creating
6
+ * trace and generation events with model, usage, and timing information.
7
+ *
8
+ * The returned client has the same interface as the original — existing code
9
+ * works unchanged.
10
+ *
11
+ * @param anthropic - An Anthropic client instance (from the `@anthropic-ai/sdk` npm package)
12
+ * @param observability - An initialized Observability client
13
+ * @param options - Optional configuration for trace naming and metadata
14
+ * @returns A proxied Anthropic client with the same interface
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import Anthropic from '@anthropic-ai/sdk';
19
+ * import { Observability, observeAnthropic } from '@illuma-ai/observability-node';
20
+ *
21
+ * const client = new Anthropic();
22
+ * const observability = new Observability(); // reads env vars
23
+ *
24
+ * const traced = observeAnthropic(client, observability);
25
+ *
26
+ * // Works exactly like the original client, but now all calls are traced
27
+ * const response = await traced.messages.create({
28
+ * model: 'claude-sonnet-4-20250514',
29
+ * max_tokens: 1024,
30
+ * messages: [{ role: 'user', content: 'Hello!' }],
31
+ * });
32
+ * ```
33
+ */
34
+ export function observeAnthropic(anthropic, observability, options = {}) {
35
+ const { traceName = 'anthropic-call', generationMetadata, userId, sessionId, } = options;
36
+ /**
37
+ * Wrap messages.create to auto-instrument it with tracing.
38
+ */
39
+ function wrapCreate(originalFn) {
40
+ return async function wrappedCreate(...args) {
41
+ const params = (args[0] ?? {});
42
+ const startTime = new Date().toISOString();
43
+ // Create a trace for this call
44
+ const trace = observability.trace({
45
+ name: traceName,
46
+ input: params,
47
+ userId,
48
+ sessionId,
49
+ });
50
+ try {
51
+ // Call the original Anthropic method
52
+ const result = await originalFn.apply(anthropic, args);
53
+ const endTime = new Date().toISOString();
54
+ const response = result;
55
+ const inputTokens = response.usage?.input_tokens;
56
+ const outputTokens = response.usage?.output_tokens;
57
+ trace.generation({
58
+ name: 'messages.create',
59
+ model: params.model ?? response.model,
60
+ input: params.messages,
61
+ output: response.content,
62
+ startTime,
63
+ endTime,
64
+ modelParameters: extractModelParams(params),
65
+ provider: 'anthropic',
66
+ usage: response.usage
67
+ ? {
68
+ input: inputTokens,
69
+ output: outputTokens,
70
+ total: inputTokens !== undefined && outputTokens !== undefined
71
+ ? inputTokens + outputTokens
72
+ : undefined,
73
+ }
74
+ : undefined,
75
+ usageDetails: response.usage ? buildUsageDetails(response.usage) : undefined,
76
+ metadata: {
77
+ ...generationMetadata,
78
+ anthropic_id: response.id,
79
+ stop_reason: response.stop_reason,
80
+ },
81
+ });
82
+ return result;
83
+ }
84
+ catch (err) {
85
+ const endTime = new Date().toISOString();
86
+ // Record the failed generation
87
+ trace.generation({
88
+ name: 'messages.create',
89
+ model: params.model,
90
+ input: params.messages,
91
+ startTime,
92
+ endTime,
93
+ modelParameters: extractModelParams(params),
94
+ level: ObservationLevel.ERROR,
95
+ statusMessage: err instanceof Error ? err.message : String(err),
96
+ metadata: {
97
+ ...generationMetadata,
98
+ provider: 'anthropic',
99
+ },
100
+ });
101
+ throw err;
102
+ }
103
+ };
104
+ }
105
+ /**
106
+ * Extract common model parameters from Anthropic request params.
107
+ * Includes Anthropic-specific params like top_k, system, and stop_sequences.
108
+ */
109
+ function extractModelParams(params) {
110
+ const modelParams = {};
111
+ const keys = [
112
+ 'max_tokens',
113
+ 'temperature',
114
+ 'top_p',
115
+ 'top_k',
116
+ 'stop_sequences',
117
+ 'system',
118
+ 'tools',
119
+ 'tool_choice',
120
+ 'metadata',
121
+ 'stream',
122
+ ];
123
+ for (const key of keys) {
124
+ if (params[key] !== undefined) {
125
+ modelParams[key] = params[key];
126
+ }
127
+ }
128
+ return modelParams;
129
+ }
130
+ /**
131
+ * Build usageDetails from Anthropic cache token fields.
132
+ * Only includes fields that are present and non-zero.
133
+ */
134
+ function buildUsageDetails(usage) {
135
+ const details = {};
136
+ if (usage.cache_creation_input_tokens !== undefined) {
137
+ details.cache_creation_input_tokens = usage.cache_creation_input_tokens;
138
+ }
139
+ if (usage.cache_read_input_tokens !== undefined) {
140
+ details.cache_read_input_tokens = usage.cache_read_input_tokens;
141
+ }
142
+ return Object.keys(details).length > 0 ? details : undefined;
143
+ }
144
+ // Create proxied messages object with instrumented create method
145
+ const wrappedMessagesCreate = wrapCreate(anthropic.messages.create.bind(anthropic.messages));
146
+ const proxiedMessages = new Proxy(anthropic.messages, {
147
+ get(target, prop, receiver) {
148
+ if (prop === 'create') {
149
+ return wrappedMessagesCreate;
150
+ }
151
+ return Reflect.get(target, prop, receiver);
152
+ },
153
+ });
154
+ // Create the top-level proxy
155
+ return new Proxy(anthropic, {
156
+ get(target, prop, receiver) {
157
+ if (prop === 'messages') {
158
+ return proxiedMessages;
159
+ }
160
+ return Reflect.get(target, prop, receiver);
161
+ },
162
+ });
163
+ }
164
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../src/anthropic.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -15,6 +15,12 @@ export interface ObservabilityOptions {
15
15
  secretKey?: string;
16
16
  /** Base URL of the Illuma Observe instance. Falls back to ILLUMA_BASE_URL or LANGFUSE_BASE_URL env var. */
17
17
  baseUrl?: string;
18
+ /** Environment name. Falls back to ILLUMA_ENVIRONMENT or LANGFUSE_TRACING_ENVIRONMENT or NODE_ENV env var. */
19
+ environment?: string;
20
+ /** Release identifier. Falls back to ILLUMA_RELEASE or LANGFUSE_RELEASE env var. */
21
+ release?: string;
22
+ /** Whether tracing is enabled. Falls back to ILLUMA_ENABLED env var (default: true). */
23
+ enabled?: boolean;
18
24
  /** Number of events to batch before auto-flushing (default: 15) */
19
25
  flushAt?: number;
20
26
  /** Interval in ms between auto-flushes (default: 5000) */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAKvC;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,aAAc,SAAQ,uBAAuB;IACxD,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,OAAO,GAAE,oBAAyB;IAkD9C;;;;;;;;OAQG;cACa,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAiBzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAKvC;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,aAAc,SAAQ,uBAAuB;IACxD,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,OAAO,GAAE,oBAAyB;IAuE9C;;;;;;;;OAQG;cACa,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAiBzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
package/dist/client.js CHANGED
@@ -43,6 +43,18 @@ export class Observability extends ObservabilityCoreClient {
43
43
  const baseUrl = options.baseUrl ??
44
44
  process.env.ILLUMA_BASE_URL ??
45
45
  process.env.LANGFUSE_BASE_URL;
46
+ const environment = options.environment ??
47
+ process.env.ILLUMA_ENVIRONMENT ??
48
+ process.env.LANGFUSE_TRACING_ENVIRONMENT ??
49
+ process.env.NODE_ENV ??
50
+ 'default';
51
+ const release = options.release ??
52
+ process.env.ILLUMA_RELEASE ??
53
+ process.env.LANGFUSE_RELEASE;
54
+ const enabled = options.enabled ??
55
+ (process.env.ILLUMA_ENABLED !== undefined
56
+ ? process.env.ILLUMA_ENABLED === 'true'
57
+ : true);
46
58
  if (!publicKey) {
47
59
  throw new Error('[observability-node] publicKey is required. ' +
48
60
  'Pass it in the constructor or set ILLUMA_PUBLIC_KEY / LANGFUSE_PUBLIC_KEY env var.');
@@ -59,6 +71,9 @@ export class Observability extends ObservabilityCoreClient {
59
71
  publicKey,
60
72
  secretKey,
61
73
  baseUrl,
74
+ environment,
75
+ release,
76
+ enabled,
62
77
  flushAt: options.flushAt,
63
78
  flushInterval: options.flushInterval,
64
79
  maxRetries: options.maxRetries,
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAIxB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACjD,MAAM,WAAW,GAAG,OAAO,CAAC;AA0B5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,OAAO,aAAc,SAAQ,uBAAuB;IAChD,qBAAqB,GAAG,KAAK,CAAC;IAEtC,YAAY,UAAgC,EAAE;QAC5C,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;YACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAElC,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;YACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAElC,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAEhC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC5C,oFAAoF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC5C,oFAAoF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,4CAA4C;gBAC1C,gFAAgF,CACnF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAA8B;YAC5C,SAAS;YACT,SAAS;YACT,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;QAEF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,6DAA6D;QAC7D,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACO,KAAK,CAAC,cAAc,CAC5B,GAAW,EACX,OAAqB;QAErB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC3B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACzB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAElC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YAC5B,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @example
8
8
  * ```ts
9
- * import { Observability, observeOpenAI } from '@illuma-ai/observability-node';
9
+ * import { Observability } from '@illuma-ai/observability-node';
10
10
  *
11
11
  * // Reads ILLUMA_PUBLIC_KEY, ILLUMA_SECRET_KEY, ILLUMA_BASE_URL from env
12
12
  * // (also supports LANGFUSE_* env vars for easy migration)
@@ -21,7 +21,9 @@
21
21
  * @packageDocumentation
22
22
  */
23
23
  export { Observability, type ObservabilityOptions } from './client.js';
24
- export { observeOpenAI, type ObserveOpenAIOptions } from './openai.js';
25
- export type { ObservabilityClientConfig, TraceParams, GenerationParams, SpanParams, EventParams, ScoreParams, IngestionEvent, IngestionEventType, IngestionBatchRequest, } from '@illuma-ai/observability-core';
26
- export { ObservabilityCoreClient, TraceClient } from '@illuma-ai/observability-core';
24
+ export { track, getCurrentTrackContext, resetTrackClient } from './track.js';
25
+ export type { TrackOptions, TrackContext } from './track.js';
26
+ export { ObservabilityCoreClient, TraceClient, SpanClient, GenerationClient, ObservationType, ObservationLevel, } from '@illuma-ai/observability-core';
27
+ export type { TraceParams, GenerationParams, SpanParams, EventParams, ScoreParams, UsageParams, UsageDetailsParams, IngestionEvent, IngestionBatchRequest, IngestionBatchResponse, ObservabilityClientConfig, ErrorInfo, ScoreDataType, ScoreSource, } from '@illuma-ai/observability-core';
28
+ export { IngestionEventType } from '@illuma-ai/observability-core';
27
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGvE,YAAY,EACV,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGvE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @example
8
8
  * ```ts
9
- * import { Observability, observeOpenAI } from '@illuma-ai/observability-node';
9
+ * import { Observability } from '@illuma-ai/observability-node';
10
10
  *
11
11
  * // Reads ILLUMA_PUBLIC_KEY, ILLUMA_SECRET_KEY, ILLUMA_BASE_URL from env
12
12
  * // (also supports LANGFUSE_* env vars for easy migration)
@@ -20,7 +20,11 @@
20
20
  *
21
21
  * @packageDocumentation
22
22
  */
23
+ // Node.js client
23
24
  export { Observability } from './client.js';
24
- export { observeOpenAI } from './openai.js';
25
- export { ObservabilityCoreClient, TraceClient } from '@illuma-ai/observability-core';
25
+ // Track decorator
26
+ export { track, getCurrentTrackContext, resetTrackClient } from './track.js';
27
+ // Re-export core types for convenience
28
+ export { ObservabilityCoreClient, TraceClient, SpanClient, GenerationClient, ObservationType, ObservationLevel, } from '@illuma-ai/observability-core';
29
+ export { IngestionEventType } from '@illuma-ai/observability-core';
26
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AAevE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AAEvE,kBAAkB;AAClB,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG7E,uCAAuC;AACvC,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AAmBvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/openai.d.ts CHANGED
@@ -25,6 +25,8 @@ export interface ObserveOpenAIOptions {
25
25
  userId?: string;
26
26
  /** Session ID to group related traces */
27
27
  sessionId?: string;
28
+ /** Environment name (e.g., 'production', 'staging', 'development') */
29
+ environment?: string;
28
30
  }
29
31
  /**
30
32
  * Wraps an OpenAI client instance with automatic observability instrumentation.
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,UAAU,UAAU;IAClB,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;SAClD,CAAC;KACH,CAAC;IACF,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAClD,CAAC;CACH;AAwCD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,UAAU,EAChD,MAAM,EAAE,CAAC,EACT,aAAa,EAAE,aAAa,EAC5B,OAAO,GAAE,oBAAyB,GACjC,CAAC,CAwLH"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,UAAU,UAAU;IAClB,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;SAClD,CAAC;KACH,CAAC;IACF,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAClD,CAAC;CACH;AA8CD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,UAAU,EAChD,MAAM,EAAE,CAAC,EACT,aAAa,EAAE,aAAa,EAC5B,OAAO,GAAE,oBAAyB,GACjC,CAAC,CAsNH"}
package/dist/openai.js CHANGED
@@ -32,7 +32,7 @@ import { ObservationLevel } from '@illuma-ai/observability-core';
32
32
  * ```
33
33
  */
34
34
  export function observeOpenAI(openai, observability, options = {}) {
35
- const { traceName = 'openai-call', generationMetadata, userId, sessionId, } = options;
35
+ const { traceName = 'openai-call', generationMetadata, userId, sessionId, environment, } = options;
36
36
  /**
37
37
  * Wrap a create function to auto-instrument it with tracing.
38
38
  * Handles both chat.completions.create and completions.create.
@@ -47,6 +47,7 @@ export function observeOpenAI(openai, observability, options = {}) {
47
47
  input: params,
48
48
  userId,
49
49
  sessionId,
50
+ ...(environment ? { metadata: { environment } } : {}),
50
51
  });
51
52
  try {
52
53
  // Call the original OpenAI method
@@ -54,11 +55,13 @@ export function observeOpenAI(openai, observability, options = {}) {
54
55
  const endTime = new Date().toISOString();
55
56
  if (kind === 'chat') {
56
57
  const response = result;
58
+ const firstChoice = response.choices?.[0];
57
59
  trace.generation({
58
60
  name: `chat.completions.create`,
61
+ provider: 'openai',
59
62
  model: params.model ?? response.model,
60
63
  input: params.messages,
61
- output: response.choices?.[0]?.message,
64
+ output: firstChoice?.message,
62
65
  startTime,
63
66
  endTime,
64
67
  modelParameters: extractModelParams(params),
@@ -69,10 +72,13 @@ export function observeOpenAI(openai, observability, options = {}) {
69
72
  total: response.usage.total_tokens,
70
73
  }
71
74
  : undefined,
75
+ usageDetails: response.usage ? buildUsageDetails(response.usage) : undefined,
72
76
  metadata: {
73
77
  ...generationMetadata,
74
78
  openai_id: response.id,
75
- finish_reason: response.choices?.[0]?.finish_reason,
79
+ finish_reason: firstChoice?.finish_reason,
80
+ ...(firstChoice?.message?.tool_calls ? { tool_calls: firstChoice.message.tool_calls } : {}),
81
+ ...(firstChoice?.message?.function_call ? { function_call: firstChoice.message.function_call } : {}),
76
82
  },
77
83
  });
78
84
  }
@@ -80,6 +86,7 @@ export function observeOpenAI(openai, observability, options = {}) {
80
86
  const response = result;
81
87
  trace.generation({
82
88
  name: `completions.create`,
89
+ provider: 'openai',
83
90
  model: params.model ?? response.model,
84
91
  input: params.prompt,
85
92
  output: response.choices?.[0]?.text,
@@ -93,6 +100,7 @@ export function observeOpenAI(openai, observability, options = {}) {
93
100
  total: response.usage.total_tokens,
94
101
  }
95
102
  : undefined,
103
+ usageDetails: response.usage ? buildUsageDetails(response.usage) : undefined,
96
104
  metadata: {
97
105
  ...generationMetadata,
98
106
  openai_id: response.id,
@@ -107,6 +115,7 @@ export function observeOpenAI(openai, observability, options = {}) {
107
115
  // Record the failed generation
108
116
  trace.generation({
109
117
  name: kind === 'chat' ? 'chat.completions.create' : 'completions.create',
118
+ provider: 'openai',
110
119
  model: params.model,
111
120
  input: kind === 'chat' ? params.messages : params.prompt,
112
121
  startTime,
@@ -120,6 +129,26 @@ export function observeOpenAI(openai, observability, options = {}) {
120
129
  }
121
130
  };
122
131
  }
132
+ /**
133
+ * Build UsageDetailsParams from raw usage, filtering to numeric-only values.
134
+ */
135
+ function buildUsageDetails(usage) {
136
+ const details = {};
137
+ for (const [key, value] of Object.entries(usage)) {
138
+ if (typeof value === 'number') {
139
+ details[key] = value;
140
+ }
141
+ else if (typeof value === 'object' && value !== null) {
142
+ // Flatten nested objects like prompt_tokens_details
143
+ for (const [subKey, subValue] of Object.entries(value)) {
144
+ if (typeof subValue === 'number') {
145
+ details[`${key}.${subKey}`] = subValue;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return details;
151
+ }
123
152
  /**
124
153
  * Extract common model parameters from OpenAI request params.
125
154
  */
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"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"}
package/dist/otel.d.ts ADDED
@@ -0,0 +1,119 @@
1
+ /**
2
+ * OpenTelemetry span processor that converts OTel spans to Illuma Observe traces.
3
+ * Drop-in replacement for @langfuse/otel's LangfuseSpanProcessor.
4
+ *
5
+ * Supports both OpenTelemetry Semantic Conventions for GenAI (`gen_ai.*`)
6
+ * and Vercel AI SDK conventions (`ai.*`).
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
11
+ * import { IllumaSpanProcessor } from '@illuma-ai/observability-node/otel';
12
+ *
13
+ * const provider = new NodeTracerProvider();
14
+ * provider.addSpanProcessor(new IllumaSpanProcessor({
15
+ * // Reads from ILLUMA_* / LANGFUSE_* env vars if omitted
16
+ * }));
17
+ * provider.register();
18
+ * ```
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ import { type ObservabilityOptions } from './client.js';
23
+ /** Minimal representation of an OTel SpanContext. */
24
+ interface OTelSpanContext {
25
+ traceId: string;
26
+ spanId: string;
27
+ }
28
+ /**
29
+ * Minimal OTel Span interface.
30
+ * Only the fields we actually read are declared here.
31
+ */
32
+ interface OTelSpan {
33
+ spanContext(): OTelSpanContext;
34
+ parentSpanId?: string;
35
+ name: string;
36
+ kind: number;
37
+ startTime: [number, number];
38
+ endTime: [number, number];
39
+ status: {
40
+ code: number;
41
+ message?: string;
42
+ };
43
+ attributes: Record<string, unknown>;
44
+ events: Array<{
45
+ name: string;
46
+ attributes?: Record<string, unknown>;
47
+ time?: [number, number];
48
+ }>;
49
+ }
50
+ /**
51
+ * Minimal OTel ReadableSpan interface.
52
+ * Identical to OTelSpan for our purposes — some OTel versions split the type.
53
+ */
54
+ interface OTelReadableSpan extends OTelSpan {
55
+ }
56
+ /**
57
+ * Options for the IllumaSpanProcessor.
58
+ * Extends ObservabilityOptions so all client-level settings are available.
59
+ */
60
+ export interface IllumaSpanProcessorOptions extends ObservabilityOptions {
61
+ }
62
+ /**
63
+ * OpenTelemetry SpanProcessor that converts OTel spans into Illuma Observe
64
+ * traces and observations (generations / spans).
65
+ *
66
+ * Implements the four-method SpanProcessor contract:
67
+ * - `onStart(span)` — no-op; we process completed spans only
68
+ * - `onEnd(span)` — converts the span to Illuma trace / generation / span
69
+ * - `shutdown()` — flushes and tears down the underlying Observability client
70
+ * - `forceFlush()` — flushes all buffered events immediately
71
+ *
72
+ * Attribute mapping (GenAI Semantic Conventions + Vercel AI SDK):
73
+ * gen_ai.system -> provider
74
+ * gen_ai.request.model / response.model -> model
75
+ * gen_ai.usage.input_tokens / ai.usage.promptTokens -> usage.input
76
+ * gen_ai.usage.output_tokens / ai.usage.completionTokens -> usage.output
77
+ * gen_ai.prompt / ai.prompt.* -> input
78
+ * ai.response.text -> output
79
+ * exception span events -> errorInfo
80
+ */
81
+ export declare class IllumaSpanProcessor {
82
+ private readonly observability;
83
+ /**
84
+ * Maps OTel traceId -> IllumaTraceClient so child spans within the same
85
+ * trace reuse the same Illuma trace.
86
+ */
87
+ private readonly traceMap;
88
+ /**
89
+ * Maps OTel spanId -> Illuma observationId so child spans can reference
90
+ * their parent observation.
91
+ */
92
+ private readonly spanIdMap;
93
+ constructor(options?: IllumaSpanProcessorOptions);
94
+ /**
95
+ * Called when a span is started.
96
+ * No-op — we only process spans once they are complete (in `onEnd`).
97
+ *
98
+ * @param _span - The started span (unused).
99
+ */
100
+ onStart(_span: OTelSpan): void;
101
+ /**
102
+ * Called when a span ends. Converts the OTel span into Illuma Observe
103
+ * trace / generation / span events.
104
+ *
105
+ * @param span - The completed OTel span.
106
+ */
107
+ onEnd(span: OTelReadableSpan): void;
108
+ /**
109
+ * Flush all buffered events and shut down the underlying Observability client.
110
+ * After this call, no further spans should be processed.
111
+ */
112
+ shutdown(): Promise<void>;
113
+ /**
114
+ * Force-flush all buffered events without shutting down.
115
+ */
116
+ forceFlush(): Promise<void>;
117
+ }
118
+ export {};
119
+ //# sourceMappingURL=otel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQvE,qDAAqD;AACrD,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,UAAU,QAAQ;IAChB,WAAW,IAAI,eAAe,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,UAAU,gBAAiB,SAAQ,QAAQ;CAAG;AAM9C;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;CAAG;AAE3E;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,OAAO,GAAE,0BAA+B;IAQpD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI9B;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAqFnC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}