@kortyx/otel 0.3.0 → 0.4.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 +15 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.4.0](https://github.com/kortyx-io/kortyx/compare/otel-v0.3.0...otel-v0.4.0) (2026-05-26)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **agent:** expose run trace ids in streams ([50521cd](https://github.com/kortyx-io/kortyx/commit/50521cd27d58cd66d93cf19a88d160c0cd0b3ec4))
|
|
9
|
+
* **agent:** expose run trace ids in streams ([260e96e](https://github.com/kortyx-io/kortyx/commit/260e96e72018eac5a3f91c36ed661abf11a1caf4))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Dependencies
|
|
13
|
+
|
|
14
|
+
* The following workspace dependencies were updated
|
|
15
|
+
* dependencies
|
|
16
|
+
* @kortyx/hooks bumped to 0.17.0
|
|
17
|
+
|
|
3
18
|
## [0.3.0](https://github.com/kortyx-io/kortyx/compare/otel-v0.2.0...otel-v0.3.0) (2026-05-25)
|
|
4
19
|
|
|
5
20
|
|
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
|
+
"version": "0.4.0",
|
|
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.
|
|
35
|
+
"@kortyx/hooks": "0.17.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"@opentelemetry/api": "^1.9.0"
|