@kortyx/telemetry 0.10.0 → 0.10.1
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 +7 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.10.1](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.10.0...telemetry-v0.10.1) (2026-09-29)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **telemetry:** price OpenRouter BYOK upstream usage ([#247](https://github.com/kortyx-io/kortyx/issues/247)) ([27e7f25](https://github.com/kortyx-io/kortyx/commit/27e7f25cb7a5d7e69859adbcdef6bb65d1107ef8))
|
|
9
|
+
|
|
3
10
|
## [0.10.0](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.9.0...telemetry-v0.10.0) (2026-09-25)
|
|
4
11
|
|
|
5
12
|
|
package/dist/index.js
CHANGED
|
@@ -291,7 +291,9 @@ var import_errors2 = require("@kortyx/core/errors");
|
|
|
291
291
|
var import_telemetry_contracts = require("@kortyx/telemetry-contracts");
|
|
292
292
|
var providerPricing = (metadata) => {
|
|
293
293
|
if (metadata?.providerId !== "openrouter") return void 0;
|
|
294
|
-
const
|
|
294
|
+
const details = metadata.costDetails;
|
|
295
|
+
const upstreamCost = details && typeof details === "object" && !Array.isArray(details) ? details.upstreamInferenceCost : void 0;
|
|
296
|
+
const cost = metadata.isByok === true ? upstreamCost : metadata.cost;
|
|
295
297
|
if (typeof cost !== "number" || !Number.isFinite(cost) || cost < 0)
|
|
296
298
|
return void 0;
|
|
297
299
|
return {
|
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 ...(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 sendBatch = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n try {\n await args.send(events);\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n // One invalid event (or an oversized request) must not discard the other\n // lifecycle facts in the same flush. Event IDs make a later retry safe.\n if (\n events.length > 1 &&\n (status === 400 || status === 413 || status === 422)\n ) {\n const middle = Math.floor(events.length / 2);\n await sendBatch(events.slice(0, middle));\n await sendBatch(events.slice(middle));\n return;\n }\n if (\n events.length === 1 &&\n status !== undefined &&\n status !== 429 &&\n status < 500\n ) {\n permanentFailures += 1;\n return;\n }\n throw error;\n }\n };\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 sendBatch(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 exceptionDiagnostics,\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 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 const diagnostic = exceptionDiagnostics(error, project);\n return {\n ...failure,\n name: diagnostic?.type ?? \"Error\",\n message: diagnostic?.message ?? failure.message,\n ...(diagnostic?.stack ? { stack: diagnostic.stack } : {}),\n ...(diagnostic?.cause ? { cause: diagnostic.cause } : {}),\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) => asErrorPayload(error, 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 { isSuspensionControlFlowError } from \"@kortyx/core/errors\";\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\nconst providerPricing = (\n metadata: ReasonTraceSpanEndArgs[\"providerMetadata\"],\n): Record<string, unknown> | undefined => {\n if (metadata?.providerId !== \"openrouter\") return undefined;\n const cost = metadata.cost;\n if (typeof cost !== \"number\" || !Number.isFinite(cost) || cost < 0)\n return undefined;\n return {\n source: \"provider\",\n currency: \"USD\",\n actualCostMicros: Math.round(cost * 1_000_000),\n };\n};\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 let suspended = 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\" || suspended) return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n const pricing = providerPricing(endArgs?.providerMetadata);\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 ...(pricing ? { pricing } : {}),\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 if (isSuspensionControlFlowError(error)) {\n suspended = true;\n Object.assign(currentAttributes, {\n \"kortyx.control_flow\": true,\n \"kortyx.suspended\": true,\n });\n end(endArgs);\n return;\n }\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 handled: false,\n severity: \"error\",\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 reportError: (error, options = {}) => {\n try {\n const active = activeSpans.getStore();\n if (!active) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"error.reported\",\n correlation: active.correlation,\n span: active,\n payload: {\n handled: true,\n severity: options.severity === \"warning\" ? \"warning\" : \"error\",\n error: args.eventMapper.asErrorPayload(error),\n },\n context: args.eventMapper.spanContext(\n {\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n },\n {},\n ),\n }),\n );\n } catch {\n // Error reporting is an observer and cannot change execution.\n }\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","import_errors"]}
|
|
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 sendBatch = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n try {\n await args.send(events);\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n // One invalid event (or an oversized request) must not discard the other\n // lifecycle facts in the same flush. Event IDs make a later retry safe.\n if (\n events.length > 1 &&\n (status === 400 || status === 413 || status === 422)\n ) {\n const middle = Math.floor(events.length / 2);\n await sendBatch(events.slice(0, middle));\n await sendBatch(events.slice(middle));\n return;\n }\n if (\n events.length === 1 &&\n status !== undefined &&\n status !== 429 &&\n status < 500\n ) {\n permanentFailures += 1;\n return;\n }\n throw error;\n }\n };\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 sendBatch(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 exceptionDiagnostics,\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 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 const diagnostic = exceptionDiagnostics(error, project);\n return {\n ...failure,\n name: diagnostic?.type ?? \"Error\",\n message: diagnostic?.message ?? failure.message,\n ...(diagnostic?.stack ? { stack: diagnostic.stack } : {}),\n ...(diagnostic?.cause ? { cause: diagnostic.cause } : {}),\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) => asErrorPayload(error, 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 { isSuspensionControlFlowError } from \"@kortyx/core/errors\";\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\nconst providerPricing = (\n metadata: ReasonTraceSpanEndArgs[\"providerMetadata\"],\n): Record<string, unknown> | undefined => {\n if (metadata?.providerId !== \"openrouter\") return undefined;\n const details = metadata.costDetails;\n const upstreamCost =\n details && typeof details === \"object\" && !Array.isArray(details)\n ? (details as Record<string, unknown>).upstreamInferenceCost\n : undefined;\n const cost = metadata.isByok === true ? upstreamCost : metadata.cost;\n if (typeof cost !== \"number\" || !Number.isFinite(cost) || cost < 0)\n return undefined;\n return {\n source: \"provider\",\n currency: \"USD\",\n actualCostMicros: Math.round(cost * 1_000_000),\n };\n};\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 let suspended = 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\" || suspended) return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n const pricing = providerPricing(endArgs?.providerMetadata);\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 ...(pricing ? { pricing } : {}),\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 if (isSuspensionControlFlowError(error)) {\n suspended = true;\n Object.assign(currentAttributes, {\n \"kortyx.control_flow\": true,\n \"kortyx.suspended\": true,\n });\n end(endArgs);\n return;\n }\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 handled: false,\n severity: \"error\",\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 reportError: (error, options = {}) => {\n try {\n const active = activeSpans.getStore();\n if (!active) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"error.reported\",\n correlation: active.correlation,\n span: active,\n payload: {\n handled: true,\n severity: options.severity === \"warning\" ? \"warning\" : \"error\",\n error: args.eventMapper.asErrorPayload(error),\n },\n context: args.eventMapper.spanContext(\n {\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n },\n {},\n ),\n }),\n );\n } catch {\n // Error reporting is an observer and cannot change execution.\n }\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","import_errors"]}
|