@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.
- package/dist/anthropic.d.ts +60 -0
- package/dist/anthropic.d.ts.map +1 -0
- package/dist/anthropic.js +164 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/client.d.ts +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/openai.d.ts +2 -0
- package/dist/openai.d.ts.map +1 -1
- package/dist/openai.js +32 -3
- package/dist/openai.js.map +1 -1
- package/dist/otel.d.ts +119 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +405 -0
- package/dist/otel.js.map +1 -0
- package/dist/track.d.ts +126 -0
- package/dist/track.d.ts.map +1 -0
- package/dist/track.js +303 -0
- package/dist/track.js.map +1 -0
- package/package.json +12 -4
|
@@ -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) */
|
package/dist/client.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
package/dist/client.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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 {
|
|
25
|
-
export type {
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
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
|
|
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
|
-
|
|
25
|
-
export {
|
|
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;
|
|
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.
|
package/dist/openai.d.ts.map
CHANGED
|
@@ -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;
|
|
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:
|
|
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:
|
|
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
|
*/
|
package/dist/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
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"}
|