@anvia/otel 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Indra Zulfi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @anvia/otel
2
+
3
+ OpenTelemetry tracing adapter for Anvia.
4
+
5
+ Use this package to emit Anvia agent observer events as standard OpenTelemetry spans. The adapter uses your application's existing OpenTelemetry SDK or global tracer provider; it does not start, flush, or shut down an SDK.
6
+
7
+ ## Installation
8
+
9
+ ```sh
10
+ pnpm add @anvia/otel @anvia/core @opentelemetry/api
11
+ ```
12
+
13
+ In this monorepo, the package is available through the workspace:
14
+
15
+ ```sh
16
+ pnpm --filter @anvia/otel build
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```ts
22
+ import { AgentBuilder } from "@anvia/core";
23
+ import { OpenAIClient } from "@anvia/openai";
24
+ import { otel } from "@anvia/otel";
25
+
26
+ const tracing = otel.create({
27
+ serviceName: "support-agent",
28
+ });
29
+
30
+ const client = new OpenAIClient({
31
+ apiKey,
32
+ });
33
+
34
+ const agent = new AgentBuilder("support", client.completionModel())
35
+ .instructions("Answer support questions clearly.")
36
+ .observe(tracing)
37
+ .build();
38
+
39
+ const response = await agent.prompt("How do I reset my password?").send();
40
+
41
+ console.log(response.output);
42
+ console.log(response.trace?.traceId);
43
+ ```
44
+
45
+ Initialize OpenTelemetry in your application before creating spans. For OTLP HTTP, configure `@opentelemetry/sdk-node` and `@opentelemetry/exporter-trace-otlp-http` in your app process.
46
+
47
+ ## Exports
48
+
49
+ - `otel`
50
+ - `OtelTracing`
51
+ - `OtelTracingOptions`
52
+
53
+ ## Development
54
+
55
+ ```sh
56
+ pnpm --filter @anvia/otel typecheck
57
+ pnpm --filter @anvia/otel test
58
+ pnpm --filter @anvia/otel build
59
+ ```
@@ -0,0 +1,15 @@
1
+ import { AgentObserver } from '@anvia/core';
2
+ import { Tracer } from '@opentelemetry/api';
3
+
4
+ type OtelTracingOptions = {
5
+ tracer?: Tracer | undefined;
6
+ tracerName?: string | undefined;
7
+ tracerVersion?: string | undefined;
8
+ serviceName?: string | undefined;
9
+ };
10
+ type OtelTracing = AgentObserver;
11
+ declare const otel: {
12
+ create(options?: OtelTracingOptions): OtelTracing;
13
+ };
14
+
15
+ export { type OtelTracing, type OtelTracingOptions, otel };
package/dist/index.js ADDED
@@ -0,0 +1,287 @@
1
+ // src/index.ts
2
+ import {
3
+ textFromAssistantContent
4
+ } from "@anvia/core";
5
+ import {
6
+ context,
7
+ ROOT_CONTEXT,
8
+ SpanKind,
9
+ SpanStatusCode,
10
+ TraceFlags,
11
+ trace
12
+ } from "@opentelemetry/api";
13
+ var otel = {
14
+ create(options = {}) {
15
+ return new OtelAgentObserver(options);
16
+ }
17
+ };
18
+ var OtelAgentObserver = class {
19
+ tracer;
20
+ serviceName;
21
+ constructor(options) {
22
+ this.tracer = options.tracer ?? trace.getTracer(
23
+ emptyToUndefined(options.tracerName) ?? "@anvia/otel",
24
+ emptyToUndefined(options.tracerVersion)
25
+ );
26
+ this.serviceName = emptyToUndefined(options.serviceName);
27
+ }
28
+ startRun(args) {
29
+ const parentContext = parentContextFromTraceId(args.trace?.traceId);
30
+ const root = this.tracer.startSpan(
31
+ rootSpanName(args),
32
+ {
33
+ kind: SpanKind.INTERNAL,
34
+ attributes: runStartAttributes(args, this.serviceName)
35
+ },
36
+ parentContext
37
+ );
38
+ return new OtelRunObserver(this.tracer, root);
39
+ }
40
+ };
41
+ var OtelRunObserver = class {
42
+ constructor(tracer, root) {
43
+ this.tracer = tracer;
44
+ this.root = root;
45
+ const spanContext = root.spanContext();
46
+ this.trace = {
47
+ traceId: spanContext.traceId,
48
+ observationId: spanContext.spanId
49
+ };
50
+ this.rootContext = trace.setSpan(ROOT_CONTEXT, root);
51
+ }
52
+ tracer;
53
+ root;
54
+ trace;
55
+ rootContext;
56
+ startGeneration(args) {
57
+ const generation = this.tracer.startSpan(
58
+ `model.turn.${args.turn}`,
59
+ {
60
+ kind: SpanKind.CLIENT,
61
+ attributes: generationStartAttributes(args)
62
+ },
63
+ this.rootContext
64
+ );
65
+ return new OtelGenerationObserver(generation);
66
+ }
67
+ startTool(args) {
68
+ const tool = this.tracer.startSpan(
69
+ `tool.${args.toolName}`,
70
+ {
71
+ kind: SpanKind.INTERNAL,
72
+ attributes: toolStartAttributes(args)
73
+ },
74
+ this.rootContext
75
+ );
76
+ return new OtelToolObserver(tool);
77
+ }
78
+ end(args) {
79
+ this.root.setAttributes(runEndAttributes(args));
80
+ this.root.setStatus({ code: SpanStatusCode.OK });
81
+ this.root.end();
82
+ }
83
+ error(args) {
84
+ recordSpanError(this.root, args.error);
85
+ this.root.setAttributes(runErrorAttributes(args));
86
+ this.root.end();
87
+ }
88
+ };
89
+ var OtelGenerationObserver = class {
90
+ constructor(generation) {
91
+ this.generation = generation;
92
+ }
93
+ generation;
94
+ end(args) {
95
+ this.generation.setAttributes(generationEndAttributes(args));
96
+ this.generation.setStatus({ code: SpanStatusCode.OK });
97
+ this.generation.end();
98
+ }
99
+ error(args) {
100
+ recordSpanError(this.generation, args.error);
101
+ this.generation.setAttributes({
102
+ "anvia.generation.turn": args.turn
103
+ });
104
+ this.generation.end();
105
+ }
106
+ };
107
+ var OtelToolObserver = class {
108
+ constructor(tool) {
109
+ this.tool = tool;
110
+ }
111
+ tool;
112
+ end(args) {
113
+ this.tool.setAttributes(toolEndAttributes(args));
114
+ this.tool.setStatus({ code: SpanStatusCode.OK });
115
+ this.tool.end();
116
+ }
117
+ error(args) {
118
+ recordSpanError(this.tool, args.error);
119
+ this.tool.setAttributes(toolErrorAttributes(args));
120
+ this.tool.end();
121
+ }
122
+ };
123
+ function rootSpanName(args) {
124
+ return args.agentName === void 0 || args.agentName.length === 0 ? "agent.run" : `agent.${args.agentName}`;
125
+ }
126
+ function runStartAttributes(args, serviceName) {
127
+ return compactAttributes({
128
+ "service.name": serviceName,
129
+ "anvia.agent.name": args.agentName,
130
+ "anvia.agent.description": args.agentDescription,
131
+ "anvia.agent.instructions": args.instructions,
132
+ "anvia.run.max_turns": args.maxTurns,
133
+ "anvia.run.prompt": jsonString(args.prompt),
134
+ "anvia.run.history": jsonString(args.history),
135
+ "anvia.trace.name": args.trace?.name ?? args.agentName,
136
+ "anvia.trace.user_id": args.trace?.userId,
137
+ "anvia.trace.session_id": args.trace?.sessionId,
138
+ "anvia.trace.tags": args.trace?.tags,
139
+ "anvia.trace.version": args.trace?.version,
140
+ ...metadataAttributes("anvia.trace.metadata", args.trace?.metadata)
141
+ });
142
+ }
143
+ function runEndAttributes(args) {
144
+ return compactAttributes({
145
+ "anvia.run.output": args.output,
146
+ "anvia.run.messages": jsonString(args.messages),
147
+ ...usageAttributes(args.usage)
148
+ });
149
+ }
150
+ function runErrorAttributes(args) {
151
+ return compactAttributes({
152
+ "anvia.run.error": errorMessage(args.error),
153
+ "anvia.run.messages": jsonString(args.messages),
154
+ ...usageAttributes(args.usage)
155
+ });
156
+ }
157
+ function generationStartAttributes(args) {
158
+ const params = modelParameters(args.request);
159
+ return compactAttributes({
160
+ "anvia.generation.turn": args.turn,
161
+ "anvia.generation.input": jsonString(args.request.chatHistory),
162
+ "anvia.generation.model": args.request.model ?? "default",
163
+ "anvia.generation.tool_count": args.request.tools.length,
164
+ "anvia.generation.has_output_schema": args.request.outputSchema !== void 0,
165
+ ...params
166
+ });
167
+ }
168
+ function generationEndAttributes(args) {
169
+ return compactAttributes({
170
+ "anvia.generation.turn": args.turn,
171
+ "anvia.generation.message_id": args.response.messageId,
172
+ "anvia.generation.output": jsonString(args.response.choice),
173
+ "anvia.generation.output_text": textFromAssistantContent(args.response.choice),
174
+ "anvia.generation.first_delta_ms": args.firstDeltaMs,
175
+ ...usageAttributes(args.response.usage)
176
+ });
177
+ }
178
+ function toolStartAttributes(args) {
179
+ return compactAttributes({
180
+ "anvia.tool.name": args.toolName,
181
+ "anvia.tool.turn": args.turn,
182
+ "anvia.tool.args": args.args,
183
+ "anvia.tool.call": jsonString(args.toolCall),
184
+ "anvia.tool.internal_call_id": args.internalCallId,
185
+ "anvia.tool.call_id": args.toolCallId
186
+ });
187
+ }
188
+ function toolEndAttributes(args) {
189
+ return compactAttributes({
190
+ "anvia.tool.name": args.toolName,
191
+ "anvia.tool.turn": args.turn,
192
+ "anvia.tool.result": args.result,
193
+ "anvia.tool.skipped": args.skipped,
194
+ "anvia.tool.internal_call_id": args.internalCallId,
195
+ "anvia.tool.call_id": args.toolCallId
196
+ });
197
+ }
198
+ function toolErrorAttributes(args) {
199
+ return compactAttributes({
200
+ "anvia.tool.name": args.toolName,
201
+ "anvia.tool.turn": args.turn,
202
+ "anvia.tool.error": errorMessage(args.error),
203
+ "anvia.tool.internal_call_id": args.internalCallId,
204
+ "anvia.tool.call_id": args.toolCallId
205
+ });
206
+ }
207
+ function usageAttributes(usage) {
208
+ return {
209
+ "anvia.usage.input_tokens": usage.inputTokens,
210
+ "anvia.usage.output_tokens": usage.outputTokens,
211
+ "anvia.usage.total_tokens": usage.totalTokens,
212
+ "anvia.usage.cached_input_tokens": usage.cachedInputTokens,
213
+ "anvia.usage.cache_creation_input_tokens": usage.cacheCreationInputTokens
214
+ };
215
+ }
216
+ function modelParameters(request) {
217
+ return {
218
+ "anvia.generation.temperature": request.temperature,
219
+ "anvia.generation.max_tokens": request.maxTokens,
220
+ "anvia.generation.tool_choice": request.toolChoice === void 0 ? void 0 : typeof request.toolChoice === "string" ? request.toolChoice : request.toolChoice.name
221
+ };
222
+ }
223
+ function metadataAttributes(prefix, metadata) {
224
+ const attributes = {};
225
+ for (const [key, value] of Object.entries(metadata ?? {})) {
226
+ const serialized = serializeMetadataValue(value);
227
+ if (serialized !== void 0) {
228
+ attributes[`${prefix}.${key}`] = serialized;
229
+ }
230
+ }
231
+ return attributes;
232
+ }
233
+ function compactAttributes(values) {
234
+ return Object.fromEntries(
235
+ Object.entries(values).filter((entry) => {
236
+ const [, value] = entry;
237
+ return value !== void 0;
238
+ })
239
+ );
240
+ }
241
+ function parentContextFromTraceId(traceId) {
242
+ if (!isValidTraceId(traceId)) {
243
+ return context.active();
244
+ }
245
+ return trace.setSpanContext(ROOT_CONTEXT, {
246
+ traceId,
247
+ spanId: "0000000000000001",
248
+ traceFlags: TraceFlags.SAMPLED,
249
+ isRemote: true
250
+ });
251
+ }
252
+ function isValidTraceId(traceId) {
253
+ return traceId !== void 0 && /^[0-9a-f]{32}$/i.test(traceId) && traceId !== "00000000000000000000000000000000";
254
+ }
255
+ function recordSpanError(span, error) {
256
+ span.recordException(error instanceof Error ? error : errorMessage(error));
257
+ span.setStatus({
258
+ code: SpanStatusCode.ERROR,
259
+ message: errorMessage(error)
260
+ });
261
+ }
262
+ function jsonString(value) {
263
+ try {
264
+ return JSON.stringify(value);
265
+ } catch {
266
+ return "<failed to serialize>";
267
+ }
268
+ }
269
+ function serializeMetadataValue(value) {
270
+ if (value === void 0) {
271
+ return void 0;
272
+ }
273
+ if (typeof value === "string") {
274
+ return value;
275
+ }
276
+ return jsonString(value);
277
+ }
278
+ function emptyToUndefined(value) {
279
+ return value === void 0 || value.length === 0 ? void 0 : value;
280
+ }
281
+ function errorMessage(error) {
282
+ return error instanceof Error ? error.message : String(error);
283
+ }
284
+ export {
285
+ otel
286
+ };
287
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type AgentGenerationEndArgs,\n type AgentGenerationErrorArgs,\n type AgentGenerationObserver,\n type AgentGenerationStartArgs,\n type AgentObserver,\n type AgentRunEndArgs,\n type AgentRunErrorArgs,\n type AgentRunObserver,\n type AgentRunStartArgs,\n type AgentToolEndArgs,\n type AgentToolErrorArgs,\n type AgentToolObserver,\n type AgentToolStartArgs,\n type AgentTraceInfo,\n textFromAssistantContent,\n} from \"@anvia/core\";\nimport {\n type Attributes,\n type Context,\n context,\n ROOT_CONTEXT,\n type Span,\n SpanKind,\n SpanStatusCode,\n TraceFlags,\n type Tracer,\n trace,\n} from \"@opentelemetry/api\";\n\nexport type OtelTracingOptions = {\n tracer?: Tracer | undefined;\n tracerName?: string | undefined;\n tracerVersion?: string | undefined;\n serviceName?: string | undefined;\n};\n\nexport type OtelTracing = AgentObserver;\n\nexport const otel = {\n create(options: OtelTracingOptions = {}): OtelTracing {\n return new OtelAgentObserver(options);\n },\n};\n\nclass OtelAgentObserver implements OtelTracing {\n private readonly tracer: Tracer;\n private readonly serviceName: string | undefined;\n\n constructor(options: OtelTracingOptions) {\n this.tracer =\n options.tracer ??\n trace.getTracer(\n emptyToUndefined(options.tracerName) ?? \"@anvia/otel\",\n emptyToUndefined(options.tracerVersion),\n );\n this.serviceName = emptyToUndefined(options.serviceName);\n }\n\n startRun(args: AgentRunStartArgs): AgentRunObserver {\n const parentContext = parentContextFromTraceId(args.trace?.traceId);\n const root = this.tracer.startSpan(\n rootSpanName(args),\n {\n kind: SpanKind.INTERNAL,\n attributes: runStartAttributes(args, this.serviceName),\n },\n parentContext,\n );\n\n return new OtelRunObserver(this.tracer, root);\n }\n}\n\nclass OtelRunObserver implements AgentRunObserver {\n readonly trace: AgentTraceInfo;\n private readonly rootContext: Context;\n\n constructor(\n private readonly tracer: Tracer,\n private readonly root: Span,\n ) {\n const spanContext = root.spanContext();\n this.trace = {\n traceId: spanContext.traceId,\n observationId: spanContext.spanId,\n };\n this.rootContext = trace.setSpan(ROOT_CONTEXT, root);\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n const generation = this.tracer.startSpan(\n `model.turn.${args.turn}`,\n {\n kind: SpanKind.CLIENT,\n attributes: generationStartAttributes(args),\n },\n this.rootContext,\n );\n return new OtelGenerationObserver(generation);\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const tool = this.tracer.startSpan(\n `tool.${args.toolName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: toolStartAttributes(args),\n },\n this.rootContext,\n );\n return new OtelToolObserver(tool);\n }\n\n end(args: AgentRunEndArgs): void {\n this.root.setAttributes(runEndAttributes(args));\n this.root.setStatus({ code: SpanStatusCode.OK });\n this.root.end();\n }\n\n error(args: AgentRunErrorArgs): void {\n recordSpanError(this.root, args.error);\n this.root.setAttributes(runErrorAttributes(args));\n this.root.end();\n }\n}\n\nclass OtelGenerationObserver implements AgentGenerationObserver {\n constructor(private readonly generation: Span) {}\n\n end(args: AgentGenerationEndArgs): void {\n this.generation.setAttributes(generationEndAttributes(args));\n this.generation.setStatus({ code: SpanStatusCode.OK });\n this.generation.end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n recordSpanError(this.generation, args.error);\n this.generation.setAttributes({\n \"anvia.generation.turn\": args.turn,\n });\n this.generation.end();\n }\n}\n\nclass OtelToolObserver implements AgentToolObserver {\n constructor(private readonly tool: Span) {}\n\n end(args: AgentToolEndArgs): void {\n this.tool.setAttributes(toolEndAttributes(args));\n this.tool.setStatus({ code: SpanStatusCode.OK });\n this.tool.end();\n }\n\n error(args: AgentToolErrorArgs): void {\n recordSpanError(this.tool, args.error);\n this.tool.setAttributes(toolErrorAttributes(args));\n this.tool.end();\n }\n}\n\nfunction rootSpanName(args: AgentRunStartArgs): string {\n return args.agentName === undefined || args.agentName.length === 0\n ? \"agent.run\"\n : `agent.${args.agentName}`;\n}\n\nfunction runStartAttributes(args: AgentRunStartArgs, serviceName: string | undefined): Attributes {\n return compactAttributes({\n \"service.name\": serviceName,\n \"anvia.agent.name\": args.agentName,\n \"anvia.agent.description\": args.agentDescription,\n \"anvia.agent.instructions\": args.instructions,\n \"anvia.run.max_turns\": args.maxTurns,\n \"anvia.run.prompt\": jsonString(args.prompt),\n \"anvia.run.history\": jsonString(args.history),\n \"anvia.trace.name\": args.trace?.name ?? args.agentName,\n \"anvia.trace.user_id\": args.trace?.userId,\n \"anvia.trace.session_id\": args.trace?.sessionId,\n \"anvia.trace.tags\": args.trace?.tags,\n \"anvia.trace.version\": args.trace?.version,\n ...metadataAttributes(\"anvia.trace.metadata\", args.trace?.metadata),\n });\n}\n\nfunction runEndAttributes(args: AgentRunEndArgs): Attributes {\n return compactAttributes({\n \"anvia.run.output\": args.output,\n \"anvia.run.messages\": jsonString(args.messages),\n ...usageAttributes(args.usage),\n });\n}\n\nfunction runErrorAttributes(args: AgentRunErrorArgs): Attributes {\n return compactAttributes({\n \"anvia.run.error\": errorMessage(args.error),\n \"anvia.run.messages\": jsonString(args.messages),\n ...usageAttributes(args.usage),\n });\n}\n\nfunction generationStartAttributes(args: AgentGenerationStartArgs): Attributes {\n const params = modelParameters(args.request);\n return compactAttributes({\n \"anvia.generation.turn\": args.turn,\n \"anvia.generation.input\": jsonString(args.request.chatHistory),\n \"anvia.generation.model\": args.request.model ?? \"default\",\n \"anvia.generation.tool_count\": args.request.tools.length,\n \"anvia.generation.has_output_schema\": args.request.outputSchema !== undefined,\n ...params,\n });\n}\n\nfunction generationEndAttributes(args: AgentGenerationEndArgs): Attributes {\n return compactAttributes({\n \"anvia.generation.turn\": args.turn,\n \"anvia.generation.message_id\": args.response.messageId,\n \"anvia.generation.output\": jsonString(args.response.choice),\n \"anvia.generation.output_text\": textFromAssistantContent(args.response.choice),\n \"anvia.generation.first_delta_ms\": args.firstDeltaMs,\n ...usageAttributes(args.response.usage),\n });\n}\n\nfunction toolStartAttributes(args: AgentToolStartArgs): Attributes {\n return compactAttributes({\n \"anvia.tool.name\": args.toolName,\n \"anvia.tool.turn\": args.turn,\n \"anvia.tool.args\": args.args,\n \"anvia.tool.call\": jsonString(args.toolCall),\n \"anvia.tool.internal_call_id\": args.internalCallId,\n \"anvia.tool.call_id\": args.toolCallId,\n });\n}\n\nfunction toolEndAttributes(args: AgentToolEndArgs): Attributes {\n return compactAttributes({\n \"anvia.tool.name\": args.toolName,\n \"anvia.tool.turn\": args.turn,\n \"anvia.tool.result\": args.result,\n \"anvia.tool.skipped\": args.skipped,\n \"anvia.tool.internal_call_id\": args.internalCallId,\n \"anvia.tool.call_id\": args.toolCallId,\n });\n}\n\nfunction toolErrorAttributes(args: AgentToolErrorArgs): Attributes {\n return compactAttributes({\n \"anvia.tool.name\": args.toolName,\n \"anvia.tool.turn\": args.turn,\n \"anvia.tool.error\": errorMessage(args.error),\n \"anvia.tool.internal_call_id\": args.internalCallId,\n \"anvia.tool.call_id\": args.toolCallId,\n });\n}\n\nfunction usageAttributes(usage: AgentRunEndArgs[\"usage\"]): Attributes {\n return {\n \"anvia.usage.input_tokens\": usage.inputTokens,\n \"anvia.usage.output_tokens\": usage.outputTokens,\n \"anvia.usage.total_tokens\": usage.totalTokens,\n \"anvia.usage.cached_input_tokens\": usage.cachedInputTokens,\n \"anvia.usage.cache_creation_input_tokens\": usage.cacheCreationInputTokens,\n };\n}\n\nfunction modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number | undefined> {\n return {\n \"anvia.generation.temperature\": request.temperature,\n \"anvia.generation.max_tokens\": request.maxTokens,\n \"anvia.generation.tool_choice\":\n request.toolChoice === undefined\n ? undefined\n : typeof request.toolChoice === \"string\"\n ? request.toolChoice\n : request.toolChoice.name,\n };\n}\n\nfunction metadataAttributes(\n prefix: string,\n metadata: Record<string, unknown> | undefined,\n): Attributes {\n const attributes: Attributes = {};\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized !== undefined) {\n attributes[`${prefix}.${key}`] = serialized;\n }\n }\n return attributes;\n}\n\nfunction compactAttributes(values: Record<string, Attributes[string]>): Attributes {\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, NonNullable<Attributes[string]>] => {\n const [, value] = entry;\n return value !== undefined;\n }),\n );\n}\n\nfunction parentContextFromTraceId(traceId: string | undefined): Context {\n if (!isValidTraceId(traceId)) {\n return context.active();\n }\n return trace.setSpanContext(ROOT_CONTEXT, {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: TraceFlags.SAMPLED,\n isRemote: true,\n });\n}\n\nfunction isValidTraceId(traceId: string | undefined): traceId is string {\n return (\n traceId !== undefined &&\n /^[0-9a-f]{32}$/i.test(traceId) &&\n traceId !== \"00000000000000000000000000000000\"\n );\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n span.recordException(error instanceof Error ? error : errorMessage(error));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorMessage(error),\n });\n}\n\nfunction jsonString(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n return jsonString(value);\n}\n\nfunction emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@anvia/otel",
3
+ "version": "0.1.0",
4
+ "description": "OpenTelemetry tracing adapter for Anvia.",
5
+ "author": "anvia",
6
+ "maintainer": "Indra Zulfi",
7
+ "license": "MIT",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "type": "module",
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "dependencies": {
21
+ "@opentelemetry/api": "^1.9.1",
22
+ "@anvia/core": "0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^24.9.1",
26
+ "tsup": "^8.5.0",
27
+ "typescript": "^5.9.3",
28
+ "vitest": "^4.0.8"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
32
+ "test": "vitest run",
33
+ "typecheck": "tsc --noEmit"
34
+ }
35
+ }