@kortyx/telemetry 0.6.2 → 0.7.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/CHANGELOG.md +25 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +71 -21
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.0](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.3...telemetry-v0.7.0) (2026-09-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **tools:** add useTool and first-class Studio observability ([#215](https://github.com/kortyx-io/kortyx/issues/215)) ([224c92d](https://github.com/kortyx-io/kortyx/commit/224c92d73caead320dd14582d8b624efc3252c9f))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @kortyx/hooks bumped to 0.26.0
|
|
16
|
+
* @kortyx/telemetry-contracts bumped to 0.9.0
|
|
17
|
+
|
|
18
|
+
## [0.6.3](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.2...telemetry-v0.6.3) (2026-09-16)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Dependencies
|
|
22
|
+
|
|
23
|
+
* The following workspace dependencies were updated
|
|
24
|
+
* dependencies
|
|
25
|
+
* @kortyx/hooks bumped to 0.25.3
|
|
26
|
+
* @kortyx/telemetry-contracts bumped to 0.8.0
|
|
27
|
+
|
|
3
28
|
## [0.6.2](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.1...telemetry-v0.6.2) (2026-09-15)
|
|
4
29
|
|
|
5
30
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as _kortyx_hooks from '@kortyx/hooks';
|
|
1
2
|
import { KortyxTelemetryService, KortyxTelemetryConfig } from '@kortyx/hooks';
|
|
2
3
|
|
|
3
4
|
type CreateKortyxTelemetryAdapterOptions = {
|
|
@@ -5,6 +6,8 @@ type CreateKortyxTelemetryAdapterOptions = {
|
|
|
5
6
|
apiKey: string;
|
|
6
7
|
environment: string;
|
|
7
8
|
service: KortyxTelemetryService;
|
|
9
|
+
/** Optional replacement/suppression of automatically captured model fault diagnostics. */
|
|
10
|
+
error?: _kortyx_hooks.KortyxTraceErrorProjection;
|
|
8
11
|
captureContent?: KortyxTelemetryConfig["captureContent"] | undefined;
|
|
9
12
|
metadata?: Record<string, unknown> | undefined;
|
|
10
13
|
tags?: string[] | undefined;
|
package/dist/index.js
CHANGED
|
@@ -115,17 +115,29 @@ var createDelivery = (args) => {
|
|
|
115
115
|
|
|
116
116
|
// src/event-mapper.ts
|
|
117
117
|
var import_errors = require("@kortyx/core/errors");
|
|
118
|
+
var import_internal = require("@kortyx/hooks/internal");
|
|
118
119
|
var stringValue = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
|
|
119
120
|
var shouldCapture = (value, side) => {
|
|
120
121
|
if (value === true) return true;
|
|
121
122
|
return Boolean(value && typeof value === "object" && value[side]);
|
|
122
123
|
};
|
|
123
|
-
var asErrorPayload = (error
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
var asErrorPayload = (error, name, project) => {
|
|
125
|
+
if ((0, import_errors.isControlFlowError)(error))
|
|
126
|
+
return {
|
|
127
|
+
name: (0, import_errors.errorProperty)(error, "name"),
|
|
128
|
+
code: (0, import_errors.errorProperty)(error, "code"),
|
|
129
|
+
message: "Execution paused or cancelled.",
|
|
130
|
+
controlFlow: true
|
|
131
|
+
};
|
|
132
|
+
const failure = (0, import_errors.serializeFailure)(error);
|
|
133
|
+
if (!(0, import_internal.isModelTraceSpan)(name ?? "")) return { ...failure, name: "KortyxError" };
|
|
134
|
+
const diagnostic = (0, import_internal.errorDiagnostics)(error, project);
|
|
135
|
+
return {
|
|
136
|
+
...failure,
|
|
137
|
+
name: diagnostic.errorType ?? "Error",
|
|
138
|
+
message: diagnostic.errorMessage ?? "Model execution failed."
|
|
139
|
+
};
|
|
140
|
+
};
|
|
129
141
|
var correlationFrom = (attributes, active) => {
|
|
130
142
|
const source = attributes ?? {};
|
|
131
143
|
const runId = stringValue(source.runId) ?? active?.correlation.runId;
|
|
@@ -166,7 +178,7 @@ var createEventMapper = (args) => {
|
|
|
166
178
|
...input.context || args.metadata || args.tags ? {
|
|
167
179
|
context: {
|
|
168
180
|
...args.tags ? { tags: args.tags } : {},
|
|
169
|
-
...args.metadata ? { metadata: args.metadata } : {},
|
|
181
|
+
...args.metadata ? { metadata: (0, import_internal.safeTelemetryMetadata)(args.metadata) } : {},
|
|
170
182
|
...input.context ?? {}
|
|
171
183
|
}
|
|
172
184
|
} : {},
|
|
@@ -180,10 +192,10 @@ var createEventMapper = (args) => {
|
|
|
180
192
|
});
|
|
181
193
|
const spanContext = (telemetry, attributes) => {
|
|
182
194
|
const tags = [...args.tags ?? [], ...telemetry?.tags ?? []];
|
|
183
|
-
const metadata = {
|
|
195
|
+
const metadata = (0, import_internal.safeTelemetryMetadata)({
|
|
184
196
|
...args.metadata ?? {},
|
|
185
197
|
...telemetry?.metadata ?? {}
|
|
186
|
-
};
|
|
198
|
+
});
|
|
187
199
|
const userId = stringValue(attributes.userId);
|
|
188
200
|
const tenantId = stringValue(attributes.tenantId);
|
|
189
201
|
return userId || tenantId || tags.length || Object.keys(metadata).length ? {
|
|
@@ -196,7 +208,7 @@ var createEventMapper = (args) => {
|
|
|
196
208
|
const telemetryPayload = (telemetry) => ({
|
|
197
209
|
...telemetry?.operation ? { operation: telemetry.operation } : {},
|
|
198
210
|
...telemetry?.tags?.length ? { tags: telemetry.tags } : {},
|
|
199
|
-
...telemetry?.metadata ? { metadata: telemetry.metadata } : {},
|
|
211
|
+
...telemetry?.metadata ? { metadata: (0, import_internal.safeTelemetryMetadata)(telemetry.metadata) } : {},
|
|
200
212
|
...telemetry?.prompt ? {
|
|
201
213
|
prompt: {
|
|
202
214
|
...telemetry.prompt.name ? { name: telemetry.prompt.name } : {},
|
|
@@ -207,7 +219,7 @@ var createEventMapper = (args) => {
|
|
|
207
219
|
} : {}
|
|
208
220
|
});
|
|
209
221
|
return {
|
|
210
|
-
asErrorPayload,
|
|
222
|
+
asErrorPayload: (error, name) => asErrorPayload(error, name, args.error),
|
|
211
223
|
correlationFrom,
|
|
212
224
|
createEvent,
|
|
213
225
|
shouldCapture,
|
|
@@ -256,6 +268,7 @@ var createTopologyResolver = (args) => {
|
|
|
256
268
|
|
|
257
269
|
// src/trace.ts
|
|
258
270
|
var import_node_async_hooks = require("async_hooks");
|
|
271
|
+
var import_telemetry_contracts = require("@kortyx/telemetry-contracts");
|
|
259
272
|
var createTraceAdapter = (args) => {
|
|
260
273
|
const activeSpans = new import_node_async_hooks.AsyncLocalStorage();
|
|
261
274
|
const createSpan = (startArgs) => {
|
|
@@ -268,17 +281,20 @@ var createTraceAdapter = (args) => {
|
|
|
268
281
|
const currentAttributes = { ...attributes };
|
|
269
282
|
const correlation = args.eventMapper.correlationFrom(attributes, parent);
|
|
270
283
|
const startedAt = Date.now();
|
|
271
|
-
|
|
284
|
+
const isTool = startArgs.name === "kortyx.tool";
|
|
285
|
+
if (correlation && (!isTool || attributes.executed === true)) {
|
|
272
286
|
args.enqueue(
|
|
273
287
|
args.eventMapper.createEvent({
|
|
274
|
-
type: "span.started",
|
|
288
|
+
type: isTool ? "tool.started" : "span.started",
|
|
275
289
|
correlation,
|
|
276
290
|
span,
|
|
277
291
|
...parent ? { parentSpanId: parent.spanId } : {},
|
|
278
|
-
payload: {
|
|
292
|
+
payload: isTool ? import_telemetry_contracts.ToolObservationSchema.parse(attributes) : {
|
|
279
293
|
name: startArgs.name,
|
|
280
294
|
attributes: currentAttributes,
|
|
281
|
-
telemetry: args.eventMapper.telemetryPayload(
|
|
295
|
+
telemetry: args.eventMapper.telemetryPayload(
|
|
296
|
+
startArgs.telemetry
|
|
297
|
+
),
|
|
282
298
|
...args.eventMapper.shouldCapture(
|
|
283
299
|
startArgs.telemetry?.captureContent ?? args.captureContent,
|
|
284
300
|
"input"
|
|
@@ -303,6 +319,20 @@ var createTraceAdapter = (args) => {
|
|
|
303
319
|
};
|
|
304
320
|
const telemetry = endArgs?.telemetry ?? startArgs.telemetry;
|
|
305
321
|
const durationMs = Date.now() - startedAt;
|
|
322
|
+
if (isTool) {
|
|
323
|
+
const payload = import_telemetry_contracts.ToolObservationSchema.parse(endAttributes);
|
|
324
|
+
const type = payload.observationKind === "reused" ? "tool.reused" : payload.observationKind === "waiting" ? "tool.waiting" : payload.suspended ? "tool.suspended" : payload.outcome === "denied" ? "tool.denied" : payload.outcome === "fault" ? "tool.failed" : payload.outcome === "cancelled" ? "tool.cancelled" : "tool.completed";
|
|
325
|
+
args.enqueue(
|
|
326
|
+
args.eventMapper.createEvent({
|
|
327
|
+
type,
|
|
328
|
+
correlation,
|
|
329
|
+
span,
|
|
330
|
+
...parent ? { parentSpanId: parent.spanId } : {},
|
|
331
|
+
payload
|
|
332
|
+
})
|
|
333
|
+
);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
306
336
|
args.enqueue(
|
|
307
337
|
args.eventMapper.createEvent({
|
|
308
338
|
type: "span.ended",
|
|
@@ -349,10 +379,28 @@ var createTraceAdapter = (args) => {
|
|
|
349
379
|
durationMs - timeToLastTokenMs
|
|
350
380
|
)
|
|
351
381
|
} : {},
|
|
352
|
-
...endArgs?.usage ? {
|
|
382
|
+
...endArgs?.usage ? {
|
|
383
|
+
usage: failed ? Object.fromEntries(
|
|
384
|
+
Object.entries(endArgs.usage).filter(
|
|
385
|
+
([key, value]) => [
|
|
386
|
+
"input",
|
|
387
|
+
"output",
|
|
388
|
+
"total",
|
|
389
|
+
"reasoning",
|
|
390
|
+
"cacheRead",
|
|
391
|
+
"cacheWrite",
|
|
392
|
+
"cacheWrite1h"
|
|
393
|
+
].includes(key) && typeof value === "number" && Number.isFinite(value) || [
|
|
394
|
+
"outputIncludesReasoning",
|
|
395
|
+
"inputIncludesCacheRead",
|
|
396
|
+
"inputIncludesCacheWrite"
|
|
397
|
+
].includes(key) && typeof value === "boolean"
|
|
398
|
+
)
|
|
399
|
+
) : endArgs.usage
|
|
400
|
+
} : {},
|
|
353
401
|
...endArgs?.finishReason ? { finishReason: endArgs.finishReason } : {},
|
|
354
402
|
...endArgs?.warnings ? { warnings: endArgs.warnings } : {},
|
|
355
|
-
...endArgs?.providerMetadata ? { providerMetadata: endArgs.providerMetadata } : {}
|
|
403
|
+
...endArgs?.providerMetadata && !failed ? { providerMetadata: endArgs.providerMetadata } : {}
|
|
356
404
|
},
|
|
357
405
|
context: args.eventMapper.spanContext(telemetry, currentAttributes)
|
|
358
406
|
})
|
|
@@ -363,7 +411,8 @@ var createTraceAdapter = (args) => {
|
|
|
363
411
|
Object.assign(currentAttributes, nextAttributes);
|
|
364
412
|
},
|
|
365
413
|
addEvent: (name, eventAttributes = {}) => {
|
|
366
|
-
if (!correlation)
|
|
414
|
+
if (!correlation || activeSpans.getStore()?.name === "kortyx.tool" || startArgs.name === "kortyx.tool")
|
|
415
|
+
return;
|
|
367
416
|
const type = name === "useReason.tool-call.start" ? "tool.started" : name === "useReason.tool-call.complete" ? "tool.completed" : name === "useReason.tool-call.error" ? "tool.failed" : void 0;
|
|
368
417
|
if (!type) return;
|
|
369
418
|
args.enqueue(
|
|
@@ -389,7 +438,7 @@ var createTraceAdapter = (args) => {
|
|
|
389
438
|
...parent ? { parentSpanId: parent.spanId } : {},
|
|
390
439
|
payload: {
|
|
391
440
|
name: startArgs.name,
|
|
392
|
-
error: args.eventMapper.asErrorPayload(error),
|
|
441
|
+
error: args.eventMapper.asErrorPayload(error, startArgs.name),
|
|
393
442
|
durationMs: Date.now() - startedAt
|
|
394
443
|
}
|
|
395
444
|
})
|
|
@@ -400,7 +449,7 @@ var createTraceAdapter = (args) => {
|
|
|
400
449
|
};
|
|
401
450
|
return {
|
|
402
451
|
span: traceSpan,
|
|
403
|
-
...correlation ? { active: { ...span, correlation } } : {}
|
|
452
|
+
...correlation ? { active: { ...span, name: startArgs.name, correlation } } : {}
|
|
404
453
|
};
|
|
405
454
|
};
|
|
406
455
|
return {
|
|
@@ -472,7 +521,8 @@ function createKortyxTelemetryAdapter(options) {
|
|
|
472
521
|
service: options.service,
|
|
473
522
|
...options.metadata ? { metadata: options.metadata } : {},
|
|
474
523
|
...options.tags ? { tags: options.tags } : {},
|
|
475
|
-
createId
|
|
524
|
+
createId,
|
|
525
|
+
...options.error ? { error: options.error } : {}
|
|
476
526
|
});
|
|
477
527
|
const topology = createTopologyResolver({
|
|
478
528
|
ensure: async (snapshot) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/delivery.ts","../src/event-mapper.ts","../src/topology.ts","../src/trace.ts"],"sourcesContent":["export { createKortyxTelemetryAdapter } from \"./adapter\";\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryEvent,\n} from \"@kortyx/hooks\";\nimport { createDelivery, TelemetryHttpError } from \"./delivery\";\nimport { createEventMapper } from \"./event-mapper\";\nimport { createTopologyResolver } from \"./topology\";\nimport { createTraceAdapter } from \"./trace\";\nimport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 250;\nconst DEFAULT_MAX_QUEUE_SIZE = 1_000;\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst endpointFor = (endpoint: string, path: string): string =>\n `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n/**\n * Creates the optional Kortyx Studio HTTP adapter. Execution paths only enqueue\n * telemetry; delivery remains best-effort and cannot fail a workflow.\n */\nexport function createKortyxTelemetryAdapter(\n options: CreateKortyxTelemetryAdapterOptions,\n): KortyxTelemetryAdapter {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"createKortyxTelemetryAdapter requires a fetch implementation.\",\n );\n }\n\n const send = async (path: string, body: unknown): Promise<Response> => {\n const response = await fetchImpl(endpointFor(options.endpoint, path), {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new TelemetryHttpError(response.status);\n return response;\n };\n\n const delivery = createDelivery({\n maxQueueSize: options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n send: async (events) => {\n await send(\"/v1/telemetry/events:batch\", { events });\n },\n });\n const eventMapper = createEventMapper({\n environment: options.environment,\n service: options.service,\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n createId,\n });\n const topology = createTopologyResolver({\n ensure: async (snapshot) => {\n const response = await send(\n \"/v1/telemetry/workflow-revisions:ensure\",\n snapshot,\n );\n return (await response.json()) as EnsureWorkflowTopologyResponse;\n },\n });\n const trace = createTraceAdapter({\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n createId,\n enqueue: delivery.enqueue,\n eventMapper,\n });\n const emit = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n for (const event of events) delivery.enqueue(event);\n };\n\n return {\n trace,\n reporter: {\n ensureWorkflowTopology: topology.ensureWorkflowTopology,\n emit,\n getWorkflowRevisionId: topology.getWorkflowRevisionId,\n },\n environment: options.environment,\n service: options.service,\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n flush: delivery.flush,\n getDroppedEventCount: delivery.getDroppedEventCount,\n getPermanentDeliveryFailureCount: delivery.getPermanentDeliveryFailureCount,\n };\n}\n","import type { KortyxTelemetryEvent } from \"@kortyx/hooks\";\n\nexport class TelemetryHttpError extends Error {\n constructor(readonly status: number) {\n super(`Kortyx telemetry request failed (${status}).`);\n }\n}\n\nexport const createDelivery = (args: {\n maxQueueSize: number;\n flushIntervalMs: number;\n send: (events: KortyxTelemetryEvent[]) => Promise<void>;\n}) => {\n const queue: KortyxTelemetryEvent[] = [];\n let dropped = 0;\n let permanentFailures = 0;\n let retryAttempt = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let inFlight: Promise<{ retryDelay: number | null }> | undefined;\n const schedule = (delay = args.flushIntervalMs) => {\n if (timer || inFlight || queue.length === 0) return;\n timer = setTimeout(() => {\n timer = undefined;\n void flush();\n }, delay);\n if (typeof timer === \"object\" && \"unref\" in timer) timer.unref?.();\n };\n const flush = async (): Promise<void> => {\n while (true) {\n if (inFlight) {\n const result = await inFlight;\n if (result.retryDelay !== null) return;\n continue;\n }\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (queue.length === 0) return;\n const events = queue.splice(0);\n const current = (async (): Promise<{ retryDelay: number | null }> => {\n try {\n await args.send(events);\n retryAttempt = 0;\n return { retryDelay: null };\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n if (status !== undefined && status !== 429 && status < 500) {\n permanentFailures += events.length;\n return { retryDelay: null };\n }\n const overflow = Math.max(\n 0,\n queue.length + events.length - args.maxQueueSize,\n );\n if (overflow) {\n dropped += overflow;\n events.splice(0, overflow);\n }\n queue.unshift(...events);\n retryAttempt += 1;\n const backoff = Math.min(30_000, 250 * 2 ** (retryAttempt - 1));\n return {\n retryDelay: Math.floor(backoff * (0.5 + Math.random() * 0.5)),\n };\n }\n })();\n inFlight = current;\n const result = await current;\n if (inFlight === current) inFlight = undefined;\n if (result.retryDelay !== null) {\n schedule(result.retryDelay);\n return;\n }\n }\n };\n return {\n enqueue: (event: KortyxTelemetryEvent) => {\n if (queue.length >= args.maxQueueSize) {\n queue.shift();\n dropped += 1;\n }\n queue.push(event);\n schedule();\n },\n flush,\n getDroppedEventCount: () => dropped,\n getPermanentDeliveryFailureCount: () => permanentFailures,\n };\n};\n","import {\n errorProperty,\n isControlFlowError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n ReasonTraceAttributes,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst shouldCapture = (\n value: KortyxTelemetryConfig[\"captureContent\"] | undefined,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(value && typeof value === \"object\" && value[side]);\n};\n\nconst asErrorPayload = (error: unknown): Record<string, unknown> =>\n isControlFlowError(error)\n ? {\n name: errorProperty(error, \"name\"),\n code: errorProperty(error, \"code\"),\n message: \"Execution paused or cancelled.\",\n controlFlow: true,\n }\n : { ...serializeFailure(error), name: \"KortyxError\" };\n\nconst correlationFrom = (\n attributes: ReasonTraceAttributes | undefined,\n active: ActiveSpan | undefined,\n): KortyxTelemetryEvent[\"correlation\"] | undefined => {\n const source = attributes ?? {};\n const runId = stringValue(source.runId) ?? active?.correlation.runId;\n const workflowId =\n stringValue(source.workflowId) ?? active?.correlation.workflowId;\n if (!runId || !workflowId) return undefined;\n\n const sameWorkflow = workflowId === active?.correlation.workflowId;\n const sessionId =\n stringValue(source.sessionId) ?? active?.correlation.sessionId;\n const workflowRevisionId =\n stringValue(source.workflowRevisionId) ??\n (sameWorkflow ? active?.correlation.workflowRevisionId : undefined);\n const topologyHash =\n stringValue(source.topologyHash) ??\n (sameWorkflow ? active?.correlation.topologyHash : undefined);\n const nodeId =\n stringValue(source.nodeId) ??\n (sameWorkflow ? active?.correlation.nodeId : undefined);\n return {\n runId,\n workflowId,\n ...Object.fromEntries(\n [\"invocationId\", \"parentInvocationId\", \"branchId\"].flatMap((key) => {\n const value =\n stringValue(source[key]) ??\n active?.correlation[key as \"invocationId\"];\n return value ? [[key, value]] : [];\n }),\n ),\n ...(sessionId ? { sessionId } : {}),\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n ...(topologyHash ? { topologyHash } : {}),\n ...(nodeId ? { nodeId } : {}),\n };\n};\n\nexport const createEventMapper = (args: {\n environment: string;\n service: KortyxTelemetryEvent[\"service\"];\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n createId: () => string;\n}) => {\n const createEvent = (input: {\n type: KortyxTelemetryEventType;\n correlation: KortyxTelemetryEvent[\"correlation\"];\n span?: SpanContext | undefined;\n parentSpanId?: string | undefined;\n payload: Record<string, unknown>;\n context?: KortyxTelemetryEvent[\"context\"] | undefined;\n }): KortyxTelemetryEvent => ({\n schemaVersion: 1,\n eventId: args.createId(),\n occurredAt: new Date().toISOString(),\n environment: args.environment,\n service: args.service,\n correlation: {\n ...input.correlation,\n ...(input.span\n ? { traceId: input.span.traceId, spanId: input.span.spanId }\n : {}),\n ...(input.parentSpanId ? { parentSpanId: input.parentSpanId } : {}),\n },\n ...(input.context || args.metadata || args.tags\n ? {\n context: {\n ...(args.tags ? { tags: args.tags } : {}),\n ...(args.metadata ? { metadata: args.metadata } : {}),\n ...(input.context ?? {}),\n },\n }\n : {}),\n type: input.type,\n payload: {\n ...input.payload,\n ...(input.correlation.invocationId\n ? { invocationId: input.correlation.invocationId }\n : {}),\n ...(input.correlation.parentInvocationId\n ? { parentInvocationId: input.correlation.parentInvocationId }\n : {}),\n ...(input.correlation.branchId\n ? { branchId: input.correlation.branchId }\n : {}),\n },\n });\n\n const spanContext = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n attributes: ReasonTraceAttributes,\n ): KortyxTelemetryEvent[\"context\"] | undefined => {\n const tags = [...(args.tags ?? []), ...(telemetry?.tags ?? [])];\n const metadata = {\n ...(args.metadata ?? {}),\n ...(telemetry?.metadata ?? {}),\n };\n const userId = stringValue(attributes.userId);\n const tenantId = stringValue(attributes.tenantId);\n return userId || tenantId || tags.length || Object.keys(metadata).length\n ? {\n ...(userId ? { userId } : {}),\n ...(tenantId ? { tenantId } : {}),\n ...(tags.length ? { tags } : {}),\n ...(Object.keys(metadata).length ? { metadata } : {}),\n }\n : undefined;\n };\n\n const telemetryPayload = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n ): Record<string, unknown> => ({\n ...(telemetry?.operation ? { operation: telemetry.operation } : {}),\n ...(telemetry?.tags?.length ? { tags: telemetry.tags } : {}),\n ...(telemetry?.metadata ? { metadata: telemetry.metadata } : {}),\n ...(telemetry?.prompt\n ? {\n prompt: {\n ...(telemetry.prompt.name ? { name: telemetry.prompt.name } : {}),\n ...(telemetry.prompt.version !== undefined\n ? { version: telemetry.prompt.version }\n : {}),\n ...(telemetry.prompt.type ? { type: telemetry.prompt.type } : {}),\n ...(telemetry.prompt.source\n ? { source: telemetry.prompt.source }\n : {}),\n },\n }\n : {}),\n });\n\n return {\n asErrorPayload,\n correlationFrom,\n createEvent,\n shouldCapture,\n spanContext,\n stringValue,\n telemetryPayload,\n };\n};\n","import type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n} from \"@kortyx/hooks\";\n\ntype TopologyKey = {\n environment: string;\n workflowId: string;\n topologyHash: string;\n};\n\nconst keyFor = ({ environment, workflowId, topologyHash }: TopologyKey) =>\n `${environment}:${workflowId}:${topologyHash}`;\n\n/** Caches successful topology ensures and coalesces concurrent requests. */\nexport const createTopologyResolver = (args: {\n ensure: (\n snapshot: EnsureWorkflowTopologyRequest,\n ) => Promise<EnsureWorkflowTopologyResponse>;\n}) => {\n const revisions = new Map<string, string>();\n const pending = new Map<string, Promise<EnsureWorkflowTopologyResponse>>();\n\n const ensureWorkflowTopology = (\n snapshot: EnsureWorkflowTopologyRequest,\n ): Promise<EnsureWorkflowTopologyResponse> => {\n const key = keyFor({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n const revision = revisions.get(key);\n if (revision) {\n return Promise.resolve({ workflowRevisionId: revision, created: false });\n }\n\n const existing = pending.get(key);\n if (existing) return existing;\n\n const request = args\n .ensure(snapshot)\n .then((result) => {\n if (!result.workflowRevisionId) {\n throw new Error(\n \"Telemetry API returned an invalid workflow revision.\",\n );\n }\n revisions.set(key, result.workflowRevisionId);\n return result;\n })\n .finally(() => {\n pending.delete(key);\n });\n pending.set(key, request);\n return request;\n };\n\n return {\n ensureWorkflowTopology,\n getWorkflowRevisionId: (args: TopologyKey) => revisions.get(keyFor(args)),\n };\n};\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { createEventMapper } from \"./event-mapper\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\n/** Maps generic SDK trace calls to Kortyx Studio's span and generation facts. */\nexport const createTraceAdapter = (args: {\n captureContent?: KortyxTelemetryConfig[\"captureContent\"] | undefined;\n createId: () => string;\n enqueue: (event: KortyxTelemetryEvent) => void;\n eventMapper: ReturnType<typeof createEventMapper>;\n}): ReasonTraceAdapter => {\n const activeSpans = new AsyncLocalStorage<ActiveSpan>();\n\n const createSpan = (\n startArgs: ReasonTraceSpanStartArgs,\n ): { span: ReasonTraceSpan; active?: ActiveSpan | undefined } => {\n const parent = activeSpans.getStore();\n const span: SpanContext = {\n traceId: parent?.traceId ?? args.createId(),\n spanId: args.createId(),\n };\n const attributes = { ...(startArgs.attributes ?? {}) };\n const currentAttributes = { ...attributes };\n const correlation = args.eventMapper.correlationFrom(attributes, parent);\n const startedAt = Date.now();\n\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.started\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: currentAttributes,\n telemetry: args.eventMapper.telemetryPayload(startArgs.telemetry),\n ...(args.eventMapper.shouldCapture(\n startArgs.telemetry?.captureContent ?? args.captureContent,\n \"input\",\n )\n ? { input: startArgs.telemetry?.input }\n : {}),\n },\n context: args.eventMapper.spanContext(\n startArgs.telemetry,\n currentAttributes,\n ),\n }),\n );\n }\n\n let ended = false;\n let failed = false;\n const end = (endArgs?: ReasonTraceSpanEndArgs): void => {\n if (ended) return;\n ended = true;\n if (!correlation) return;\n\n const endAttributes = {\n ...currentAttributes,\n ...(endArgs?.attributes ?? {}),\n };\n const telemetry = endArgs?.telemetry ?? startArgs.telemetry;\n const durationMs = Date.now() - startedAt;\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.ended\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: endAttributes,\n durationMs,\n telemetry: args.eventMapper.telemetryPayload(telemetry),\n ...(args.eventMapper.shouldCapture(\n endArgs?.telemetry?.captureContent ??\n startArgs.telemetry?.captureContent ??\n args.captureContent,\n \"output\",\n )\n ? { output: endArgs?.telemetry?.output }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, endAttributes),\n }),\n );\n\n if (startArgs.name !== \"runReasonEngine\") return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"generation.completed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n outcome: failed ? \"failed\" : \"completed\",\n provider:\n args.eventMapper.stringValue(attributes.providerId) ?? \"unknown\",\n model:\n args.eventMapper.stringValue(attributes.modelId) ?? \"unknown\",\n durationMs,\n ...(ttftMs !== undefined ? { ttftMs } : {}),\n ...(streamDurationMs !== undefined ? { streamDurationMs } : {}),\n ...(timeToLastTokenMs !== undefined\n ? {\n postStreamDurationMs: Math.max(\n 0,\n durationMs - timeToLastTokenMs,\n ),\n }\n : {}),\n ...(endArgs?.usage ? { usage: endArgs.usage } : {}),\n ...(endArgs?.finishReason\n ? { finishReason: endArgs.finishReason }\n : {}),\n ...(endArgs?.warnings ? { warnings: endArgs.warnings } : {}),\n ...(endArgs?.providerMetadata\n ? { providerMetadata: endArgs.providerMetadata }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, currentAttributes),\n }),\n );\n };\n\n const traceSpan: ReasonTraceSpan = {\n setAttributes: (nextAttributes) => {\n Object.assign(currentAttributes, nextAttributes);\n },\n addEvent: (name, eventAttributes = {}) => {\n if (!correlation) return;\n const type =\n name === \"useReason.tool-call.start\"\n ? \"tool.started\"\n : name === \"useReason.tool-call.complete\"\n ? \"tool.completed\"\n : name === \"useReason.tool-call.error\"\n ? \"tool.failed\"\n : undefined;\n if (!type) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: eventAttributes,\n }),\n );\n },\n end,\n fail: (error, endArgs) => {\n if (ended) return;\n failed = true;\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.failed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n error: args.eventMapper.asErrorPayload(error),\n durationMs: Date.now() - startedAt,\n },\n }),\n );\n }\n end(endArgs);\n },\n };\n\n return {\n span: traceSpan,\n ...(correlation ? { active: { ...span, correlation } } : {}),\n };\n };\n\n return {\n startSpan: (startArgs) => createSpan(startArgs).span,\n withSpan: async (startArgs, fn) => {\n const created = createSpan(startArgs);\n const run = async (): Promise<Awaited<ReturnType<typeof fn>>> => {\n try {\n const result = await fn(created.span);\n created.span.end?.();\n return result;\n } catch (error) {\n try {\n created.span.fail?.(error);\n } catch {\n /* Preserve the callback failure. */\n }\n throw error;\n }\n };\n return created.active ? activeSpans.run(created.active, run) : run();\n },\n getActiveContext: () => {\n const active = activeSpans.getStore();\n return active\n ? { traceId: active.traceId, spanId: active.spanId }\n : undefined;\n },\n };\n};\n\nconst nonnegativeNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n"],"mappings":"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","names":["result","args"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/delivery.ts","../src/event-mapper.ts","../src/topology.ts","../src/trace.ts"],"sourcesContent":["export { createKortyxTelemetryAdapter } from \"./adapter\";\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryEvent,\n} from \"@kortyx/hooks\";\nimport { createDelivery, TelemetryHttpError } from \"./delivery\";\nimport { createEventMapper } from \"./event-mapper\";\nimport { createTopologyResolver } from \"./topology\";\nimport { createTraceAdapter } from \"./trace\";\nimport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 250;\nconst DEFAULT_MAX_QUEUE_SIZE = 1_000;\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst endpointFor = (endpoint: string, path: string): string =>\n `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n/**\n * Creates the optional Kortyx Studio HTTP adapter. Execution paths only enqueue\n * telemetry; delivery remains best-effort and cannot fail a workflow.\n */\nexport function createKortyxTelemetryAdapter(\n options: CreateKortyxTelemetryAdapterOptions,\n): KortyxTelemetryAdapter {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"createKortyxTelemetryAdapter requires a fetch implementation.\",\n );\n }\n\n const send = async (path: string, body: unknown): Promise<Response> => {\n const response = await fetchImpl(endpointFor(options.endpoint, path), {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new TelemetryHttpError(response.status);\n return response;\n };\n\n const delivery = createDelivery({\n maxQueueSize: options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n send: async (events) => {\n await send(\"/v1/telemetry/events:batch\", { events });\n },\n });\n const eventMapper = createEventMapper({\n environment: options.environment,\n service: options.service,\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n createId,\n ...(options.error ? { error: options.error } : {}),\n });\n const topology = createTopologyResolver({\n ensure: async (snapshot) => {\n const response = await send(\n \"/v1/telemetry/workflow-revisions:ensure\",\n snapshot,\n );\n return (await response.json()) as EnsureWorkflowTopologyResponse;\n },\n });\n const trace = createTraceAdapter({\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n createId,\n enqueue: delivery.enqueue,\n eventMapper,\n });\n const emit = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n for (const event of events) delivery.enqueue(event);\n };\n\n return {\n trace,\n reporter: {\n ensureWorkflowTopology: topology.ensureWorkflowTopology,\n emit,\n getWorkflowRevisionId: topology.getWorkflowRevisionId,\n },\n environment: options.environment,\n service: options.service,\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n flush: delivery.flush,\n getDroppedEventCount: delivery.getDroppedEventCount,\n getPermanentDeliveryFailureCount: delivery.getPermanentDeliveryFailureCount,\n };\n}\n","import type { KortyxTelemetryEvent } from \"@kortyx/hooks\";\n\nexport class TelemetryHttpError extends Error {\n constructor(readonly status: number) {\n super(`Kortyx telemetry request failed (${status}).`);\n }\n}\n\nexport const createDelivery = (args: {\n maxQueueSize: number;\n flushIntervalMs: number;\n send: (events: KortyxTelemetryEvent[]) => Promise<void>;\n}) => {\n const queue: KortyxTelemetryEvent[] = [];\n let dropped = 0;\n let permanentFailures = 0;\n let retryAttempt = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let inFlight: Promise<{ retryDelay: number | null }> | undefined;\n const schedule = (delay = args.flushIntervalMs) => {\n if (timer || inFlight || queue.length === 0) return;\n timer = setTimeout(() => {\n timer = undefined;\n void flush();\n }, delay);\n if (typeof timer === \"object\" && \"unref\" in timer) timer.unref?.();\n };\n const flush = async (): Promise<void> => {\n while (true) {\n if (inFlight) {\n const result = await inFlight;\n if (result.retryDelay !== null) return;\n continue;\n }\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (queue.length === 0) return;\n const events = queue.splice(0);\n const current = (async (): Promise<{ retryDelay: number | null }> => {\n try {\n await args.send(events);\n retryAttempt = 0;\n return { retryDelay: null };\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n if (status !== undefined && status !== 429 && status < 500) {\n permanentFailures += events.length;\n return { retryDelay: null };\n }\n const overflow = Math.max(\n 0,\n queue.length + events.length - args.maxQueueSize,\n );\n if (overflow) {\n dropped += overflow;\n events.splice(0, overflow);\n }\n queue.unshift(...events);\n retryAttempt += 1;\n const backoff = Math.min(30_000, 250 * 2 ** (retryAttempt - 1));\n return {\n retryDelay: Math.floor(backoff * (0.5 + Math.random() * 0.5)),\n };\n }\n })();\n inFlight = current;\n const result = await current;\n if (inFlight === current) inFlight = undefined;\n if (result.retryDelay !== null) {\n schedule(result.retryDelay);\n return;\n }\n }\n };\n return {\n enqueue: (event: KortyxTelemetryEvent) => {\n if (queue.length >= args.maxQueueSize) {\n queue.shift();\n dropped += 1;\n }\n queue.push(event);\n schedule();\n },\n flush,\n getDroppedEventCount: () => dropped,\n getPermanentDeliveryFailureCount: () => permanentFailures,\n };\n};\n","import {\n errorProperty,\n isControlFlowError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n ReasonTraceAttributes,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport {\n errorDiagnostics,\n isModelTraceSpan,\n safeTelemetryMetadata,\n} from \"@kortyx/hooks/internal\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst shouldCapture = (\n value: KortyxTelemetryConfig[\"captureContent\"] | undefined,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(value && typeof value === \"object\" && value[side]);\n};\n\nconst asErrorPayload = (\n error: unknown,\n name?: string,\n project?: import(\"@kortyx/hooks\").KortyxTraceErrorProjection,\n): Record<string, unknown> => {\n if (isControlFlowError(error))\n return {\n name: errorProperty(error, \"name\"),\n code: errorProperty(error, \"code\"),\n message: \"Execution paused or cancelled.\",\n controlFlow: true,\n };\n const failure = serializeFailure(error);\n if (!isModelTraceSpan(name ?? \"\")) return { ...failure, name: \"KortyxError\" };\n const diagnostic = errorDiagnostics(error, project);\n return {\n ...failure,\n name: diagnostic.errorType ?? \"Error\",\n message: diagnostic.errorMessage ?? \"Model execution failed.\",\n };\n};\n\nconst correlationFrom = (\n attributes: ReasonTraceAttributes | undefined,\n active: ActiveSpan | undefined,\n): KortyxTelemetryEvent[\"correlation\"] | undefined => {\n const source = attributes ?? {};\n const runId = stringValue(source.runId) ?? active?.correlation.runId;\n const workflowId =\n stringValue(source.workflowId) ?? active?.correlation.workflowId;\n if (!runId || !workflowId) return undefined;\n\n const sameWorkflow = workflowId === active?.correlation.workflowId;\n const sessionId =\n stringValue(source.sessionId) ?? active?.correlation.sessionId;\n const workflowRevisionId =\n stringValue(source.workflowRevisionId) ??\n (sameWorkflow ? active?.correlation.workflowRevisionId : undefined);\n const topologyHash =\n stringValue(source.topologyHash) ??\n (sameWorkflow ? active?.correlation.topologyHash : undefined);\n const nodeId =\n stringValue(source.nodeId) ??\n (sameWorkflow ? active?.correlation.nodeId : undefined);\n return {\n runId,\n workflowId,\n ...Object.fromEntries(\n [\"invocationId\", \"parentInvocationId\", \"branchId\"].flatMap((key) => {\n const value =\n stringValue(source[key]) ??\n active?.correlation[key as \"invocationId\"];\n return value ? [[key, value]] : [];\n }),\n ),\n ...(sessionId ? { sessionId } : {}),\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n ...(topologyHash ? { topologyHash } : {}),\n ...(nodeId ? { nodeId } : {}),\n };\n};\n\nexport const createEventMapper = (args: {\n environment: string;\n service: KortyxTelemetryEvent[\"service\"];\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n createId: () => string;\n error?: import(\"@kortyx/hooks\").KortyxTraceErrorProjection;\n}) => {\n const createEvent = (input: {\n type: KortyxTelemetryEventType;\n correlation: KortyxTelemetryEvent[\"correlation\"];\n span?: SpanContext | undefined;\n parentSpanId?: string | undefined;\n payload: Record<string, unknown>;\n context?: KortyxTelemetryEvent[\"context\"] | undefined;\n }): KortyxTelemetryEvent => ({\n schemaVersion: 1,\n eventId: args.createId(),\n occurredAt: new Date().toISOString(),\n environment: args.environment,\n service: args.service,\n correlation: {\n ...input.correlation,\n ...(input.span\n ? { traceId: input.span.traceId, spanId: input.span.spanId }\n : {}),\n ...(input.parentSpanId ? { parentSpanId: input.parentSpanId } : {}),\n },\n ...(input.context || args.metadata || args.tags\n ? {\n context: {\n ...(args.tags ? { tags: args.tags } : {}),\n ...(args.metadata\n ? { metadata: safeTelemetryMetadata(args.metadata) }\n : {}),\n ...(input.context ?? {}),\n },\n }\n : {}),\n type: input.type,\n payload: {\n ...input.payload,\n ...(input.correlation.invocationId\n ? { invocationId: input.correlation.invocationId }\n : {}),\n ...(input.correlation.parentInvocationId\n ? { parentInvocationId: input.correlation.parentInvocationId }\n : {}),\n ...(input.correlation.branchId\n ? { branchId: input.correlation.branchId }\n : {}),\n },\n });\n\n const spanContext = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n attributes: ReasonTraceAttributes,\n ): KortyxTelemetryEvent[\"context\"] | undefined => {\n const tags = [...(args.tags ?? []), ...(telemetry?.tags ?? [])];\n const metadata = safeTelemetryMetadata({\n ...(args.metadata ?? {}),\n ...(telemetry?.metadata ?? {}),\n });\n const userId = stringValue(attributes.userId);\n const tenantId = stringValue(attributes.tenantId);\n return userId || tenantId || tags.length || Object.keys(metadata).length\n ? {\n ...(userId ? { userId } : {}),\n ...(tenantId ? { tenantId } : {}),\n ...(tags.length ? { tags } : {}),\n ...(Object.keys(metadata).length ? { metadata } : {}),\n }\n : undefined;\n };\n\n const telemetryPayload = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n ): Record<string, unknown> => ({\n ...(telemetry?.operation ? { operation: telemetry.operation } : {}),\n ...(telemetry?.tags?.length ? { tags: telemetry.tags } : {}),\n ...(telemetry?.metadata\n ? { metadata: safeTelemetryMetadata(telemetry.metadata) }\n : {}),\n ...(telemetry?.prompt\n ? {\n prompt: {\n ...(telemetry.prompt.name ? { name: telemetry.prompt.name } : {}),\n ...(telemetry.prompt.version !== undefined\n ? { version: telemetry.prompt.version }\n : {}),\n ...(telemetry.prompt.type ? { type: telemetry.prompt.type } : {}),\n ...(telemetry.prompt.source\n ? { source: telemetry.prompt.source }\n : {}),\n },\n }\n : {}),\n });\n\n return {\n asErrorPayload: (error: unknown, name?: string) =>\n asErrorPayload(error, name, args.error),\n correlationFrom,\n createEvent,\n shouldCapture,\n spanContext,\n stringValue,\n telemetryPayload,\n };\n};\n","import type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n} from \"@kortyx/hooks\";\n\ntype TopologyKey = {\n environment: string;\n workflowId: string;\n topologyHash: string;\n};\n\nconst keyFor = ({ environment, workflowId, topologyHash }: TopologyKey) =>\n `${environment}:${workflowId}:${topologyHash}`;\n\n/** Caches successful topology ensures and coalesces concurrent requests. */\nexport const createTopologyResolver = (args: {\n ensure: (\n snapshot: EnsureWorkflowTopologyRequest,\n ) => Promise<EnsureWorkflowTopologyResponse>;\n}) => {\n const revisions = new Map<string, string>();\n const pending = new Map<string, Promise<EnsureWorkflowTopologyResponse>>();\n\n const ensureWorkflowTopology = (\n snapshot: EnsureWorkflowTopologyRequest,\n ): Promise<EnsureWorkflowTopologyResponse> => {\n const key = keyFor({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n const revision = revisions.get(key);\n if (revision) {\n return Promise.resolve({ workflowRevisionId: revision, created: false });\n }\n\n const existing = pending.get(key);\n if (existing) return existing;\n\n const request = args\n .ensure(snapshot)\n .then((result) => {\n if (!result.workflowRevisionId) {\n throw new Error(\n \"Telemetry API returned an invalid workflow revision.\",\n );\n }\n revisions.set(key, result.workflowRevisionId);\n return result;\n })\n .finally(() => {\n pending.delete(key);\n });\n pending.set(key, request);\n return request;\n };\n\n return {\n ensureWorkflowTopology,\n getWorkflowRevisionId: (args: TopologyKey) => revisions.get(keyFor(args)),\n };\n};\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport { ToolObservationSchema } from \"@kortyx/telemetry-contracts\";\nimport type { createEventMapper } from \"./event-mapper\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\n/** Maps generic SDK trace calls to Kortyx Studio's span and generation facts. */\nexport const createTraceAdapter = (args: {\n captureContent?: KortyxTelemetryConfig[\"captureContent\"] | undefined;\n createId: () => string;\n enqueue: (event: KortyxTelemetryEvent) => void;\n eventMapper: ReturnType<typeof createEventMapper>;\n}): ReasonTraceAdapter => {\n const activeSpans = new AsyncLocalStorage<ActiveSpan>();\n\n const createSpan = (\n startArgs: ReasonTraceSpanStartArgs,\n ): { span: ReasonTraceSpan; active?: ActiveSpan | undefined } => {\n const parent = activeSpans.getStore();\n const span: SpanContext = {\n traceId: parent?.traceId ?? args.createId(),\n spanId: args.createId(),\n };\n const attributes = { ...(startArgs.attributes ?? {}) };\n const currentAttributes = { ...attributes };\n const correlation = args.eventMapper.correlationFrom(attributes, parent);\n const startedAt = Date.now();\n\n const isTool = startArgs.name === \"kortyx.tool\";\n if (correlation && (!isTool || attributes.executed === true)) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: isTool ? \"tool.started\" : \"span.started\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: isTool\n ? ToolObservationSchema.parse(attributes)\n : {\n name: startArgs.name,\n attributes: currentAttributes,\n telemetry: args.eventMapper.telemetryPayload(\n startArgs.telemetry,\n ),\n ...(args.eventMapper.shouldCapture(\n startArgs.telemetry?.captureContent ?? args.captureContent,\n \"input\",\n )\n ? { input: startArgs.telemetry?.input }\n : {}),\n },\n context: args.eventMapper.spanContext(\n startArgs.telemetry,\n currentAttributes,\n ),\n }),\n );\n }\n\n let ended = false;\n let failed = false;\n const end = (endArgs?: ReasonTraceSpanEndArgs): void => {\n if (ended) return;\n ended = true;\n if (!correlation) return;\n\n const endAttributes = {\n ...currentAttributes,\n ...(endArgs?.attributes ?? {}),\n };\n const telemetry = endArgs?.telemetry ?? startArgs.telemetry;\n const durationMs = Date.now() - startedAt;\n if (isTool) {\n const payload = ToolObservationSchema.parse(endAttributes);\n const type =\n payload.observationKind === \"reused\"\n ? \"tool.reused\"\n : payload.observationKind === \"waiting\"\n ? \"tool.waiting\"\n : payload.suspended\n ? \"tool.suspended\"\n : payload.outcome === \"denied\"\n ? \"tool.denied\"\n : payload.outcome === \"fault\"\n ? \"tool.failed\"\n : payload.outcome === \"cancelled\"\n ? \"tool.cancelled\"\n : \"tool.completed\";\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload,\n }),\n );\n return;\n }\n\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.ended\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: endAttributes,\n durationMs,\n telemetry: args.eventMapper.telemetryPayload(telemetry),\n ...(args.eventMapper.shouldCapture(\n endArgs?.telemetry?.captureContent ??\n startArgs.telemetry?.captureContent ??\n args.captureContent,\n \"output\",\n )\n ? { output: endArgs?.telemetry?.output }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, endAttributes),\n }),\n );\n\n if (startArgs.name !== \"runReasonEngine\") return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"generation.completed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n outcome: failed ? \"failed\" : \"completed\",\n provider:\n args.eventMapper.stringValue(attributes.providerId) ?? \"unknown\",\n model:\n args.eventMapper.stringValue(attributes.modelId) ?? \"unknown\",\n durationMs,\n ...(ttftMs !== undefined ? { ttftMs } : {}),\n ...(streamDurationMs !== undefined ? { streamDurationMs } : {}),\n ...(timeToLastTokenMs !== undefined\n ? {\n postStreamDurationMs: Math.max(\n 0,\n durationMs - timeToLastTokenMs,\n ),\n }\n : {}),\n ...(endArgs?.usage\n ? {\n usage: failed\n ? Object.fromEntries(\n Object.entries(endArgs.usage).filter(\n ([key, value]) =>\n ([\n \"input\",\n \"output\",\n \"total\",\n \"reasoning\",\n \"cacheRead\",\n \"cacheWrite\",\n \"cacheWrite1h\",\n ].includes(key) &&\n typeof value === \"number\" &&\n Number.isFinite(value)) ||\n ([\n \"outputIncludesReasoning\",\n \"inputIncludesCacheRead\",\n \"inputIncludesCacheWrite\",\n ].includes(key) &&\n typeof value === \"boolean\"),\n ),\n )\n : endArgs.usage,\n }\n : {}),\n ...(endArgs?.finishReason\n ? { finishReason: endArgs.finishReason }\n : {}),\n ...(endArgs?.warnings ? { warnings: endArgs.warnings } : {}),\n ...(endArgs?.providerMetadata && !failed\n ? { providerMetadata: endArgs.providerMetadata }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, currentAttributes),\n }),\n );\n };\n\n const traceSpan: ReasonTraceSpan = {\n setAttributes: (nextAttributes) => {\n Object.assign(currentAttributes, nextAttributes);\n },\n addEvent: (name, eventAttributes = {}) => {\n if (\n !correlation ||\n activeSpans.getStore()?.name === \"kortyx.tool\" ||\n startArgs.name === \"kortyx.tool\"\n )\n return;\n const type =\n name === \"useReason.tool-call.start\"\n ? \"tool.started\"\n : name === \"useReason.tool-call.complete\"\n ? \"tool.completed\"\n : name === \"useReason.tool-call.error\"\n ? \"tool.failed\"\n : undefined;\n if (!type) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: eventAttributes,\n }),\n );\n },\n end,\n fail: (error, endArgs) => {\n if (ended) return;\n failed = true;\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.failed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n error: args.eventMapper.asErrorPayload(error, startArgs.name),\n durationMs: Date.now() - startedAt,\n },\n }),\n );\n }\n end(endArgs);\n },\n };\n\n return {\n span: traceSpan,\n ...(correlation\n ? { active: { ...span, name: startArgs.name, correlation } }\n : {}),\n };\n };\n\n return {\n startSpan: (startArgs) => createSpan(startArgs).span,\n withSpan: async (startArgs, fn) => {\n const created = createSpan(startArgs);\n const run = async (): Promise<Awaited<ReturnType<typeof fn>>> => {\n try {\n const result = await fn(created.span);\n created.span.end?.();\n return result;\n } catch (error) {\n try {\n created.span.fail?.(error);\n } catch {\n /* Preserve the callback failure. */\n }\n throw error;\n }\n };\n return created.active ? activeSpans.run(created.active, run) : run();\n },\n getActiveContext: () => {\n const active = activeSpans.getStore();\n return active\n ? { traceId: active.traceId, spanId: active.spanId }\n : undefined;\n },\n };\n};\n\nconst nonnegativeNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n"],"mappings":"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","names":["result","args"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/telemetry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Kortyx Studio telemetry HTTP adapter.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"CHANGELOG.md"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@kortyx/hooks": "0.
|
|
22
|
-
"@kortyx/
|
|
23
|
-
"@kortyx/
|
|
21
|
+
"@kortyx/hooks": "0.26.0",
|
|
22
|
+
"@kortyx/core": "0.9.0",
|
|
23
|
+
"@kortyx/telemetry-contracts": "0.9.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"tsup": "^8.5.1",
|