@introspection-sdk/introspection-node 0.20.0 → 0.21.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/README.md +28 -8
- package/dist/auth.d.ts +1 -1
- package/dist/client.d.ts +4 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -7
- package/dist/client.js.map +1 -1
- package/dist/dev-target.js +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/otel/index.d.ts +1 -14
- package/dist/otel/index.d.ts.map +1 -1
- package/dist/otel/index.js +10 -18
- package/dist/otel/index.js.map +1 -1
- package/dist/otel/init.d.ts +19 -21
- package/dist/otel/init.d.ts.map +1 -1
- package/dist/otel/init.js +62 -48
- package/dist/otel/init.js.map +1 -1
- package/dist/otel/integrations/base.d.ts +17 -37
- package/dist/otel/integrations/base.d.ts.map +1 -1
- package/dist/otel/integrations/base.js +6 -13
- package/dist/otel/integrations/base.js.map +1 -1
- package/dist/otel/integrations/index.d.ts +3 -4
- package/dist/otel/integrations/index.d.ts.map +1 -1
- package/dist/otel/integrations/index.js +6 -25
- package/dist/otel/integrations/index.js.map +1 -1
- package/dist/otel/integrations/pi.d.ts.map +1 -1
- package/dist/otel/integrations/pi.js +9 -1
- package/dist/otel/integrations/pi.js.map +1 -1
- package/dist/otel/logs.d.ts +41 -8
- package/dist/otel/logs.d.ts.map +1 -1
- package/dist/otel/logs.js +95 -66
- package/dist/otel/logs.js.map +1 -1
- package/dist/otel/pi.d.ts +18 -5
- package/dist/otel/pi.d.ts.map +1 -1
- package/dist/otel/pi.js +38 -9
- package/dist/otel/pi.js.map +1 -1
- package/dist/otel/register.d.ts +2 -2
- package/dist/otel/register.d.ts.map +1 -1
- package/dist/otel/register.js +7 -9
- package/dist/otel/register.js.map +1 -1
- package/dist/otel/setup.d.ts +2 -2
- package/dist/otel/setup.d.ts.map +1 -1
- package/dist/otel/setup.js +16 -6
- package/dist/otel/setup.js.map +1 -1
- package/dist/otel/span-processor.d.ts +18 -5
- package/dist/otel/span-processor.d.ts.map +1 -1
- package/dist/otel/span-processor.js +50 -65
- package/dist/otel/span-processor.js.map +1 -1
- package/dist/resources/experiments.d.ts +10 -5
- package/dist/resources/experiments.d.ts.map +1 -1
- package/dist/resources/experiments.js +9 -25
- package/dist/resources/experiments.js.map +1 -1
- package/dist/resources/recipes.d.ts +6 -6
- package/dist/resources/recipes.d.ts.map +1 -1
- package/dist/resources/recipes.js +5 -23
- package/dist/resources/recipes.js.map +1 -1
- package/dist/resources/runtimes.d.ts +2 -2
- package/dist/resources/runtimes.d.ts.map +1 -1
- package/dist/resources/runtimes.js +2 -2
- package/dist/resources/runtimes.js.map +1 -1
- package/dist/runner.d.ts +8 -4
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +26 -18
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +45 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +61 -2
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +18 -60
- package/.turbo/turbo-build.log +0 -4
- package/dist/converters/claude.d.ts +0 -150
- package/dist/converters/claude.d.ts.map +0 -1
- package/dist/converters/claude.js +0 -211
- package/dist/converters/claude.js.map +0 -1
- package/dist/converters/gemini.d.ts +0 -90
- package/dist/converters/gemini.d.ts.map +0 -1
- package/dist/converters/gemini.js +0 -171
- package/dist/converters/gemini.js.map +0 -1
- package/dist/converters/index.d.ts +0 -9
- package/dist/converters/index.d.ts.map +0 -1
- package/dist/converters/index.js +0 -9
- package/dist/converters/index.js.map +0 -1
- package/dist/converters/openai.d.ts +0 -51
- package/dist/converters/openai.d.ts.map +0 -1
- package/dist/converters/openai.js +0 -269
- package/dist/converters/openai.js.map +0 -1
- package/dist/converters/openinference.d.ts +0 -107
- package/dist/converters/openinference.d.ts.map +0 -1
- package/dist/converters/openinference.js +0 -553
- package/dist/converters/openinference.js.map +0 -1
- package/dist/converters/vercel.d.ts +0 -21
- package/dist/converters/vercel.d.ts.map +0 -1
- package/dist/converters/vercel.js +0 -236
- package/dist/converters/vercel.js.map +0 -1
- package/dist/otel/anthropic.d.ts +0 -63
- package/dist/otel/anthropic.d.ts.map +0 -1
- package/dist/otel/anthropic.js +0 -475
- package/dist/otel/anthropic.js.map +0 -1
- package/dist/otel/claude-hooks.d.ts +0 -346
- package/dist/otel/claude-hooks.d.ts.map +0 -1
- package/dist/otel/claude-hooks.js +0 -647
- package/dist/otel/claude-hooks.js.map +0 -1
- package/dist/otel/claude-wrapper.d.ts +0 -93
- package/dist/otel/claude-wrapper.d.ts.map +0 -1
- package/dist/otel/claude-wrapper.js +0 -155
- package/dist/otel/claude-wrapper.js.map +0 -1
- package/dist/otel/gemini.d.ts +0 -56
- package/dist/otel/gemini.d.ts.map +0 -1
- package/dist/otel/gemini.js +0 -350
- package/dist/otel/gemini.js.map +0 -1
- package/dist/otel/integrations/anthropic.d.ts +0 -10
- package/dist/otel/integrations/anthropic.d.ts.map +0 -1
- package/dist/otel/integrations/anthropic.js +0 -26
- package/dist/otel/integrations/anthropic.js.map +0 -1
- package/dist/otel/integrations/claude-agent.d.ts +0 -12
- package/dist/otel/integrations/claude-agent.d.ts.map +0 -1
- package/dist/otel/integrations/claude-agent.js +0 -28
- package/dist/otel/integrations/claude-agent.js.map +0 -1
- package/dist/otel/integrations/gemini.d.ts +0 -11
- package/dist/otel/integrations/gemini.d.ts.map +0 -1
- package/dist/otel/integrations/gemini.js +0 -23
- package/dist/otel/integrations/gemini.js.map +0 -1
- package/dist/otel/integrations/langchain.d.ts +0 -15
- package/dist/otel/integrations/langchain.d.ts.map +0 -1
- package/dist/otel/integrations/langchain.js +0 -43
- package/dist/otel/integrations/langchain.js.map +0 -1
- package/dist/otel/integrations/mastra.d.ts +0 -14
- package/dist/otel/integrations/mastra.d.ts.map +0 -1
- package/dist/otel/integrations/mastra.js +0 -31
- package/dist/otel/integrations/mastra.js.map +0 -1
- package/dist/otel/integrations/openai-agents.d.ts +0 -11
- package/dist/otel/integrations/openai-agents.d.ts.map +0 -1
- package/dist/otel/integrations/openai-agents.js +0 -30
- package/dist/otel/integrations/openai-agents.js.map +0 -1
- package/dist/otel/integrations/vercel.d.ts +0 -14
- package/dist/otel/integrations/vercel.d.ts.map +0 -1
- package/dist/otel/integrations/vercel.js +0 -20
- package/dist/otel/integrations/vercel.js.map +0 -1
- package/dist/otel/langchain-handler.d.ts +0 -112
- package/dist/otel/langchain-handler.d.ts.map +0 -1
- package/dist/otel/langchain-handler.js +0 -561
- package/dist/otel/langchain-handler.js.map +0 -1
- package/dist/otel/mastra-exporter.d.ts +0 -87
- package/dist/otel/mastra-exporter.d.ts.map +0 -1
- package/dist/otel/mastra-exporter.js +0 -530
- package/dist/otel/mastra-exporter.js.map +0 -1
- package/dist/otel/openai.d.ts +0 -20
- package/dist/otel/openai.d.ts.map +0 -1
- package/dist/otel/openai.js +0 -55
- package/dist/otel/openai.js.map +0 -1
- package/dist/otel/tracing-processor.d.ts +0 -139
- package/dist/otel/tracing-processor.d.ts.map +0 -1
- package/dist/otel/tracing-processor.js +0 -434
- package/dist/otel/tracing-processor.js.map +0 -1
- package/eslint.config.mjs +0 -4
- package/src/auth.ts +0 -236
- package/src/client.ts +0 -163
- package/src/converters/claude.ts +0 -343
- package/src/converters/gemini.ts +0 -243
- package/src/converters/index.ts +0 -50
- package/src/converters/openai.ts +0 -300
- package/src/converters/openinference.ts +0 -665
- package/src/converters/vercel.ts +0 -302
- package/src/dev-target.ts +0 -79
- package/src/http.ts +0 -43
- package/src/index.ts +0 -277
- package/src/otel/anthropic.ts +0 -619
- package/src/otel/claude-hooks.ts +0 -1116
- package/src/otel/claude-wrapper.ts +0 -239
- package/src/otel/gemini.ts +0 -483
- package/src/otel/index.ts +0 -128
- package/src/otel/init.ts +0 -411
- package/src/otel/integrations/anthropic.ts +0 -36
- package/src/otel/integrations/base.ts +0 -158
- package/src/otel/integrations/claude-agent.ts +0 -36
- package/src/otel/integrations/gemini.ts +0 -30
- package/src/otel/integrations/index.ts +0 -152
- package/src/otel/integrations/langchain.ts +0 -60
- package/src/otel/integrations/mastra.ts +0 -48
- package/src/otel/integrations/openai-agents.ts +0 -47
- package/src/otel/integrations/pi.ts +0 -28
- package/src/otel/integrations/vercel.ts +0 -26
- package/src/otel/langchain-handler.ts +0 -804
- package/src/otel/logs.ts +0 -395
- package/src/otel/mastra-exporter.ts +0 -714
- package/src/otel/openai.ts +0 -93
- package/src/otel/pi.ts +0 -94
- package/src/otel/register.ts +0 -50
- package/src/otel/setup.ts +0 -215
- package/src/otel/span-processor.ts +0 -512
- package/src/otel/tracing-processor.ts +0 -637
- package/src/pagination.ts +0 -10
- package/src/proxy-from-env.d.ts +0 -7
- package/src/resources/experiments.ts +0 -176
- package/src/resources/recipes.ts +0 -74
- package/src/resources/runtimes.ts +0 -31
- package/src/runner.ts +0 -213
- package/src/types.ts +0 -13
- package/src/utils.ts +0 -95
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -8
package/src/otel/logs.ts
DELETED
|
@@ -1,395 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IntrospectionLogs — OTel logs exporter for Introspection.
|
|
3
|
-
*
|
|
4
|
-
* Owns its own `LoggerProvider` and OTLP log exporter. Provides `track`,
|
|
5
|
-
* `feedback`, `identify`, and async-context helpers (`withBaggage`,
|
|
6
|
-
* `withAgent`, `withConversation`, etc.) that propagate identity and
|
|
7
|
-
* gen_ai context through OpenTelemetry baggage.
|
|
8
|
-
*
|
|
9
|
-
* Fully independent of {@link IntrospectionClient}. Construct it directly
|
|
10
|
-
* with the OTel peer dependencies installed.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* import { IntrospectionLogs } from "@introspection-sdk/introspection-node/otel";
|
|
15
|
-
*
|
|
16
|
-
* const logs = new IntrospectionLogs({
|
|
17
|
-
* token: process.env.INTROSPECTION_TOKEN,
|
|
18
|
-
* serviceName: "my-service",
|
|
19
|
-
* });
|
|
20
|
-
*
|
|
21
|
-
* await logs.withAgent("support-bot", "agent_1", () =>
|
|
22
|
-
* logs.withConversation("conv_123", undefined, () => {
|
|
23
|
-
* logs.feedback("thumbs_up", { comments: "Great answer" });
|
|
24
|
-
* }),
|
|
25
|
-
* );
|
|
26
|
-
*
|
|
27
|
-
* await logs.shutdown();
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { SeverityNumber, type LogAttributes } from "@opentelemetry/api-logs";
|
|
32
|
-
import {
|
|
33
|
-
LoggerProvider,
|
|
34
|
-
BatchLogRecordProcessor,
|
|
35
|
-
} from "@opentelemetry/sdk-logs";
|
|
36
|
-
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-proto";
|
|
37
|
-
import {
|
|
38
|
-
resourceFromAttributes,
|
|
39
|
-
defaultResource,
|
|
40
|
-
} from "@opentelemetry/resources";
|
|
41
|
-
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
|
|
42
|
-
import { propagation, context } from "@opentelemetry/api";
|
|
43
|
-
|
|
44
|
-
import { logger as sdkLogger, withOtlpHttpsProxy } from "../utils.js";
|
|
45
|
-
import { VERSION } from "../version.js";
|
|
46
|
-
import {
|
|
47
|
-
generateEventId,
|
|
48
|
-
type FeedbackOptions,
|
|
49
|
-
type UserTraits,
|
|
50
|
-
type GenAiContext,
|
|
51
|
-
type IdentityContext,
|
|
52
|
-
} from "../types.js";
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Configuration for {@link IntrospectionLogs}.
|
|
56
|
-
*/
|
|
57
|
-
export interface IntrospectionLogsOptions {
|
|
58
|
-
/** Authentication token (env: INTROSPECTION_TOKEN). */
|
|
59
|
-
token?: string;
|
|
60
|
-
/** Service name for telemetry (env: INTROSPECTION_SERVICE_NAME, default: "introspection-client"). */
|
|
61
|
-
serviceName?: string;
|
|
62
|
-
/**
|
|
63
|
-
* Base URL for the OTLP collector (env: INTROSPECTION_BASE_OTEL_URL,
|
|
64
|
-
* default: "https://otel.introspection.dev").
|
|
65
|
-
*/
|
|
66
|
-
baseOtelUrl?: string;
|
|
67
|
-
/** Additional HTTP headers to include in exporter requests. */
|
|
68
|
-
additionalHeaders?: Record<string, string>;
|
|
69
|
-
/** Flush interval in milliseconds (default: 5000). */
|
|
70
|
-
flushInterval?: number;
|
|
71
|
-
/** Maximum queue size before auto-flush (default: 100). */
|
|
72
|
-
maxBatchSize?: number;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export class IntrospectionLogs {
|
|
76
|
-
private loggerProvider: LoggerProvider;
|
|
77
|
-
private otelLogger: ReturnType<LoggerProvider["getLogger"]>;
|
|
78
|
-
private userId: string | undefined;
|
|
79
|
-
private anonymousId: string | undefined;
|
|
80
|
-
private traits: Record<string, unknown> = {};
|
|
81
|
-
|
|
82
|
-
constructor(options: IntrospectionLogsOptions = {}) {
|
|
83
|
-
const token = options.token || process.env.INTROSPECTION_TOKEN || "";
|
|
84
|
-
const serviceName =
|
|
85
|
-
options.serviceName ||
|
|
86
|
-
process.env.INTROSPECTION_SERVICE_NAME ||
|
|
87
|
-
"introspection-client";
|
|
88
|
-
const baseOtelUrl =
|
|
89
|
-
options.baseOtelUrl ||
|
|
90
|
-
process.env.INTROSPECTION_BASE_OTEL_URL ||
|
|
91
|
-
"https://otel.introspection.dev";
|
|
92
|
-
|
|
93
|
-
if (!token) {
|
|
94
|
-
sdkLogger.warn(
|
|
95
|
-
"IntrospectionLogs: No token provided. Events will not be sent.",
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Construct endpoint URL for logs.
|
|
100
|
-
const endpoint = baseOtelUrl.endsWith("/v1/logs")
|
|
101
|
-
? baseOtelUrl
|
|
102
|
-
: `${baseOtelUrl.replace(/\/$/, "")}/v1/logs`;
|
|
103
|
-
|
|
104
|
-
const headers: Record<string, string> = {
|
|
105
|
-
Authorization: `Bearer ${token}`,
|
|
106
|
-
...(options.additionalHeaders || {}),
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const exporter = new OTLPLogExporter(
|
|
110
|
-
withOtlpHttpsProxy({
|
|
111
|
-
url: endpoint,
|
|
112
|
-
headers,
|
|
113
|
-
}),
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
const processor = new BatchLogRecordProcessor({
|
|
117
|
-
exporter,
|
|
118
|
-
maxQueueSize: options.maxBatchSize ?? 100,
|
|
119
|
-
scheduledDelayMillis: options.flushInterval ?? 5000,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const baseResource = defaultResource();
|
|
123
|
-
const introspectionResource = resourceFromAttributes({
|
|
124
|
-
[ATTR_SERVICE_NAME]: serviceName,
|
|
125
|
-
});
|
|
126
|
-
const resource = baseResource.merge(introspectionResource);
|
|
127
|
-
|
|
128
|
-
this.loggerProvider = new LoggerProvider({
|
|
129
|
-
resource,
|
|
130
|
-
processors: [processor],
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
this.otelLogger = this.loggerProvider.getLogger(
|
|
134
|
-
"@introspection-sdk/introspection-node",
|
|
135
|
-
VERSION,
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
sdkLogger.info(
|
|
139
|
-
`IntrospectionLogs initialized: service=${serviceName}, otlp=${endpoint}`,
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/** Get gen_ai context from baggage */
|
|
144
|
-
private getGenAiFromContext(): GenAiContext {
|
|
145
|
-
const baggage = propagation.getBaggage(context.active());
|
|
146
|
-
return {
|
|
147
|
-
conversationId: baggage?.getEntry("gen_ai.conversation.id")?.value,
|
|
148
|
-
previousResponseId: baggage?.getEntry(
|
|
149
|
-
"gen_ai.request.previous_response_id",
|
|
150
|
-
)?.value,
|
|
151
|
-
agentName: baggage?.getEntry("gen_ai.agent.name")?.value,
|
|
152
|
-
agentId: baggage?.getEntry("gen_ai.agent.id")?.value,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** Get identity from baggage or instance state */
|
|
157
|
-
private getIdentityFromContext(): IdentityContext {
|
|
158
|
-
const baggage = propagation.getBaggage(context.active());
|
|
159
|
-
return {
|
|
160
|
-
userId: baggage?.getEntry("identity.user_id")?.value || this.userId,
|
|
161
|
-
anonymousId:
|
|
162
|
-
baggage?.getEntry("identity.anonymous_id")?.value || this.anonymousId,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private getTimestamp(): [number, number] {
|
|
167
|
-
const hrTimeNs = process.hrtime.bigint();
|
|
168
|
-
const epochNs = BigInt(Date.now()) * BigInt(1_000_000);
|
|
169
|
-
const offsetNs = hrTimeNs - process.hrtime.bigint() + epochNs;
|
|
170
|
-
const seconds = Number(offsetNs / BigInt(1_000_000_000));
|
|
171
|
-
const nanos = Number(offsetNs % BigInt(1_000_000_000));
|
|
172
|
-
return [seconds, nanos];
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
private buildAttributes(
|
|
176
|
-
eventName: string,
|
|
177
|
-
options: {
|
|
178
|
-
properties?: Record<string, unknown>;
|
|
179
|
-
traits?: Record<string, unknown>;
|
|
180
|
-
conversationId?: string;
|
|
181
|
-
previousResponseId?: string;
|
|
182
|
-
eventId?: string;
|
|
183
|
-
} = {},
|
|
184
|
-
): LogAttributes {
|
|
185
|
-
const { properties, traits, conversationId, previousResponseId, eventId } =
|
|
186
|
-
options;
|
|
187
|
-
|
|
188
|
-
const attributes: LogAttributes = {
|
|
189
|
-
"event.name": eventName,
|
|
190
|
-
"event.id": eventId || generateEventId(),
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const identity = this.getIdentityFromContext();
|
|
194
|
-
if (identity.userId) attributes["identity.user.id"] = identity.userId;
|
|
195
|
-
if (identity.anonymousId)
|
|
196
|
-
attributes["identity.anonymous.id"] = identity.anonymousId;
|
|
197
|
-
|
|
198
|
-
const genAi = this.getGenAiFromContext();
|
|
199
|
-
const finalConversationId = conversationId || genAi.conversationId;
|
|
200
|
-
const finalPreviousResponseId =
|
|
201
|
-
previousResponseId || genAi.previousResponseId;
|
|
202
|
-
|
|
203
|
-
if (finalConversationId)
|
|
204
|
-
attributes["gen_ai.conversation.id"] = finalConversationId;
|
|
205
|
-
if (finalPreviousResponseId)
|
|
206
|
-
attributes["gen_ai.request.previous_response_id"] =
|
|
207
|
-
finalPreviousResponseId;
|
|
208
|
-
if (genAi.agentName) attributes["gen_ai.agent.name"] = genAi.agentName;
|
|
209
|
-
if (genAi.agentId) attributes["gen_ai.agent.id"] = genAi.agentId;
|
|
210
|
-
|
|
211
|
-
if (properties) {
|
|
212
|
-
for (const [key, value] of Object.entries(properties)) {
|
|
213
|
-
if (value != null) {
|
|
214
|
-
const attrKey = `properties.${key}`;
|
|
215
|
-
if (typeof value === "object") {
|
|
216
|
-
attributes[attrKey] = JSON.stringify(value);
|
|
217
|
-
} else if (
|
|
218
|
-
typeof value === "string" ||
|
|
219
|
-
typeof value === "number" ||
|
|
220
|
-
typeof value === "boolean"
|
|
221
|
-
) {
|
|
222
|
-
attributes[attrKey] = value;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (traits) {
|
|
229
|
-
for (const [key, value] of Object.entries(traits)) {
|
|
230
|
-
if (value != null) {
|
|
231
|
-
const attrKey = `context.traits.${key}`;
|
|
232
|
-
if (typeof value === "object") {
|
|
233
|
-
attributes[attrKey] = JSON.stringify(value);
|
|
234
|
-
} else if (
|
|
235
|
-
typeof value === "string" ||
|
|
236
|
-
typeof value === "number" ||
|
|
237
|
-
typeof value === "boolean"
|
|
238
|
-
) {
|
|
239
|
-
attributes[attrKey] = value;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return attributes;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
track(
|
|
249
|
-
eventName: string,
|
|
250
|
-
properties?: Record<string, unknown>,
|
|
251
|
-
options?: { eventId?: string },
|
|
252
|
-
): void {
|
|
253
|
-
const attributes = this.buildAttributes(eventName, {
|
|
254
|
-
properties,
|
|
255
|
-
eventId: options?.eventId,
|
|
256
|
-
});
|
|
257
|
-
this.otelLogger.emit({
|
|
258
|
-
timestamp: this.getTimestamp(),
|
|
259
|
-
context: context.active(),
|
|
260
|
-
severityNumber: SeverityNumber.INFO,
|
|
261
|
-
severityText: "INFO",
|
|
262
|
-
attributes,
|
|
263
|
-
});
|
|
264
|
-
sdkLogger.debug(`Tracked: ${eventName}`);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
feedback(name: string, options: FeedbackOptions = {}): void {
|
|
268
|
-
const { comments, conversationId, previousResponseId, eventId, ...extra } =
|
|
269
|
-
options;
|
|
270
|
-
const properties: Record<string, unknown> = { name, ...extra };
|
|
271
|
-
if (comments) properties.comments = comments;
|
|
272
|
-
const attributes = this.buildAttributes("introspection.feedback", {
|
|
273
|
-
properties,
|
|
274
|
-
conversationId: conversationId as string | undefined,
|
|
275
|
-
previousResponseId: previousResponseId as string | undefined,
|
|
276
|
-
eventId: eventId as string | undefined,
|
|
277
|
-
});
|
|
278
|
-
this.otelLogger.emit({
|
|
279
|
-
timestamp: this.getTimestamp(),
|
|
280
|
-
context: context.active(),
|
|
281
|
-
severityNumber: SeverityNumber.INFO,
|
|
282
|
-
severityText: "INFO",
|
|
283
|
-
attributes,
|
|
284
|
-
});
|
|
285
|
-
sdkLogger.debug(`Feedback: ${name}`);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
identify(
|
|
289
|
-
userId: string,
|
|
290
|
-
traits?: UserTraits,
|
|
291
|
-
anonymousId?: string,
|
|
292
|
-
eventId?: string,
|
|
293
|
-
): void {
|
|
294
|
-
this.userId = userId;
|
|
295
|
-
if (anonymousId) this.anonymousId = anonymousId;
|
|
296
|
-
if (traits) this.traits = { ...this.traits, ...traits };
|
|
297
|
-
const attributes = this.buildAttributes("identify", { traits, eventId });
|
|
298
|
-
this.otelLogger.emit({
|
|
299
|
-
timestamp: this.getTimestamp(),
|
|
300
|
-
context: context.active(),
|
|
301
|
-
severityNumber: SeverityNumber.INFO,
|
|
302
|
-
severityText: "INFO",
|
|
303
|
-
attributes,
|
|
304
|
-
});
|
|
305
|
-
sdkLogger.debug(`Identified: ${userId}`);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
createBaggageContext(values: Record<string, string>) {
|
|
309
|
-
const ctx = context.active();
|
|
310
|
-
let bag = propagation.getBaggage(ctx) || propagation.createBaggage();
|
|
311
|
-
for (const [key, value] of Object.entries(values)) {
|
|
312
|
-
bag = bag.setEntry(key, { value });
|
|
313
|
-
}
|
|
314
|
-
return propagation.setBaggage(ctx, bag);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
async withBaggage<T>(
|
|
318
|
-
values: Record<string, string>,
|
|
319
|
-
callback: () => T | Promise<T>,
|
|
320
|
-
): Promise<T> {
|
|
321
|
-
const ctx = this.createBaggageContext(values);
|
|
322
|
-
return await context.with(ctx, callback);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
async withAgent<T>(
|
|
326
|
-
agentName: string,
|
|
327
|
-
agentId: string | undefined,
|
|
328
|
-
callback: () => T | Promise<T>,
|
|
329
|
-
): Promise<T> {
|
|
330
|
-
const values: Record<string, string> = { "gen_ai.agent.name": agentName };
|
|
331
|
-
if (agentId) values["gen_ai.agent.id"] = agentId;
|
|
332
|
-
return await context.with(this.createBaggageContext(values), callback);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
async withConversation<T>(
|
|
336
|
-
conversationId: string | undefined,
|
|
337
|
-
previousResponseId: string | undefined,
|
|
338
|
-
callback: () => T | Promise<T>,
|
|
339
|
-
): Promise<T> {
|
|
340
|
-
const values: Record<string, string> = {};
|
|
341
|
-
if (conversationId) values["gen_ai.conversation.id"] = conversationId;
|
|
342
|
-
if (previousResponseId)
|
|
343
|
-
values["gen_ai.request.previous_response_id"] = previousResponseId;
|
|
344
|
-
return await context.with(this.createBaggageContext(values), callback);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
setUserId(userId: string): void {
|
|
348
|
-
this.userId = userId;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
setAnonymousId(anonymousId: string): void {
|
|
352
|
-
this.anonymousId = anonymousId;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
async withUserId<T>(
|
|
356
|
-
userId: string,
|
|
357
|
-
callback: () => T | Promise<T>,
|
|
358
|
-
): Promise<T> {
|
|
359
|
-
return await context.with(
|
|
360
|
-
this.createBaggageContext({ "identity.user_id": userId }),
|
|
361
|
-
callback,
|
|
362
|
-
);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
async withAnonymousId<T>(
|
|
366
|
-
anonymousId: string,
|
|
367
|
-
callback: () => T | Promise<T>,
|
|
368
|
-
): Promise<T> {
|
|
369
|
-
return await context.with(
|
|
370
|
-
this.createBaggageContext({ "identity.anonymous_id": anonymousId }),
|
|
371
|
-
callback,
|
|
372
|
-
);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
getAnonymousId(): string | undefined {
|
|
376
|
-
return this.anonymousId;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
reset(): void {
|
|
380
|
-
this.userId = undefined;
|
|
381
|
-
this.anonymousId = undefined;
|
|
382
|
-
this.traits = {};
|
|
383
|
-
sdkLogger.debug("IntrospectionLogs state reset");
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
async flush(): Promise<void> {
|
|
387
|
-
await this.loggerProvider.forceFlush();
|
|
388
|
-
sdkLogger.debug("Flushed pending log records");
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
async shutdown(): Promise<void> {
|
|
392
|
-
await this.loggerProvider.shutdown();
|
|
393
|
-
sdkLogger.debug("IntrospectionLogs shutdown complete");
|
|
394
|
-
}
|
|
395
|
-
}
|