@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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/otel/index.d.ts +2 -0
- package/dist/otel/index.d.ts.map +1 -1
- package/dist/otel/index.js +2 -0
- package/dist/otel/index.js.map +1 -1
- package/dist/otel/openai.d.ts +20 -0
- package/dist/otel/openai.d.ts.map +1 -0
- package/dist/otel/openai.js +55 -0
- package/dist/otel/openai.js.map +1 -0
- package/dist/otel/pi.d.ts +2 -1
- package/dist/otel/pi.d.ts.map +1 -1
- package/dist/otel/pi.js +5 -2
- package/dist/otel/pi.js.map +1 -1
- package/package.json +19 -15
- package/src/otel/index.ts +7 -0
- package/src/otel/openai.ts +93 -0
- package/src/otel/pi.ts +9 -3
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @introspection-sdk/introspection-node@0.
|
|
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
|
|
package/dist/otel/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/otel/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/otel/index.js
CHANGED
|
@@ -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.
|
package/dist/otel/index.js.map
CHANGED
|
@@ -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
|
|
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
|
*
|
package/dist/otel/pi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,KAAK,
|
|
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
|
|
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
|
-
|
|
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
|
});
|
package/dist/otel/pi.js.map
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
38
|
-
"@earendil-works/pi-ai": "^0.
|
|
39
|
-
"@google/genai": "^2.
|
|
40
|
-
"@langchain/core": "^1.2.
|
|
41
|
-
"@mastra/core": "^1.
|
|
42
|
-
"@mastra/observability": "^1.16.
|
|
43
|
-
"@openai/agents": "^0.
|
|
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.
|
|
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/
|
|
60
|
-
"@repo/
|
|
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/
|
|
143
|
-
"@introspection-sdk/introspection-pi": "0.
|
|
144
|
-
"@introspection-sdk/
|
|
145
|
-
"@introspection-sdk/types": "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
|
|
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
|
-
|
|
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
|
});
|