@kortyx/otel 0.3.0 → 0.4.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 CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.1](https://github.com/kortyx-io/kortyx/compare/otel-v0.4.0...otel-v0.4.1) (2026-05-28)
4
+
5
+
6
+ ### Dependencies
7
+
8
+ * The following workspace dependencies were updated
9
+ * dependencies
10
+ * @kortyx/hooks bumped to 0.17.1
11
+
12
+ ## [0.4.0](https://github.com/kortyx-io/kortyx/compare/otel-v0.3.0...otel-v0.4.0) (2026-05-26)
13
+
14
+
15
+ ### Features
16
+
17
+ * **agent:** expose run trace ids in streams ([50521cd](https://github.com/kortyx-io/kortyx/commit/50521cd27d58cd66d93cf19a88d160c0cd0b3ec4))
18
+ * **agent:** expose run trace ids in streams ([260e96e](https://github.com/kortyx-io/kortyx/commit/260e96e72018eac5a3f91c36ed661abf11a1caf4))
19
+
20
+
21
+ ### Dependencies
22
+
23
+ * The following workspace dependencies were updated
24
+ * dependencies
25
+ * @kortyx/hooks bumped to 0.17.0
26
+
3
27
  ## [0.3.0](https://github.com/kortyx-io/kortyx/compare/otel-v0.2.0...otel-v0.3.0) (2026-05-25)
4
28
 
5
29
 
package/dist/index.js CHANGED
@@ -327,6 +327,15 @@ function createOpenTelemetryTraceAdapter(options = {}) {
327
327
  }
328
328
  }
329
329
  );
330
+ },
331
+ getActiveContext: () => {
332
+ const span = import_api2.trace.getActiveSpan();
333
+ if (!span) return void 0;
334
+ const spanContext = span.spanContext();
335
+ return {
336
+ traceId: spanContext.traceId,
337
+ spanId: spanContext.spanId
338
+ };
330
339
  }
331
340
  };
332
341
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/content.ts","../src/attributes.ts","../src/span-wrapper.ts"],"sourcesContent":["export { createOpenTelemetryTraceAdapter } from \"./adapter\";\nexport type {\n OpenTelemetryMapAttributesArgs,\n OpenTelemetrySpanEndInfo,\n OpenTelemetrySpanStartInfo,\n OpenTelemetryTraceAdapterOptions,\n OpenTelemetryTracePhase,\n} from \"./types\";\n","import type {\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport { context, SpanKind, trace } from \"@opentelemetry/api\";\nimport {\n applyAttributeMapping,\n startAttributes,\n toAttributes,\n} from \"./attributes\";\nimport { createSpanWrapper } from \"./span-wrapper\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport function createOpenTelemetryTraceAdapter(\n options: OpenTelemetryTraceAdapterOptions = {},\n): ReasonTraceAdapter {\n const tracer =\n options.tracer ??\n trace.getTracer(\n options.instrumentationName ?? \"kortyx\",\n options.instrumentationVersion,\n );\n\n const start = (args: ReasonTraceSpanStartArgs): ReasonTraceSpan => {\n const attributes = startAttributes(args, options);\n const span = tracer.startSpan(\n args.name,\n {\n kind: SpanKind.INTERNAL,\n attributes: spanStartOtelAttributes(args, attributes, options),\n },\n context.active(),\n );\n const spanContext = span.spanContext();\n options.onSpanStart?.({\n name: args.name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n attributes,\n });\n return createSpanWrapper(span, args.name, options);\n };\n\n return {\n startSpan: start,\n withSpan: async (args, fn) => {\n const attributes = startAttributes(args, options);\n return tracer.startActiveSpan(\n args.name,\n {\n kind: SpanKind.INTERNAL,\n attributes: spanStartOtelAttributes(args, attributes, options),\n },\n async (span) => {\n const wrapped = createSpanWrapper(span, args.name, options);\n const spanContext = span.spanContext();\n options.onSpanStart?.({\n name: args.name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n attributes,\n });\n try {\n const result = await fn(wrapped);\n if (!wrapped.ended) wrapped.end?.();\n return result;\n } catch (error) {\n wrapped.fail?.(error);\n throw error;\n }\n },\n );\n },\n };\n}\n\nconst spanStartOtelAttributes = (\n args: ReasonTraceSpanStartArgs,\n attributes: ReasonTraceAttributes,\n options: OpenTelemetryTraceAdapterOptions,\n) =>\n toAttributes(\n applyAttributeMapping(args.name, attributes, options, {\n phase: \"start\",\n telemetry: args.telemetry,\n }),\n );\n","import type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport type ContentCaptureSide = \"input\" | \"output\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const shouldCapture = (\n value: OpenTelemetryTraceAdapterOptions[\"captureContent\"],\n side: ContentCaptureSide,\n): boolean => {\n if (value === true) return true;\n if (!isRecord(value)) return false;\n return Boolean(value[side]);\n};\n","import type {\n KortyxTraceMetadata,\n ReasonTraceAttributes,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { Attributes } from \"@opentelemetry/api\";\nimport { type ContentCaptureSide, shouldCapture } from \"./content\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\ntype OpenTelemetryAttributeValue =\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[];\n\nexport const toAttributeValue = (\n value: unknown,\n): OpenTelemetryAttributeValue | undefined => {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === \"string\")) {\n return value as string[];\n }\n if (value.every((item) => typeof item === \"number\")) {\n return value as number[];\n }\n if (value.every((item) => typeof item === \"boolean\")) {\n return value as boolean[];\n }\n }\n if (value === null || value === undefined) return undefined;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const toAttributes = (attributes: ReasonTraceAttributes): Attributes => {\n const result: Attributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n const attributeValue = toAttributeValue(value);\n if (attributeValue !== undefined) result[key] = attributeValue;\n }\n return result;\n};\n\nexport const normalizeKnownAttributes = (\n attributes: ReasonTraceAttributes,\n): ReasonTraceAttributes => {\n const normalized: ReasonTraceAttributes = { ...attributes };\n\n if (typeof attributes.providerId === \"string\") {\n normalized[\"gen_ai.provider.name\"] = attributes.providerId;\n normalized[\"kortyx.provider.id\"] = attributes.providerId;\n }\n if (typeof attributes.modelId === \"string\") {\n normalized[\"gen_ai.request.model\"] = attributes.modelId;\n normalized[\"kortyx.model.id\"] = attributes.modelId;\n }\n if (typeof attributes.stream === \"boolean\") {\n normalized[\"gen_ai.request.stream\"] = attributes.stream;\n }\n if (typeof attributes.operation === \"string\") {\n normalized[\"gen_ai.operation.name\"] = attributes.operation;\n normalized[\"kortyx.operation.name\"] = attributes.operation;\n }\n if (typeof attributes.nodeId === \"string\") {\n normalized[\"kortyx.node.id\"] = attributes.nodeId;\n }\n if (typeof attributes.workflowId === \"string\") {\n normalized[\"kortyx.workflow.id\"] = attributes.workflowId;\n }\n if (typeof attributes.runId === \"string\") {\n normalized[\"kortyx.run.id\"] = attributes.runId;\n }\n if (typeof attributes.sessionId === \"string\") {\n normalized[\"session.id\"] = attributes.sessionId;\n normalized[\"gen_ai.conversation.id\"] = attributes.sessionId;\n normalized[\"kortyx.session.id\"] = attributes.sessionId;\n }\n if (typeof attributes.userId === \"string\") {\n normalized[\"user.id\"] = attributes.userId;\n }\n if (typeof attributes.tenantId === \"string\") {\n normalized[\"kortyx.tenant.id\"] = attributes.tenantId;\n }\n if (typeof attributes.promptName === \"string\") {\n normalized[\"gen_ai.prompt.name\"] = attributes.promptName;\n normalized[\"kortyx.prompt.name\"] = attributes.promptName;\n }\n if (attributes.promptVersion !== undefined) {\n normalized[\"gen_ai.prompt.version\"] = attributes.promptVersion;\n normalized[\"kortyx.prompt.version\"] = attributes.promptVersion;\n }\n if (typeof attributes.promptType === \"string\") {\n normalized[\"gen_ai.prompt.type\"] = attributes.promptType;\n normalized[\"kortyx.prompt.type\"] = attributes.promptType;\n }\n if (typeof attributes.toolCallCount === \"number\") {\n normalized[\"kortyx.tool.call.count\"] = attributes.toolCallCount;\n }\n if (typeof attributes.toolResultCount === \"number\") {\n normalized[\"kortyx.tool.result.count\"] = attributes.toolResultCount;\n }\n if (typeof attributes.toolStepCount === \"number\") {\n normalized[\"kortyx.tool.step.count\"] = attributes.toolStepCount;\n }\n if (typeof attributes.tool === \"string\") {\n normalized[\"gen_ai.tool.name\"] = attributes.tool;\n normalized[\"kortyx.tool.name\"] = attributes.tool;\n }\n if (typeof attributes.toolCallId === \"string\") {\n normalized[\"kortyx.tool.call.id\"] = attributes.toolCallId;\n }\n\n return normalized;\n};\n\nexport const telemetryAttributes = (\n telemetry: KortyxTraceMetadata | undefined,\n options: OpenTelemetryTraceAdapterOptions,\n side?: ContentCaptureSide,\n): ReasonTraceAttributes => {\n const attributes: ReasonTraceAttributes = {};\n if (!telemetry) return attributes;\n\n if (telemetry.operation) {\n attributes.operation = telemetry.operation;\n attributes[\"gen_ai.operation.name\"] = telemetry.operation;\n }\n\n if (telemetry.prompt) {\n const prompt = telemetry.prompt;\n if (prompt.name) attributes[\"gen_ai.prompt.name\"] = prompt.name;\n if (prompt.name) attributes[\"kortyx.prompt.name\"] = prompt.name;\n if (prompt.version !== undefined) {\n attributes[\"gen_ai.prompt.version\"] = prompt.version;\n attributes[\"kortyx.prompt.version\"] = prompt.version;\n }\n if (prompt.type) attributes[\"gen_ai.prompt.type\"] = prompt.type;\n if (prompt.type) attributes[\"kortyx.prompt.type\"] = prompt.type;\n if (prompt.source) attributes[\"kortyx.prompt.source\"] = prompt.source;\n Object.assign(attributes, options.mapPromptMetadata?.(prompt) ?? {});\n }\n\n if (telemetry.tags?.length) {\n attributes[\"kortyx.trace.tags\"] = telemetry.tags;\n }\n\n if (telemetry.metadata) {\n for (const [key, value] of Object.entries(telemetry.metadata)) {\n attributes[`kortyx.trace.metadata.${key}`] = value;\n }\n }\n\n if (\n side === \"input\" &&\n shouldCapture(telemetry.captureContent ?? options.captureContent, \"input\")\n ) {\n attributes[\"gen_ai.prompt\"] = telemetry.input;\n attributes[\"kortyx.trace.input\"] = telemetry.input;\n }\n if (\n side === \"output\" &&\n shouldCapture(telemetry.captureContent ?? options.captureContent, \"output\")\n ) {\n attributes[\"gen_ai.completion\"] = telemetry.output;\n attributes[\"kortyx.trace.output\"] = telemetry.output;\n }\n\n return attributes;\n};\n\nexport const usageAttributes = (\n args: ReasonTraceSpanEndArgs | undefined,\n): ReasonTraceAttributes => {\n const usage = args?.usage;\n if (!usage) return {};\n return {\n ...(usage.input !== undefined\n ? { \"gen_ai.usage.input_tokens\": usage.input }\n : {}),\n ...(usage.output !== undefined\n ? { \"gen_ai.usage.output_tokens\": usage.output }\n : {}),\n ...(usage.total !== undefined\n ? { \"gen_ai.usage.total_tokens\": usage.total }\n : {}),\n ...(usage.reasoning !== undefined\n ? { \"gen_ai.usage.reasoning.output_tokens\": usage.reasoning }\n : {}),\n ...(usage.cacheRead !== undefined\n ? { \"gen_ai.usage.cache_read.input_tokens\": usage.cacheRead }\n : {}),\n ...(usage.cacheWrite !== undefined\n ? { \"gen_ai.usage.cache_creation.input_tokens\": usage.cacheWrite }\n : {}),\n ...(args.finishReason?.unified\n ? { \"gen_ai.response.finish_reasons\": [args.finishReason.unified] }\n : {}),\n ...(args.finishReason?.raw\n ? { \"kortyx.finish_reason.raw\": args.finishReason.raw }\n : {}),\n ...(args.warnings?.length\n ? { \"kortyx.warning.count\": args.warnings.length }\n : {}),\n };\n};\n\nexport const startAttributes = (\n args: ReasonTraceSpanStartArgs,\n options: OpenTelemetryTraceAdapterOptions,\n): ReasonTraceAttributes => ({\n ...(options.defaultAttributes ?? {}),\n ...(args.attributes ?? {}),\n ...telemetryAttributes(args.telemetry, options, \"input\"),\n});\n\nexport const applyAttributeMapping = (\n name: string,\n attributes: ReasonTraceAttributes,\n options: OpenTelemetryTraceAdapterOptions,\n args: Omit<\n Parameters<\n NonNullable<OpenTelemetryTraceAdapterOptions[\"mapAttributes\"]>\n >[0],\n \"name\" | \"attributes\"\n >,\n): ReasonTraceAttributes => {\n const mapped =\n options.mapAttributes?.({\n ...args,\n name,\n attributes,\n }) ?? {};\n return normalizeKnownAttributes({ ...attributes, ...mapped });\n};\n","import type { ReasonTraceSpan, ReasonTraceSpanEndArgs } from \"@kortyx/hooks\";\nimport { type Span, SpanStatusCode } from \"@opentelemetry/api\";\nimport {\n applyAttributeMapping,\n normalizeKnownAttributes,\n telemetryAttributes,\n toAttributes,\n usageAttributes,\n} from \"./attributes\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport type OpenTelemetryReasonSpan = ReasonTraceSpan & { ended: boolean };\n\nexport const createSpanWrapper = (\n span: Span,\n name: string,\n options: OpenTelemetryTraceAdapterOptions,\n): OpenTelemetryReasonSpan => {\n const wrapper: OpenTelemetryReasonSpan = {\n ended: false,\n setAttributes: (attributes) => {\n span.setAttributes(toAttributes(normalizeKnownAttributes(attributes)));\n },\n addEvent: (eventName, attributes) => {\n span.addEvent(\n eventName,\n toAttributes(\n applyAttributeMapping(name, attributes ?? {}, options, {\n phase: \"event\",\n }),\n ),\n );\n },\n end: (args) => {\n if (wrapper.ended) return;\n const attributes = spanEndAttributes(args, options);\n span.setAttributes(\n toAttributes(\n applyAttributeMapping(name, attributes, options, {\n phase: \"end\",\n telemetry: args?.telemetry,\n end: args,\n }),\n ),\n );\n wrapper.ended = true;\n span.end();\n const spanContext = span.spanContext();\n options.onSpanEnd?.({\n name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n });\n },\n fail: (error, args) => {\n const message = error instanceof Error ? error.message : String(error);\n span.recordException(error instanceof Error ? error : new Error(message));\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n const attributes = spanErrorAttributes(error, args);\n span.setAttributes(\n toAttributes(\n applyAttributeMapping(name, attributes, options, {\n phase: \"error\",\n telemetry: args?.telemetry,\n end: args,\n error,\n }),\n ),\n );\n wrapper.end?.(args);\n },\n };\n return wrapper;\n};\n\nconst spanEndAttributes = (\n args: ReasonTraceSpanEndArgs | undefined,\n options: OpenTelemetryTraceAdapterOptions,\n) => ({\n ...(args?.attributes ?? {}),\n ...usageAttributes(args),\n ...telemetryAttributes(args?.telemetry, options, \"output\"),\n});\n\nconst spanErrorAttributes = (\n error: unknown,\n args: ReasonTraceSpanEndArgs | undefined,\n) => {\n const message = error instanceof Error ? error.message : String(error);\n return {\n ...(args?.attributes ?? {}),\n \"error.type\": error instanceof Error ? error.name : typeof error,\n \"error.message\": message,\n ...usageAttributes(args),\n };\n};\n"],"mappings":"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","names":["import_api"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/content.ts","../src/attributes.ts","../src/span-wrapper.ts"],"sourcesContent":["export { createOpenTelemetryTraceAdapter } from \"./adapter\";\nexport type {\n OpenTelemetryMapAttributesArgs,\n OpenTelemetrySpanEndInfo,\n OpenTelemetrySpanStartInfo,\n OpenTelemetryTraceAdapterOptions,\n OpenTelemetryTracePhase,\n} from \"./types\";\n","import type {\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport { context, SpanKind, trace } from \"@opentelemetry/api\";\nimport {\n applyAttributeMapping,\n startAttributes,\n toAttributes,\n} from \"./attributes\";\nimport { createSpanWrapper } from \"./span-wrapper\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport function createOpenTelemetryTraceAdapter(\n options: OpenTelemetryTraceAdapterOptions = {},\n): ReasonTraceAdapter {\n const tracer =\n options.tracer ??\n trace.getTracer(\n options.instrumentationName ?? \"kortyx\",\n options.instrumentationVersion,\n );\n\n const start = (args: ReasonTraceSpanStartArgs): ReasonTraceSpan => {\n const attributes = startAttributes(args, options);\n const span = tracer.startSpan(\n args.name,\n {\n kind: SpanKind.INTERNAL,\n attributes: spanStartOtelAttributes(args, attributes, options),\n },\n context.active(),\n );\n const spanContext = span.spanContext();\n options.onSpanStart?.({\n name: args.name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n attributes,\n });\n return createSpanWrapper(span, args.name, options);\n };\n\n return {\n startSpan: start,\n withSpan: async (args, fn) => {\n const attributes = startAttributes(args, options);\n return tracer.startActiveSpan(\n args.name,\n {\n kind: SpanKind.INTERNAL,\n attributes: spanStartOtelAttributes(args, attributes, options),\n },\n async (span) => {\n const wrapped = createSpanWrapper(span, args.name, options);\n const spanContext = span.spanContext();\n options.onSpanStart?.({\n name: args.name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n attributes,\n });\n try {\n const result = await fn(wrapped);\n if (!wrapped.ended) wrapped.end?.();\n return result;\n } catch (error) {\n wrapped.fail?.(error);\n throw error;\n }\n },\n );\n },\n getActiveContext: () => {\n const span = trace.getActiveSpan();\n if (!span) return undefined;\n const spanContext = span.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n };\n },\n };\n}\n\nconst spanStartOtelAttributes = (\n args: ReasonTraceSpanStartArgs,\n attributes: ReasonTraceAttributes,\n options: OpenTelemetryTraceAdapterOptions,\n) =>\n toAttributes(\n applyAttributeMapping(args.name, attributes, options, {\n phase: \"start\",\n telemetry: args.telemetry,\n }),\n );\n","import type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport type ContentCaptureSide = \"input\" | \"output\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const shouldCapture = (\n value: OpenTelemetryTraceAdapterOptions[\"captureContent\"],\n side: ContentCaptureSide,\n): boolean => {\n if (value === true) return true;\n if (!isRecord(value)) return false;\n return Boolean(value[side]);\n};\n","import type {\n KortyxTraceMetadata,\n ReasonTraceAttributes,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { Attributes } from \"@opentelemetry/api\";\nimport { type ContentCaptureSide, shouldCapture } from \"./content\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\ntype OpenTelemetryAttributeValue =\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[];\n\nexport const toAttributeValue = (\n value: unknown,\n): OpenTelemetryAttributeValue | undefined => {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === \"string\")) {\n return value as string[];\n }\n if (value.every((item) => typeof item === \"number\")) {\n return value as number[];\n }\n if (value.every((item) => typeof item === \"boolean\")) {\n return value as boolean[];\n }\n }\n if (value === null || value === undefined) return undefined;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const toAttributes = (attributes: ReasonTraceAttributes): Attributes => {\n const result: Attributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n const attributeValue = toAttributeValue(value);\n if (attributeValue !== undefined) result[key] = attributeValue;\n }\n return result;\n};\n\nexport const normalizeKnownAttributes = (\n attributes: ReasonTraceAttributes,\n): ReasonTraceAttributes => {\n const normalized: ReasonTraceAttributes = { ...attributes };\n\n if (typeof attributes.providerId === \"string\") {\n normalized[\"gen_ai.provider.name\"] = attributes.providerId;\n normalized[\"kortyx.provider.id\"] = attributes.providerId;\n }\n if (typeof attributes.modelId === \"string\") {\n normalized[\"gen_ai.request.model\"] = attributes.modelId;\n normalized[\"kortyx.model.id\"] = attributes.modelId;\n }\n if (typeof attributes.stream === \"boolean\") {\n normalized[\"gen_ai.request.stream\"] = attributes.stream;\n }\n if (typeof attributes.operation === \"string\") {\n normalized[\"gen_ai.operation.name\"] = attributes.operation;\n normalized[\"kortyx.operation.name\"] = attributes.operation;\n }\n if (typeof attributes.nodeId === \"string\") {\n normalized[\"kortyx.node.id\"] = attributes.nodeId;\n }\n if (typeof attributes.workflowId === \"string\") {\n normalized[\"kortyx.workflow.id\"] = attributes.workflowId;\n }\n if (typeof attributes.runId === \"string\") {\n normalized[\"kortyx.run.id\"] = attributes.runId;\n }\n if (typeof attributes.sessionId === \"string\") {\n normalized[\"session.id\"] = attributes.sessionId;\n normalized[\"gen_ai.conversation.id\"] = attributes.sessionId;\n normalized[\"kortyx.session.id\"] = attributes.sessionId;\n }\n if (typeof attributes.userId === \"string\") {\n normalized[\"user.id\"] = attributes.userId;\n }\n if (typeof attributes.tenantId === \"string\") {\n normalized[\"kortyx.tenant.id\"] = attributes.tenantId;\n }\n if (typeof attributes.promptName === \"string\") {\n normalized[\"gen_ai.prompt.name\"] = attributes.promptName;\n normalized[\"kortyx.prompt.name\"] = attributes.promptName;\n }\n if (attributes.promptVersion !== undefined) {\n normalized[\"gen_ai.prompt.version\"] = attributes.promptVersion;\n normalized[\"kortyx.prompt.version\"] = attributes.promptVersion;\n }\n if (typeof attributes.promptType === \"string\") {\n normalized[\"gen_ai.prompt.type\"] = attributes.promptType;\n normalized[\"kortyx.prompt.type\"] = attributes.promptType;\n }\n if (typeof attributes.toolCallCount === \"number\") {\n normalized[\"kortyx.tool.call.count\"] = attributes.toolCallCount;\n }\n if (typeof attributes.toolResultCount === \"number\") {\n normalized[\"kortyx.tool.result.count\"] = attributes.toolResultCount;\n }\n if (typeof attributes.toolStepCount === \"number\") {\n normalized[\"kortyx.tool.step.count\"] = attributes.toolStepCount;\n }\n if (typeof attributes.tool === \"string\") {\n normalized[\"gen_ai.tool.name\"] = attributes.tool;\n normalized[\"kortyx.tool.name\"] = attributes.tool;\n }\n if (typeof attributes.toolCallId === \"string\") {\n normalized[\"kortyx.tool.call.id\"] = attributes.toolCallId;\n }\n\n return normalized;\n};\n\nexport const telemetryAttributes = (\n telemetry: KortyxTraceMetadata | undefined,\n options: OpenTelemetryTraceAdapterOptions,\n side?: ContentCaptureSide,\n): ReasonTraceAttributes => {\n const attributes: ReasonTraceAttributes = {};\n if (!telemetry) return attributes;\n\n if (telemetry.operation) {\n attributes.operation = telemetry.operation;\n attributes[\"gen_ai.operation.name\"] = telemetry.operation;\n }\n\n if (telemetry.prompt) {\n const prompt = telemetry.prompt;\n if (prompt.name) attributes[\"gen_ai.prompt.name\"] = prompt.name;\n if (prompt.name) attributes[\"kortyx.prompt.name\"] = prompt.name;\n if (prompt.version !== undefined) {\n attributes[\"gen_ai.prompt.version\"] = prompt.version;\n attributes[\"kortyx.prompt.version\"] = prompt.version;\n }\n if (prompt.type) attributes[\"gen_ai.prompt.type\"] = prompt.type;\n if (prompt.type) attributes[\"kortyx.prompt.type\"] = prompt.type;\n if (prompt.source) attributes[\"kortyx.prompt.source\"] = prompt.source;\n Object.assign(attributes, options.mapPromptMetadata?.(prompt) ?? {});\n }\n\n if (telemetry.tags?.length) {\n attributes[\"kortyx.trace.tags\"] = telemetry.tags;\n }\n\n if (telemetry.metadata) {\n for (const [key, value] of Object.entries(telemetry.metadata)) {\n attributes[`kortyx.trace.metadata.${key}`] = value;\n }\n }\n\n if (\n side === \"input\" &&\n shouldCapture(telemetry.captureContent ?? options.captureContent, \"input\")\n ) {\n attributes[\"gen_ai.prompt\"] = telemetry.input;\n attributes[\"kortyx.trace.input\"] = telemetry.input;\n }\n if (\n side === \"output\" &&\n shouldCapture(telemetry.captureContent ?? options.captureContent, \"output\")\n ) {\n attributes[\"gen_ai.completion\"] = telemetry.output;\n attributes[\"kortyx.trace.output\"] = telemetry.output;\n }\n\n return attributes;\n};\n\nexport const usageAttributes = (\n args: ReasonTraceSpanEndArgs | undefined,\n): ReasonTraceAttributes => {\n const usage = args?.usage;\n if (!usage) return {};\n return {\n ...(usage.input !== undefined\n ? { \"gen_ai.usage.input_tokens\": usage.input }\n : {}),\n ...(usage.output !== undefined\n ? { \"gen_ai.usage.output_tokens\": usage.output }\n : {}),\n ...(usage.total !== undefined\n ? { \"gen_ai.usage.total_tokens\": usage.total }\n : {}),\n ...(usage.reasoning !== undefined\n ? { \"gen_ai.usage.reasoning.output_tokens\": usage.reasoning }\n : {}),\n ...(usage.cacheRead !== undefined\n ? { \"gen_ai.usage.cache_read.input_tokens\": usage.cacheRead }\n : {}),\n ...(usage.cacheWrite !== undefined\n ? { \"gen_ai.usage.cache_creation.input_tokens\": usage.cacheWrite }\n : {}),\n ...(args.finishReason?.unified\n ? { \"gen_ai.response.finish_reasons\": [args.finishReason.unified] }\n : {}),\n ...(args.finishReason?.raw\n ? { \"kortyx.finish_reason.raw\": args.finishReason.raw }\n : {}),\n ...(args.warnings?.length\n ? { \"kortyx.warning.count\": args.warnings.length }\n : {}),\n };\n};\n\nexport const startAttributes = (\n args: ReasonTraceSpanStartArgs,\n options: OpenTelemetryTraceAdapterOptions,\n): ReasonTraceAttributes => ({\n ...(options.defaultAttributes ?? {}),\n ...(args.attributes ?? {}),\n ...telemetryAttributes(args.telemetry, options, \"input\"),\n});\n\nexport const applyAttributeMapping = (\n name: string,\n attributes: ReasonTraceAttributes,\n options: OpenTelemetryTraceAdapterOptions,\n args: Omit<\n Parameters<\n NonNullable<OpenTelemetryTraceAdapterOptions[\"mapAttributes\"]>\n >[0],\n \"name\" | \"attributes\"\n >,\n): ReasonTraceAttributes => {\n const mapped =\n options.mapAttributes?.({\n ...args,\n name,\n attributes,\n }) ?? {};\n return normalizeKnownAttributes({ ...attributes, ...mapped });\n};\n","import type { ReasonTraceSpan, ReasonTraceSpanEndArgs } from \"@kortyx/hooks\";\nimport { type Span, SpanStatusCode } from \"@opentelemetry/api\";\nimport {\n applyAttributeMapping,\n normalizeKnownAttributes,\n telemetryAttributes,\n toAttributes,\n usageAttributes,\n} from \"./attributes\";\nimport type { OpenTelemetryTraceAdapterOptions } from \"./types\";\n\nexport type OpenTelemetryReasonSpan = ReasonTraceSpan & { ended: boolean };\n\nexport const createSpanWrapper = (\n span: Span,\n name: string,\n options: OpenTelemetryTraceAdapterOptions,\n): OpenTelemetryReasonSpan => {\n const wrapper: OpenTelemetryReasonSpan = {\n ended: false,\n setAttributes: (attributes) => {\n span.setAttributes(toAttributes(normalizeKnownAttributes(attributes)));\n },\n addEvent: (eventName, attributes) => {\n span.addEvent(\n eventName,\n toAttributes(\n applyAttributeMapping(name, attributes ?? {}, options, {\n phase: \"event\",\n }),\n ),\n );\n },\n end: (args) => {\n if (wrapper.ended) return;\n const attributes = spanEndAttributes(args, options);\n span.setAttributes(\n toAttributes(\n applyAttributeMapping(name, attributes, options, {\n phase: \"end\",\n telemetry: args?.telemetry,\n end: args,\n }),\n ),\n );\n wrapper.ended = true;\n span.end();\n const spanContext = span.spanContext();\n options.onSpanEnd?.({\n name,\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n });\n },\n fail: (error, args) => {\n const message = error instanceof Error ? error.message : String(error);\n span.recordException(error instanceof Error ? error : new Error(message));\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n const attributes = spanErrorAttributes(error, args);\n span.setAttributes(\n toAttributes(\n applyAttributeMapping(name, attributes, options, {\n phase: \"error\",\n telemetry: args?.telemetry,\n end: args,\n error,\n }),\n ),\n );\n wrapper.end?.(args);\n },\n };\n return wrapper;\n};\n\nconst spanEndAttributes = (\n args: ReasonTraceSpanEndArgs | undefined,\n options: OpenTelemetryTraceAdapterOptions,\n) => ({\n ...(args?.attributes ?? {}),\n ...usageAttributes(args),\n ...telemetryAttributes(args?.telemetry, options, \"output\"),\n});\n\nconst spanErrorAttributes = (\n error: unknown,\n args: ReasonTraceSpanEndArgs | undefined,\n) => {\n const message = error instanceof Error ? error.message : String(error);\n return {\n ...(args?.attributes ?? {}),\n \"error.type\": error instanceof Error ? error.name : typeof error,\n \"error.message\": message,\n ...usageAttributes(args),\n };\n};\n"],"mappings":"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","names":["import_api"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/otel",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "private": false,
5
5
  "description": "OpenTelemetry adapter for Kortyx tracing.",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "dependencies": {
35
- "@kortyx/hooks": "0.16.0"
35
+ "@kortyx/hooks": "0.17.1"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@opentelemetry/api": "^1.9.0"