@introspection-sdk/introspection-node 0.14.0 → 0.16.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @introspection-sdk/introspection-node@0.14.0 build /home/runner/work/introspection-js-sdk/introspection-js-sdk/packages/introspection-node
2
+ > @introspection-sdk/introspection-node@0.16.0 build /home/runner/work/introspection-js-sdk/introspection-js-sdk/packages/introspection-node
3
3
  > tsc
4
4
 
@@ -13,6 +13,8 @@ export { setupTracing } from "./setup.js";
13
13
  export type { SetupTracingOptions, ConflictBehavior } from "./setup.js";
14
14
  export { IntrospectionSpanProcessor } from "./span-processor.js";
15
15
  export type { IntrospectionSpanProcessorOptions } from "./span-processor.js";
16
+ export { tracedEmbeddingsCreate } from "./openai.js";
17
+ export type { OpenAIEmbeddingsClient, TracedEmbeddingsOptions, } from "./openai.js";
16
18
  export { IntrospectionTracingProcessor } from "./tracing-processor.js";
17
19
  export type { IntrospectionTracingProcessorOptions, TracingProcessorAdvancedOptions, } from "./tracing-processor.js";
18
20
  export { IntrospectionClaudeHooks } from "./claude-hooks.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EACV,oCAAoC,EACpC,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AACtD,YAAY,EACV,kCAAkC,EAClC,SAAS,IAAI,WAAW,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EACV,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EACV,oCAAoC,EACpC,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AACtD,YAAY,EACV,kCAAkC,EAClC,SAAS,IAAI,WAAW,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}
@@ -15,6 +15,8 @@ export { IntrospectionLogs } from "./logs.js";
15
15
  export { setupTracing } from "./setup.js";
16
16
  // Span processor — attach to your own TracerProvider.
17
17
  export { IntrospectionSpanProcessor } from "./span-processor.js";
18
+ // OpenAI embeddings wrapper (metadata-only; never records inputs or vectors).
19
+ export { tracedEmbeddingsCreate } from "./openai.js";
18
20
  // OpenAI Agents SDK tracing processor.
19
21
  export { IntrospectionTracingProcessor } from "./tracing-processor.js";
20
22
  // Claude Agent SDK hooks.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,4EAA4E;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,uEAAuE;AACvE,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,sDAAsD;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,uCAAuC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAMvE,0BAA0B;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAiB7D,4BAA4B;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,8BAA8B;AAC9B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,6BAA6B;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAMtD,2BAA2B;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,sEAAsE;AACtE,iCAAiC;AACjC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,2EAA2E;AAC3E,6EAA6E;AAC7E,2CAA2C;AAC3C,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,4DAA4D;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,mEAAmE;AACnE,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,4EAA4E;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,uEAAuE;AACvE,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,sDAAsD;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,8EAA8E;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAMrD,uCAAuC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAMvE,0BAA0B;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAiB7D,4BAA4B;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,8BAA8B;AAC9B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,6BAA6B;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAMtD,2BAA2B;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,sEAAsE;AACtE,iCAAiC;AACjC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,2EAA2E;AAC3E,6EAA6E;AAC7E,2CAA2C;AAC3C,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,4DAA4D;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,mEAAmE;AACnE,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Privacy-preserving OpenAI embeddings instrumentation. */
2
+ import { type Tracer } from "@opentelemetry/api";
3
+ import type { CreateEmbeddingResponse, EmbeddingCreateParams } from "openai/resources/embeddings";
4
+ /** The narrow OpenAI client surface required by the embedding wrapper. */
5
+ export interface OpenAIEmbeddingsClient {
6
+ embeddings: {
7
+ create(params: EmbeddingCreateParams): Promise<CreateEmbeddingResponse>;
8
+ };
9
+ }
10
+ export interface TracedEmbeddingsOptions {
11
+ /** GenAI provider name. Defaults to `openai`. */
12
+ providerName?: string;
13
+ }
14
+ /**
15
+ * Call `client.embeddings.create` and emit a metadata-only GenAI span.
16
+ *
17
+ * Inputs and embedding vectors are deliberately never attached to the span.
18
+ */
19
+ export declare function tracedEmbeddingsCreate(tracer: Tracer, client: OpenAIEmbeddingsClient, params: EmbeddingCreateParams, options?: TracedEmbeddingsOptions): Promise<CreateEmbeddingResponse>;
20
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/otel/openai.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC,0EAA0E;AAC1E,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE;QACV,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;KACzE,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAsClC"}
@@ -0,0 +1,55 @@
1
+ /** Privacy-preserving OpenAI embeddings instrumentation. */
2
+ import { context, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
3
+ function setResponseAttributes(span, response) {
4
+ span.setAttribute("gen_ai.response.model", response.model);
5
+ span.setAttribute("gen_ai.usage.input_tokens", response.usage.prompt_tokens);
6
+ const firstEmbedding = response.data[0]?.embedding;
7
+ if (Array.isArray(firstEmbedding)) {
8
+ span.setAttribute("gen_ai.embeddings.dimension.count", firstEmbedding.length);
9
+ }
10
+ span.setStatus({ code: SpanStatusCode.OK });
11
+ }
12
+ /**
13
+ * Call `client.embeddings.create` and emit a metadata-only GenAI span.
14
+ *
15
+ * Inputs and embedding vectors are deliberately never attached to the span.
16
+ */
17
+ export async function tracedEmbeddingsCreate(tracer, client, params, options = {}) {
18
+ const providerName = options.providerName ?? "openai";
19
+ const span = tracer.startSpan(`embeddings ${params.model}`, {
20
+ kind: SpanKind.CLIENT,
21
+ attributes: {
22
+ "gen_ai.system": providerName,
23
+ "gen_ai.provider.name": providerName,
24
+ "gen_ai.operation.name": "embeddings",
25
+ "gen_ai.request.model": params.model,
26
+ "openinference.span.kind": "EMBEDDING",
27
+ ...(params.dimensions !== undefined
28
+ ? { "gen_ai.embeddings.dimension.count": params.dimensions }
29
+ : undefined),
30
+ ...(params.encoding_format
31
+ ? { "gen_ai.request.encoding_formats": [params.encoding_format] }
32
+ : undefined),
33
+ },
34
+ });
35
+ try {
36
+ return await context.with(trace.setSpan(context.active(), span), async () => {
37
+ const response = await client.embeddings.create(params);
38
+ setResponseAttributes(span, response);
39
+ return response;
40
+ });
41
+ }
42
+ catch (error) {
43
+ span.setStatus({
44
+ code: SpanStatusCode.ERROR,
45
+ message: error instanceof Error ? error.message : String(error),
46
+ });
47
+ if (error instanceof Error)
48
+ span.recordException(error);
49
+ throw error;
50
+ }
51
+ finally {
52
+ span.end();
53
+ }
54
+ }
55
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/otel/openai.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EACL,OAAO,EACP,QAAQ,EACR,cAAc,EACd,KAAK,GAGN,MAAM,oBAAoB,CAAC;AAkB5B,SAAS,qBAAqB,CAC5B,IAAU,EACV,QAAiC;IAEjC,IAAI,CAAC,YAAY,CAAC,uBAAuB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,YAAY,CAAC,2BAA2B,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE7E,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CACf,mCAAmC,EACnC,cAAc,CAAC,MAAM,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,MAA8B,EAC9B,MAA6B,EAC7B,UAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,MAAM,CAAC,KAAK,EAAE,EAAE;QAC1D,IAAI,EAAE,QAAQ,CAAC,MAAM;QACrB,UAAU,EAAE;YACV,eAAe,EAAE,YAAY;YAC7B,sBAAsB,EAAE,YAAY;YACpC,uBAAuB,EAAE,YAAY;YACrC,sBAAsB,EAAE,MAAM,CAAC,KAAK;YACpC,yBAAyB,EAAE,WAAW;YACtC,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE,mCAAmC,EAAE,MAAM,CAAC,UAAU,EAAE;gBAC5D,CAAC,CAAC,SAAS,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,eAAe;gBACxB,CAAC,CAAC,EAAE,iCAAiC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;gBACjE,CAAC,CAAC,SAAS,CAAC;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CACvB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EACrC,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,OAAO,QAAQ,CAAC;QAClB,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,cAAc,CAAC,KAAK;YAC1B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;QACH,IAAI,KAAK,YAAY,KAAK;YAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
package/dist/otel/pi.d.ts CHANGED
@@ -43,7 +43,8 @@ export declare class IntrospectionPiInstrumentor {
43
43
  constructor(opts?: IntrospectionPiInstrumentorOptions);
44
44
  /**
45
45
  * Instrument a pi {@link Agent}:
46
- * - Wraps `agent.streamFn` to emit a `chat ${provider}` span per LLM call.
46
+ * - Wraps the agent stream function to emit a `chat ${provider}` span per
47
+ * LLM call.
47
48
  * - Subscribes to the agent loop to emit an `execute_tool ${name}` span per
48
49
  * tool execution.
49
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,WAAW,kCAAkC;IACjD,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,IAAI,GAAE,kCAAuC;IAOzD;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAU/C;;OAEG;IACH,IAAI,IAAI,IAAI;CAIb"}
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,WAAW,kCAAkC;IACjD,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,IAAI,GAAE,kCAAuC;IAOzD;;;;;;;;;OASG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAe/C;;OAEG;IACH,IAAI,IAAI,IAAI;CAIb"}
package/dist/otel/pi.js CHANGED
@@ -41,7 +41,8 @@ export class IntrospectionPiInstrumentor {
41
41
  }
42
42
  /**
43
43
  * Instrument a pi {@link Agent}:
44
- * - Wraps `agent.streamFn` to emit a `chat ${provider}` span per LLM call.
44
+ * - Wraps the agent stream function to emit a `chat ${provider}` span per
45
+ * LLM call.
45
46
  * - Subscribes to the agent loop to emit an `execute_tool ${name}` span per
46
47
  * tool execution.
47
48
  *
@@ -49,7 +50,9 @@ export class IntrospectionPiInstrumentor {
49
50
  * @param meta - Identity metadata stamped on every span produced by this agent.
50
51
  */
51
52
  instrument(agent, meta) {
52
- agent.streamFn = instrumentStream(agent.streamFn, {
53
+ const key = "streamFunction" in agent ? "streamFunction" : "streamFn";
54
+ const instrumentable = agent;
55
+ instrumentable[key] = instrumentStream(instrumentable[key], {
53
56
  tracer: this._tracer,
54
57
  meta,
55
58
  });
@@ -1 +1 @@
1
- {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EACL,gBAAgB,EAChB,eAAe,GAGhB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AASxC;;;;;;GAMG;AACH,MAAM,OAAO,2BAA2B;IAC9B,OAAO,CAAqC;IAC5C,iBAAiB,GAA2B,EAAE,CAAC;IAEvD,YAAY,OAA2C,EAAE;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAC5B,IAAI,CAAC,UAAU,IAAI,kBAAkB,EACrC,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAY,EAAE,IAAe;QACtC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE;YAChD,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EACL,gBAAgB,EAChB,eAAe,GAGhB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AASxC;;;;;;GAMG;AACH,MAAM,OAAO,2BAA2B;IAC9B,OAAO,CAAqC;IAC5C,iBAAiB,GAA2B,EAAE,CAAC;IAEvD,YAAY,OAA2C,EAAE;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAC5B,IAAI,CAAC,UAAU,IAAI,kBAAkB,EACrC,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,UAAU,CAAC,KAAY,EAAE,IAAe;QACtC,MAAM,GAAG,GAAG,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;QACtE,MAAM,cAAc,GAAG,KAGtB,CAAC;QACF,cAAc,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;YAC1D,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@introspection-sdk/introspection-node",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Introspection observability SDK for Node.js",
6
6
  "engines": {
@@ -34,13 +34,13 @@
34
34
  "devDependencies": {
35
35
  "@anthropic-ai/claude-agent-sdk": "^0.3.220",
36
36
  "@anthropic-ai/sdk": "^0.115.0",
37
- "@earendil-works/pi-agent-core": "^0.80.10",
38
- "@earendil-works/pi-ai": "^0.80.10",
39
- "@google/genai": "^2.13.0",
40
- "@langchain/core": "^1.2.3",
41
- "@mastra/core": "^1.52.1",
42
- "@mastra/observability": "^1.16.2",
43
- "@openai/agents": "^0.13.5",
37
+ "@earendil-works/pi-agent-core": "^0.83.0",
38
+ "@earendil-works/pi-ai": "^0.83.0",
39
+ "@google/genai": "^2.15.0",
40
+ "@langchain/core": "^1.2.4",
41
+ "@mastra/core": "^1.55.0",
42
+ "@mastra/observability": "^1.16.3",
43
+ "@openai/agents": "^0.14.1",
44
44
  "@opentelemetry/api-logs": "^0.221.0",
45
45
  "@opentelemetry/context-async-hooks": "^2.10.0",
46
46
  "@opentelemetry/core": "^2.10.0",
@@ -52,12 +52,12 @@
52
52
  "@opentelemetry/sdk-trace-node": "^2.10.0",
53
53
  "@opentelemetry/semantic-conventions": "^1.43.0",
54
54
  "@types/node": "^22.20.1",
55
- "ai": "^6.0.235",
55
+ "ai": "^6.0.238",
56
56
  "eslint": "^9.39.5",
57
57
  "openai": "^6.49.0",
58
58
  "typescript": "5.9.3",
59
- "@repo/eslint-config": "0.0.0",
60
- "@repo/typescript-config": "0.0.0"
59
+ "@repo/typescript-config": "0.0.0",
60
+ "@repo/eslint-config": "0.0.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "@anthropic-ai/claude-agent-sdk": ">=0.2.0",
@@ -67,6 +67,7 @@
67
67
  "@mastra/core": ">=1.0.0",
68
68
  "@mastra/observability": ">=1.0.0",
69
69
  "@openai/agents": ">=0.0.1",
70
+ "openai": ">=4.0.0",
70
71
  "@opentelemetry/api-logs": ">=0.50.0",
71
72
  "@opentelemetry/context-async-hooks": ">=1.20.0 || >=2.0.0",
72
73
  "@opentelemetry/core": ">=1.20.0 || >=2.0.0",
@@ -83,6 +84,9 @@
83
84
  "@openai/agents": {
84
85
  "optional": true
85
86
  },
87
+ "openai": {
88
+ "optional": true
89
+ },
86
90
  "@anthropic-ai/claude-agent-sdk": {
87
91
  "optional": true
88
92
  },
@@ -139,10 +143,10 @@
139
143
  "@opentelemetry/api": "^1.9.1",
140
144
  "https-proxy-agent": "^7.0.6",
141
145
  "proxy-from-env": "^2.1.0",
142
- "@introspection-sdk/http": "0.14.0",
143
- "@introspection-sdk/introspection-pi": "0.14.0",
144
- "@introspection-sdk/introspection-proxy": "0.14.0",
145
- "@introspection-sdk/types": "0.14.0"
146
+ "@introspection-sdk/introspection-proxy": "0.16.0",
147
+ "@introspection-sdk/introspection-pi": "0.16.0",
148
+ "@introspection-sdk/http": "0.16.0",
149
+ "@introspection-sdk/types": "0.16.0"
146
150
  },
147
151
  "scripts": {
148
152
  "lint": "eslint . --max-warnings 0",
package/src/otel/index.ts CHANGED
@@ -22,6 +22,13 @@ export type { SetupTracingOptions, ConflictBehavior } from "./setup.js";
22
22
  export { IntrospectionSpanProcessor } from "./span-processor.js";
23
23
  export type { IntrospectionSpanProcessorOptions } from "./span-processor.js";
24
24
 
25
+ // OpenAI embeddings wrapper (metadata-only; never records inputs or vectors).
26
+ export { tracedEmbeddingsCreate } from "./openai.js";
27
+ export type {
28
+ OpenAIEmbeddingsClient,
29
+ TracedEmbeddingsOptions,
30
+ } from "./openai.js";
31
+
25
32
  // OpenAI Agents SDK tracing processor.
26
33
  export { IntrospectionTracingProcessor } from "./tracing-processor.js";
27
34
  export type {
@@ -0,0 +1,93 @@
1
+ /** Privacy-preserving OpenAI embeddings instrumentation. */
2
+
3
+ import {
4
+ context,
5
+ SpanKind,
6
+ SpanStatusCode,
7
+ trace,
8
+ type Span,
9
+ type Tracer,
10
+ } from "@opentelemetry/api";
11
+ import type {
12
+ CreateEmbeddingResponse,
13
+ EmbeddingCreateParams,
14
+ } from "openai/resources/embeddings";
15
+
16
+ /** The narrow OpenAI client surface required by the embedding wrapper. */
17
+ export interface OpenAIEmbeddingsClient {
18
+ embeddings: {
19
+ create(params: EmbeddingCreateParams): Promise<CreateEmbeddingResponse>;
20
+ };
21
+ }
22
+
23
+ export interface TracedEmbeddingsOptions {
24
+ /** GenAI provider name. Defaults to `openai`. */
25
+ providerName?: string;
26
+ }
27
+
28
+ function setResponseAttributes(
29
+ span: Span,
30
+ response: CreateEmbeddingResponse,
31
+ ): void {
32
+ span.setAttribute("gen_ai.response.model", response.model);
33
+ span.setAttribute("gen_ai.usage.input_tokens", response.usage.prompt_tokens);
34
+
35
+ const firstEmbedding = response.data[0]?.embedding;
36
+ if (Array.isArray(firstEmbedding)) {
37
+ span.setAttribute(
38
+ "gen_ai.embeddings.dimension.count",
39
+ firstEmbedding.length,
40
+ );
41
+ }
42
+ span.setStatus({ code: SpanStatusCode.OK });
43
+ }
44
+
45
+ /**
46
+ * Call `client.embeddings.create` and emit a metadata-only GenAI span.
47
+ *
48
+ * Inputs and embedding vectors are deliberately never attached to the span.
49
+ */
50
+ export async function tracedEmbeddingsCreate(
51
+ tracer: Tracer,
52
+ client: OpenAIEmbeddingsClient,
53
+ params: EmbeddingCreateParams,
54
+ options: TracedEmbeddingsOptions = {},
55
+ ): Promise<CreateEmbeddingResponse> {
56
+ const providerName = options.providerName ?? "openai";
57
+ const span = tracer.startSpan(`embeddings ${params.model}`, {
58
+ kind: SpanKind.CLIENT,
59
+ attributes: {
60
+ "gen_ai.system": providerName,
61
+ "gen_ai.provider.name": providerName,
62
+ "gen_ai.operation.name": "embeddings",
63
+ "gen_ai.request.model": params.model,
64
+ "openinference.span.kind": "EMBEDDING",
65
+ ...(params.dimensions !== undefined
66
+ ? { "gen_ai.embeddings.dimension.count": params.dimensions }
67
+ : undefined),
68
+ ...(params.encoding_format
69
+ ? { "gen_ai.request.encoding_formats": [params.encoding_format] }
70
+ : undefined),
71
+ },
72
+ });
73
+
74
+ try {
75
+ return await context.with(
76
+ trace.setSpan(context.active(), span),
77
+ async () => {
78
+ const response = await client.embeddings.create(params);
79
+ setResponseAttributes(span, response);
80
+ return response;
81
+ },
82
+ );
83
+ } catch (error) {
84
+ span.setStatus({
85
+ code: SpanStatusCode.ERROR,
86
+ message: error instanceof Error ? error.message : String(error),
87
+ });
88
+ if (error instanceof Error) span.recordException(error);
89
+ throw error;
90
+ } finally {
91
+ span.end();
92
+ }
93
+ }
package/src/otel/pi.ts CHANGED
@@ -25,7 +25,7 @@
25
25
  */
26
26
 
27
27
  import { trace } from "@opentelemetry/api";
28
- import type { Agent } from "@earendil-works/pi-agent-core";
28
+ import type { Agent, StreamFn } from "@earendil-works/pi-agent-core";
29
29
  import {
30
30
  instrumentStream,
31
31
  instrumentAgent,
@@ -61,7 +61,8 @@ export class IntrospectionPiInstrumentor {
61
61
 
62
62
  /**
63
63
  * Instrument a pi {@link Agent}:
64
- * - Wraps `agent.streamFn` to emit a `chat ${provider}` span per LLM call.
64
+ * - Wraps the agent stream function to emit a `chat ${provider}` span per
65
+ * LLM call.
65
66
  * - Subscribes to the agent loop to emit an `execute_tool ${name}` span per
66
67
  * tool execution.
67
68
  *
@@ -69,7 +70,12 @@ export class IntrospectionPiInstrumentor {
69
70
  * @param meta - Identity metadata stamped on every span produced by this agent.
70
71
  */
71
72
  instrument(agent: Agent, meta: AgentMeta): void {
72
- agent.streamFn = instrumentStream(agent.streamFn, {
73
+ const key = "streamFunction" in agent ? "streamFunction" : "streamFn";
74
+ const instrumentable = agent as unknown as Record<
75
+ "streamFunction" | "streamFn",
76
+ StreamFn
77
+ >;
78
+ instrumentable[key] = instrumentStream(instrumentable[key], {
73
79
  tracer: this._tracer,
74
80
  meta,
75
81
  });