neatlogs 1.0.6 → 1.0.8

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.
Files changed (57) hide show
  1. package/dist/azure-openai.cjs +344 -0
  2. package/dist/azure-openai.cjs.map +1 -0
  3. package/dist/azure-openai.d.ts +30 -0
  4. package/dist/azure-openai.mjs +318 -0
  5. package/dist/azure-openai.mjs.map +1 -0
  6. package/dist/bedrock.cjs +540 -0
  7. package/dist/bedrock.cjs.map +1 -0
  8. package/dist/bedrock.d.ts +29 -0
  9. package/dist/bedrock.mjs +514 -0
  10. package/dist/bedrock.mjs.map +1 -0
  11. package/dist/browser.cjs +121 -0
  12. package/dist/browser.cjs.map +1 -0
  13. package/dist/browser.d.ts +143 -0
  14. package/dist/browser.mjs +96 -0
  15. package/dist/browser.mjs.map +1 -0
  16. package/dist/claude-agent-sdk.cjs +406 -0
  17. package/dist/claude-agent-sdk.cjs.map +1 -0
  18. package/dist/claude-agent-sdk.d.ts +49 -0
  19. package/dist/claude-agent-sdk.mjs +381 -0
  20. package/dist/claude-agent-sdk.mjs.map +1 -0
  21. package/dist/index.cjs +3219 -1129
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +7 -1
  24. package/dist/index.mjs +3210 -1131
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/langchain.cjs +9 -9
  27. package/dist/langchain.cjs.map +1 -1
  28. package/dist/langchain.mjs +9 -9
  29. package/dist/langchain.mjs.map +1 -1
  30. package/dist/mastra-wrap.cjs +25 -25
  31. package/dist/mastra-wrap.cjs.map +1 -1
  32. package/dist/mastra-wrap.mjs +25 -25
  33. package/dist/mastra-wrap.mjs.map +1 -1
  34. package/dist/openai-agents.cjs +6 -6
  35. package/dist/openai-agents.cjs.map +1 -1
  36. package/dist/openai-agents.mjs +6 -6
  37. package/dist/openai-agents.mjs.map +1 -1
  38. package/dist/opencode-plugin.cjs +5879 -0
  39. package/dist/opencode-plugin.cjs.map +1 -0
  40. package/dist/opencode-plugin.d.ts +38 -0
  41. package/dist/opencode-plugin.mjs +5854 -0
  42. package/dist/opencode-plugin.mjs.map +1 -0
  43. package/dist/openrouter-agent.cjs +273 -0
  44. package/dist/openrouter-agent.cjs.map +1 -0
  45. package/dist/openrouter-agent.d.ts +34 -0
  46. package/dist/openrouter-agent.mjs +247 -0
  47. package/dist/openrouter-agent.mjs.map +1 -0
  48. package/dist/pi-agent.cjs +10 -10
  49. package/dist/pi-agent.cjs.map +1 -1
  50. package/dist/pi-agent.mjs +10 -10
  51. package/dist/pi-agent.mjs.map +1 -1
  52. package/dist/vertex-ai.cjs +424 -0
  53. package/dist/vertex-ai.cjs.map +1 -0
  54. package/dist/vertex-ai.d.ts +39 -0
  55. package/dist/vertex-ai.mjs +397 -0
  56. package/dist/vertex-ai.mjs.map +1 -0
  57. package/package.json +76 -1
@@ -0,0 +1,514 @@
1
+ // src/bedrock.ts
2
+ import { trace, context as otelContext, SpanStatusCode } from "@opentelemetry/api";
3
+ var TRACER_NAME = "neatlogs.bedrock";
4
+ var PROVIDER = "bedrock";
5
+ function traceTool(name, fn) {
6
+ return async function tracedTool(args) {
7
+ const tracer = trace.getTracer(TRACER_NAME);
8
+ return tracer.startActiveSpan(
9
+ `tool.${name}`,
10
+ {
11
+ attributes: {
12
+ "neatlogs.span.kind": "TOOL",
13
+ "neatlogs.tool.name": name,
14
+ "input.value": safeStringify(args)
15
+ }
16
+ },
17
+ otelContext.active(),
18
+ async (span) => {
19
+ try {
20
+ const result = await fn(args);
21
+ span.setAttribute("output.value", safeStringify(result));
22
+ span.setStatus({ code: SpanStatusCode.OK });
23
+ return result;
24
+ } catch (err) {
25
+ recordError(span, err);
26
+ throw err;
27
+ } finally {
28
+ span.end();
29
+ }
30
+ }
31
+ );
32
+ };
33
+ }
34
+ function wrapBedrock(client) {
35
+ const c = client;
36
+ if (c._neatlogsBedrockPatched) return client;
37
+ if (typeof c.send !== "function") return client;
38
+ const originalSend = c.send.bind(c);
39
+ c.send = function(command, ...rest) {
40
+ const name = command?.constructor?.name ?? "";
41
+ const input = command?.input ?? {};
42
+ if (name === "ConverseCommand") {
43
+ return tracedConverse(originalSend, command, input, rest, false);
44
+ }
45
+ if (name === "ConverseStreamCommand") {
46
+ return tracedConverse(originalSend, command, input, rest, true);
47
+ }
48
+ if (name === "InvokeModelCommand") {
49
+ return tracedInvokeModel(originalSend, command, input, rest, false);
50
+ }
51
+ if (name === "InvokeModelWithResponseStreamCommand") {
52
+ return tracedInvokeModel(originalSend, command, input, rest, true);
53
+ }
54
+ return originalSend(command, ...rest);
55
+ };
56
+ c._neatlogsBedrockPatched = true;
57
+ return client;
58
+ }
59
+ function vendorFromModel(modelId) {
60
+ let tail = String(modelId ?? "").split("/").pop() ?? "";
61
+ for (const prefix of ["us.", "eu.", "apac.", "us-gov."]) {
62
+ if (tail.startsWith(prefix)) tail = tail.slice(prefix.length);
63
+ }
64
+ const vendor = tail.includes(".") ? tail.split(".")[0] : "";
65
+ return vendor || "bedrock";
66
+ }
67
+ function startSpan(name, modelId, isStream) {
68
+ return trace.getTracer(TRACER_NAME).startSpan(name, {
69
+ attributes: {
70
+ "neatlogs.span.kind": "LLM",
71
+ "neatlogs.llm.provider": PROVIDER,
72
+ "neatlogs.llm.system": vendorFromModel(modelId),
73
+ "neatlogs.llm.model_name": String(modelId ?? ""),
74
+ "neatlogs.llm.is_streaming": isStream
75
+ }
76
+ }, otelContext.active());
77
+ }
78
+ function tracedConverse(originalSend, command, input, rest, isStream) {
79
+ const span = startSpan(
80
+ isStream ? "bedrock.converse_stream" : "bedrock.converse",
81
+ input?.modelId,
82
+ isStream
83
+ );
84
+ setConverseInput(span, input);
85
+ const ctx = trace.setSpan(otelContext.active(), span);
86
+ const promise = otelContext.with(ctx, () => originalSend(command, ...rest));
87
+ return promise.then(
88
+ (response) => {
89
+ if (isStream) {
90
+ return wrapConverseStream(response, span);
91
+ }
92
+ finalizeConverse(span, response);
93
+ return response;
94
+ },
95
+ (err) => {
96
+ recordError(span, err);
97
+ throw err;
98
+ }
99
+ );
100
+ }
101
+ function setConverseInput(span, input) {
102
+ let idx = 0;
103
+ if (Array.isArray(input?.system)) {
104
+ const text = input.system.map((b) => b?.text ?? "").join(" ").trim();
105
+ if (text) {
106
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, "system");
107
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, text);
108
+ idx++;
109
+ }
110
+ }
111
+ for (const msg of input?.messages ?? []) {
112
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? "user");
113
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, converseBlocksToText(msg?.content));
114
+ idx++;
115
+ }
116
+ const cfg = input?.inferenceConfig ?? {};
117
+ if (cfg.temperature != null) span.setAttribute("neatlogs.llm.temperature", cfg.temperature);
118
+ if (cfg.topP != null) span.setAttribute("neatlogs.llm.top_p", cfg.topP);
119
+ if (cfg.maxTokens != null) span.setAttribute("neatlogs.llm.max_tokens", cfg.maxTokens);
120
+ const tools = input?.toolConfig?.tools ?? [];
121
+ for (let i = 0; i < tools.length; i++) {
122
+ const spec = tools[i]?.toolSpec ?? {};
123
+ if (spec.name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, spec.name);
124
+ if (spec.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, spec.description);
125
+ if (spec.inputSchema) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(spec.inputSchema));
126
+ }
127
+ }
128
+ function converseBlocksToText(content) {
129
+ if (typeof content === "string") return content;
130
+ if (!Array.isArray(content)) return safeStringify(content);
131
+ const parts = [];
132
+ for (const block of content) {
133
+ if (block && typeof block === "object") {
134
+ if ("text" in block) parts.push(String(block.text));
135
+ else if ("toolResult" in block) parts.push(safeStringify(block.toolResult));
136
+ else if ("toolUse" in block) parts.push(safeStringify(block.toolUse));
137
+ else parts.push(safeStringify(block));
138
+ } else {
139
+ parts.push(String(block));
140
+ }
141
+ }
142
+ return parts.join("\n");
143
+ }
144
+ function finalizeConverse(span, response) {
145
+ const content = response?.output?.message?.content ?? [];
146
+ const textParts = [];
147
+ let toolIdx = 0;
148
+ for (const block of content) {
149
+ if (!block || typeof block !== "object") continue;
150
+ if ("text" in block) {
151
+ textParts.push(String(block.text));
152
+ } else if ("toolUse" in block) {
153
+ const tu = block.toolUse;
154
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(tu?.toolUseId ?? ""));
155
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(tu?.name ?? ""));
156
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(tu?.input ?? {}));
157
+ toolIdx++;
158
+ }
159
+ }
160
+ if (textParts.length) {
161
+ span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
162
+ span.setAttribute("neatlogs.llm.output_messages.0.content", textParts.join(""));
163
+ }
164
+ if (response?.stopReason) span.setAttribute("neatlogs.llm.finish_reason", String(response.stopReason));
165
+ setConverseUsage(span, response?.usage);
166
+ span.setStatus({ code: SpanStatusCode.OK });
167
+ span.end();
168
+ }
169
+ function setConverseUsage(span, usage) {
170
+ if (!usage) return;
171
+ if (usage.inputTokens != null) span.setAttribute("neatlogs.llm.token_count.prompt", usage.inputTokens);
172
+ if (usage.outputTokens != null) span.setAttribute("neatlogs.llm.token_count.completion", usage.outputTokens);
173
+ if (usage.totalTokens != null) span.setAttribute("neatlogs.llm.token_count.total", usage.totalTokens);
174
+ if (usage.cacheReadInputTokens != null) span.setAttribute("neatlogs.llm.token_count.cache_read", usage.cacheReadInputTokens);
175
+ if (usage.cacheWriteInputTokens != null) span.setAttribute("neatlogs.llm.token_count.cache_write", usage.cacheWriteInputTokens);
176
+ }
177
+ function wrapConverseStream(response, span) {
178
+ const stream = response?.stream;
179
+ if (!stream || typeof stream[Symbol.asyncIterator] !== "function") {
180
+ span.setStatus({ code: SpanStatusCode.OK });
181
+ span.end();
182
+ return response;
183
+ }
184
+ const originalIterator = stream[Symbol.asyncIterator].bind(stream);
185
+ const textParts = [];
186
+ const toolCalls = {};
187
+ let finishReason = "";
188
+ let usage = null;
189
+ const wrappedStream = {
190
+ [Symbol.asyncIterator]() {
191
+ const iterator = originalIterator();
192
+ return {
193
+ async next() {
194
+ try {
195
+ const result = await iterator.next();
196
+ if (result.done) {
197
+ finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);
198
+ return result;
199
+ }
200
+ const ev = result.value;
201
+ const delta = ev?.contentBlockDelta?.delta;
202
+ if (delta?.text) textParts.push(delta.text);
203
+ if (delta?.toolUse?.input) {
204
+ const idx = ev.contentBlockDelta.contentBlockIndex ?? 0;
205
+ toolCalls[idx] = toolCalls[idx] ?? { id: "", name: "", arguments: "" };
206
+ toolCalls[idx].arguments += delta.toolUse.input;
207
+ }
208
+ const startBlk = ev?.contentBlockStart?.start?.toolUse;
209
+ if (startBlk) {
210
+ const idx = ev.contentBlockStart.contentBlockIndex ?? 0;
211
+ toolCalls[idx] = toolCalls[idx] ?? { id: "", name: "", arguments: "" };
212
+ toolCalls[idx].name = startBlk.name ?? "";
213
+ toolCalls[idx].id = startBlk.toolUseId ?? "";
214
+ }
215
+ if (ev?.messageStop?.stopReason) finishReason = ev.messageStop.stopReason;
216
+ if (ev?.metadata?.usage) usage = ev.metadata.usage;
217
+ return result;
218
+ } catch (err) {
219
+ recordError(span, err);
220
+ throw err;
221
+ }
222
+ },
223
+ async return(value) {
224
+ finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);
225
+ return iterator.return?.(value) ?? { done: true, value: void 0 };
226
+ }
227
+ };
228
+ }
229
+ };
230
+ response.stream = wrappedStream;
231
+ return response;
232
+ }
233
+ function finalizeConverseStream(span, textParts, toolCalls, finishReason, usage) {
234
+ const full = textParts.join("");
235
+ if (full) {
236
+ span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
237
+ span.setAttribute("neatlogs.llm.output_messages.0.content", full);
238
+ }
239
+ let j = 0;
240
+ for (const tc of Object.values(toolCalls)) {
241
+ if (tc.id) span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc.id);
242
+ span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc.name);
243
+ span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, tc.arguments);
244
+ j++;
245
+ }
246
+ if (finishReason) span.setAttribute("neatlogs.llm.finish_reason", String(finishReason));
247
+ setConverseUsage(span, usage);
248
+ span.setStatus({ code: SpanStatusCode.OK });
249
+ span.end();
250
+ }
251
+ function isEmbeddingModel(modelId) {
252
+ return String(modelId ?? "").toLowerCase().includes("embed");
253
+ }
254
+ function tracedInvokeModel(originalSend, command, input, rest, isStream) {
255
+ const vendor = vendorFromModel(input?.modelId);
256
+ const isEmbedding = !isStream && isEmbeddingModel(input?.modelId);
257
+ const bodyIn = decodeBody(input?.body);
258
+ let span;
259
+ if (isEmbedding) {
260
+ span = trace.getTracer(TRACER_NAME).startSpan("bedrock.invoke_model", {
261
+ attributes: {
262
+ "neatlogs.span.kind": "EMBEDDING",
263
+ "neatlogs.llm.provider": PROVIDER,
264
+ "neatlogs.embedding.model_name": String(input?.modelId ?? "")
265
+ }
266
+ }, otelContext.active());
267
+ const text = bodyIn?.inputText ?? bodyIn?.texts ?? bodyIn?.input_text;
268
+ if (text) {
269
+ span.setAttribute("neatlogs.embedding.text", typeof text === "string" ? text : safeStringify(text));
270
+ }
271
+ } else {
272
+ span = startSpan(
273
+ isStream ? "bedrock.invoke_model_with_response_stream" : "bedrock.invoke_model",
274
+ input?.modelId,
275
+ isStream
276
+ );
277
+ setInvokeInput(span, vendor, bodyIn);
278
+ }
279
+ const ctx = trace.setSpan(otelContext.active(), span);
280
+ const promise = otelContext.with(ctx, () => originalSend(command, ...rest));
281
+ return promise.then(
282
+ (response) => {
283
+ if (isStream) {
284
+ return wrapInvokeStream(response, span, vendor);
285
+ }
286
+ try {
287
+ if (isEmbedding) {
288
+ finalizeInvokeEmbedding(span, decodeBody(response?.body));
289
+ } else {
290
+ finalizeInvoke(span, vendor, decodeBody(response?.body));
291
+ }
292
+ } catch {
293
+ span.setStatus({ code: SpanStatusCode.OK });
294
+ span.end();
295
+ }
296
+ return response;
297
+ },
298
+ (err) => {
299
+ recordError(span, err);
300
+ throw err;
301
+ }
302
+ );
303
+ }
304
+ function finalizeInvokeEmbedding(span, body) {
305
+ const emb = body?.embedding;
306
+ const embs = body?.embeddings;
307
+ if (Array.isArray(emb)) {
308
+ span.setAttribute("neatlogs.embedding.count", 1);
309
+ span.setAttribute("neatlogs.embedding.dimensions", emb.length);
310
+ } else if (Array.isArray(embs) && embs.length) {
311
+ span.setAttribute("neatlogs.embedding.count", embs.length);
312
+ if (Array.isArray(embs[0])) span.setAttribute("neatlogs.embedding.dimensions", embs[0].length);
313
+ }
314
+ if (body?.inputTextTokenCount != null) {
315
+ span.setAttribute("neatlogs.llm.token_count.prompt", body.inputTextTokenCount);
316
+ span.setAttribute("neatlogs.embedding.token_count", body.inputTextTokenCount);
317
+ }
318
+ span.setStatus({ code: SpanStatusCode.OK });
319
+ span.end();
320
+ }
321
+ function decodeBody(body) {
322
+ try {
323
+ if (body == null) return {};
324
+ if (typeof body === "string") return JSON.parse(body);
325
+ if (body instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(body));
326
+ if (typeof body === "object" && typeof body.byteLength === "number") {
327
+ return JSON.parse(new TextDecoder().decode(body));
328
+ }
329
+ if (typeof body === "object") return body;
330
+ } catch {
331
+ }
332
+ return {};
333
+ }
334
+ function setInvokeInput(span, vendor, body) {
335
+ let idx = 0;
336
+ if (body?.system) {
337
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, "system");
338
+ span.setAttribute(
339
+ `neatlogs.llm.input_messages.${idx}.content`,
340
+ typeof body.system === "string" ? body.system : safeStringify(body.system)
341
+ );
342
+ idx++;
343
+ }
344
+ if (Array.isArray(body?.messages)) {
345
+ for (const msg of body.messages) {
346
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? "user");
347
+ span.setAttribute(
348
+ `neatlogs.llm.input_messages.${idx}.content`,
349
+ typeof msg?.content === "string" ? msg.content : safeStringify(msg?.content)
350
+ );
351
+ idx++;
352
+ }
353
+ } else if (body?.prompt) {
354
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, "user");
355
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.prompt));
356
+ } else if (body?.inputText) {
357
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, "user");
358
+ span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.inputText));
359
+ }
360
+ if (body?.temperature != null) span.setAttribute("neatlogs.llm.temperature", body.temperature);
361
+ if (body?.top_p != null) span.setAttribute("neatlogs.llm.top_p", body.top_p);
362
+ const maxTokens = body?.max_tokens ?? body?.maxTokens ?? body?.max_tokens_to_sample;
363
+ if (maxTokens != null) span.setAttribute("neatlogs.llm.max_tokens", maxTokens);
364
+ const cfg = body?.textGenerationConfig;
365
+ if (cfg) {
366
+ if (cfg.temperature != null) span.setAttribute("neatlogs.llm.temperature", cfg.temperature);
367
+ if (cfg.topP != null) span.setAttribute("neatlogs.llm.top_p", cfg.topP);
368
+ if (cfg.maxTokenCount != null) span.setAttribute("neatlogs.llm.max_tokens", cfg.maxTokenCount);
369
+ }
370
+ }
371
+ function finalizeInvoke(span, vendor, body) {
372
+ let text;
373
+ let promptTokens;
374
+ let completionTokens;
375
+ let finishReason;
376
+ if (vendor === "anthropic") {
377
+ if (Array.isArray(body?.content)) {
378
+ text = body.content.filter((b) => b?.type === "text").map((b) => b.text).join("");
379
+ let toolIdx = 0;
380
+ for (const b of body.content) {
381
+ if (b?.type === "tool_use") {
382
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(b.id ?? ""));
383
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(b.name ?? ""));
384
+ span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(b.input ?? {}));
385
+ toolIdx++;
386
+ }
387
+ }
388
+ } else if (body?.completion != null) {
389
+ text = body.completion;
390
+ }
391
+ promptTokens = body?.usage?.input_tokens;
392
+ completionTokens = body?.usage?.output_tokens;
393
+ finishReason = body?.stop_reason;
394
+ } else if (vendor === "amazon") {
395
+ const r = Array.isArray(body?.results) ? body.results[0] : void 0;
396
+ if (r) {
397
+ text = r.outputText;
398
+ completionTokens = r.tokenCount;
399
+ finishReason = r.completionReason;
400
+ }
401
+ promptTokens = body?.inputTextTokenCount;
402
+ } else if (vendor === "meta") {
403
+ text = body?.generation;
404
+ promptTokens = body?.prompt_token_count;
405
+ completionTokens = body?.generation_token_count;
406
+ finishReason = body?.stop_reason;
407
+ } else if (vendor === "cohere") {
408
+ const g = Array.isArray(body?.generations) ? body.generations[0] : void 0;
409
+ if (g) {
410
+ text = g.text;
411
+ finishReason = g.finish_reason;
412
+ }
413
+ } else {
414
+ text = body?.generation ?? body?.completion ?? body?.outputText;
415
+ }
416
+ if (text) {
417
+ span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
418
+ span.setAttribute("neatlogs.llm.output_messages.0.content", String(text));
419
+ }
420
+ if (promptTokens != null) span.setAttribute("neatlogs.llm.token_count.prompt", promptTokens);
421
+ if (completionTokens != null) span.setAttribute("neatlogs.llm.token_count.completion", completionTokens);
422
+ if (promptTokens != null && completionTokens != null) {
423
+ span.setAttribute("neatlogs.llm.token_count.total", promptTokens + completionTokens);
424
+ }
425
+ if (finishReason) span.setAttribute("neatlogs.llm.finish_reason", String(finishReason));
426
+ span.setStatus({ code: SpanStatusCode.OK });
427
+ span.end();
428
+ }
429
+ function wrapInvokeStream(response, span, vendor) {
430
+ const body = response?.body;
431
+ if (!body || typeof body[Symbol.asyncIterator] !== "function") {
432
+ span.setStatus({ code: SpanStatusCode.OK });
433
+ span.end();
434
+ return response;
435
+ }
436
+ const originalIterator = body[Symbol.asyncIterator].bind(body);
437
+ const textParts = [];
438
+ let promptTokens;
439
+ let completionTokens;
440
+ let finishReason;
441
+ const finalize = () => {
442
+ const full = textParts.join("");
443
+ if (full) {
444
+ span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
445
+ span.setAttribute("neatlogs.llm.output_messages.0.content", full);
446
+ }
447
+ if (promptTokens != null) span.setAttribute("neatlogs.llm.token_count.prompt", promptTokens);
448
+ if (completionTokens != null) span.setAttribute("neatlogs.llm.token_count.completion", completionTokens);
449
+ if (finishReason) span.setAttribute("neatlogs.llm.finish_reason", String(finishReason));
450
+ span.setStatus({ code: SpanStatusCode.OK });
451
+ span.end();
452
+ };
453
+ const wrappedBody = {
454
+ [Symbol.asyncIterator]() {
455
+ const iterator = originalIterator();
456
+ return {
457
+ async next() {
458
+ try {
459
+ const result = await iterator.next();
460
+ if (result.done) {
461
+ finalize();
462
+ return result;
463
+ }
464
+ const data = decodeBody(result.value?.chunk?.bytes);
465
+ if (data?.type === "content_block_delta") {
466
+ textParts.push(data?.delta?.text ?? "");
467
+ } else if (data?.type === "message_delta") {
468
+ if (data?.delta?.stop_reason) finishReason = data.delta.stop_reason;
469
+ if (data?.usage?.output_tokens != null) completionTokens = data.usage.output_tokens;
470
+ }
471
+ if (data?.outputText) textParts.push(data.outputText);
472
+ if (data?.generation) textParts.push(data.generation);
473
+ const metrics = data?.["amazon-bedrock-invocationMetrics"];
474
+ if (metrics) {
475
+ promptTokens = metrics.inputTokenCount ?? promptTokens;
476
+ completionTokens = metrics.outputTokenCount ?? completionTokens;
477
+ }
478
+ return result;
479
+ } catch (err) {
480
+ recordError(span, err);
481
+ throw err;
482
+ }
483
+ },
484
+ async return(value) {
485
+ finalize();
486
+ return iterator.return?.(value) ?? { done: true, value: void 0 };
487
+ }
488
+ };
489
+ }
490
+ };
491
+ response.body = wrappedBody;
492
+ return response;
493
+ }
494
+ function safeStringify(value) {
495
+ try {
496
+ return typeof value === "string" ? value : JSON.stringify(value);
497
+ } catch {
498
+ return "";
499
+ }
500
+ }
501
+ function recordError(span, err) {
502
+ if (err instanceof Error) {
503
+ span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
504
+ span.recordException(err);
505
+ } else {
506
+ span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
507
+ }
508
+ span.end();
509
+ }
510
+ export {
511
+ traceTool,
512
+ wrapBedrock
513
+ };
514
+ //# sourceMappingURL=bedrock.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bedrock.ts"],"sourcesContent":["/**\n * Neatlogs AWS Bedrock wrapper.\n *\n * The AWS SDK v3 `BedrockRuntimeClient` dispatches every API through\n * `client.send(new XCommand({...}))`. This wrapper intercepts `send`, inspects\n * the command, and traces the Converse and InvokeModel APIs. Token extraction\n * handles Claude, Titan, and Llama response formats.\n *\n * Usage:\n * import { wrapBedrock } from 'neatlogs/bedrock';\n * import { BedrockRuntimeClient, ConverseCommand } from '@aws-sdk/client-bedrock-runtime';\n * const client = wrapBedrock(new BedrockRuntimeClient({ region: 'us-east-1' }));\n * await client.send(new ConverseCommand({ modelId, messages }));\n *\n * `neatlogs.llm.provider` is always `bedrock`; `neatlogs.llm.system` is the\n * underlying model vendor (anthropic / amazon / meta / ...), inferred from modelId.\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.bedrock';\nconst PROVIDER = 'bedrock';\n\n/**\n * Wrap a tool/function implementation to emit TOOL spans when executed.\n *\n * Usage:\n * const getWeather = traceTool('get_weather', async (args: { city: string }) => {\n * return `Weather in ${args.city}: sunny`;\n * });\n */\nexport function traceTool<TArgs = any, TResult = any>(\n name: string,\n fn: (args: TArgs) => TResult | Promise<TResult>,\n): (args: TArgs) => Promise<TResult> {\n return async function tracedTool(args: TArgs): Promise<TResult> {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n otelContext.active(),\n async (span) => {\n try {\n const result = await fn(args);\n span.setAttribute('output.value', safeStringify(result));\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nexport function wrapBedrock<T extends object>(client: T): T {\n const c = client as any;\n if (c._neatlogsBedrockPatched) return client;\n if (typeof c.send !== 'function') return client;\n\n const originalSend = c.send.bind(c);\n\n c.send = function (command: any, ...rest: any[]): any {\n const name = command?.constructor?.name ?? '';\n const input = command?.input ?? {};\n\n if (name === 'ConverseCommand') {\n return tracedConverse(originalSend, command, input, rest, false);\n }\n if (name === 'ConverseStreamCommand') {\n return tracedConverse(originalSend, command, input, rest, true);\n }\n if (name === 'InvokeModelCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, false);\n }\n if (name === 'InvokeModelWithResponseStreamCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, true);\n }\n\n return originalSend(command, ...rest);\n };\n\n c._neatlogsBedrockPatched = true;\n return client;\n}\n\n// ---------------------------------------------------------------------------\n// Vendor / span helpers\n// ---------------------------------------------------------------------------\n\nfunction vendorFromModel(modelId: any): string {\n let tail = String(modelId ?? '').split('/').pop() ?? '';\n for (const prefix of ['us.', 'eu.', 'apac.', 'us-gov.']) {\n if (tail.startsWith(prefix)) tail = tail.slice(prefix.length);\n }\n const vendor = tail.includes('.') ? tail.split('.')[0] : '';\n return vendor || 'bedrock';\n}\n\nfunction startSpan(name: string, modelId: any, isStream: boolean): Span {\n return trace.getTracer(TRACER_NAME).startSpan(name, {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': vendorFromModel(modelId),\n 'neatlogs.llm.model_name': String(modelId ?? ''),\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, otelContext.active());\n}\n\n// ---------------------------------------------------------------------------\n// Converse API\n// ---------------------------------------------------------------------------\n\nfunction tracedConverse(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const span = startSpan(\n isStream ? 'bedrock.converse_stream' : 'bedrock.converse',\n input?.modelId,\n isStream,\n );\n setConverseInput(span, input);\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const promise = otelContext.with(ctx, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapConverseStream(response, span);\n }\n finalizeConverse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction setConverseInput(span: Span, input: any): void {\n let idx = 0;\n\n if (Array.isArray(input?.system)) {\n const text = input.system.map((b: any) => b?.text ?? '').join(' ').trim();\n if (text) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, text);\n idx++;\n }\n }\n\n for (const msg of input?.messages ?? []) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, converseBlocksToText(msg?.content));\n idx++;\n }\n\n const cfg = input?.inferenceConfig ?? {};\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokens);\n\n const tools = input?.toolConfig?.tools ?? [];\n for (let i = 0; i < tools.length; i++) {\n const spec = tools[i]?.toolSpec ?? {};\n if (spec.name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, spec.name);\n if (spec.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, spec.description);\n if (spec.inputSchema) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(spec.inputSchema));\n }\n}\n\nfunction converseBlocksToText(content: any): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return safeStringify(content);\n const parts: string[] = [];\n for (const block of content) {\n if (block && typeof block === 'object') {\n if ('text' in block) parts.push(String(block.text));\n else if ('toolResult' in block) parts.push(safeStringify(block.toolResult));\n else if ('toolUse' in block) parts.push(safeStringify(block.toolUse));\n else parts.push(safeStringify(block));\n } else {\n parts.push(String(block));\n }\n }\n return parts.join('\\n');\n}\n\nfunction finalizeConverse(span: Span, response: any): void {\n const content = response?.output?.message?.content ?? [];\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n if ('text' in block) {\n textParts.push(String(block.text));\n } else if ('toolUse' in block) {\n const tu = block.toolUse;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(tu?.toolUseId ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(tu?.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(tu?.input ?? {}));\n toolIdx++;\n }\n }\n\n if (textParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', textParts.join(''));\n }\n if (response?.stopReason) span.setAttribute('neatlogs.llm.finish_reason', String(response.stopReason));\n setConverseUsage(span, response?.usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setConverseUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.inputTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.inputTokens);\n if (usage.outputTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.outputTokens);\n if (usage.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens);\n if (usage.cacheReadInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cacheReadInputTokens);\n if (usage.cacheWriteInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cacheWriteInputTokens);\n}\n\nfunction wrapConverseStream(response: any, span: Span): any {\n const stream = response?.stream;\n if (!stream || typeof stream[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = stream[Symbol.asyncIterator].bind(stream);\n const textParts: string[] = [];\n const toolCalls: Record<number, { id: string; name: string; arguments: string }> = {};\n let finishReason = '';\n let usage: any = null;\n\n const wrappedStream = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return result;\n }\n const ev = result.value;\n const delta = ev?.contentBlockDelta?.delta;\n if (delta?.text) textParts.push(delta.text);\n if (delta?.toolUse?.input) {\n const idx = ev.contentBlockDelta.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].arguments += delta.toolUse.input;\n }\n const startBlk = ev?.contentBlockStart?.start?.toolUse;\n if (startBlk) {\n const idx = ev.contentBlockStart.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].name = startBlk.name ?? '';\n toolCalls[idx].id = startBlk.toolUseId ?? '';\n }\n if (ev?.messageStop?.stopReason) finishReason = ev.messageStop.stopReason;\n if (ev?.metadata?.usage) usage = ev.metadata.usage;\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.stream = wrappedStream;\n return response;\n}\n\nfunction finalizeConverseStream(\n span: Span,\n textParts: string[],\n toolCalls: Record<number, { id: string; name: string; arguments: string }>,\n finishReason: string,\n usage: any,\n): void {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n let j = 0;\n for (const tc of Object.values(toolCalls)) {\n if (tc.id) span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc.id);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc.name);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, tc.arguments);\n j++;\n }\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setConverseUsage(span, usage);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// InvokeModel API (vendor-specific body formats)\n// ---------------------------------------------------------------------------\n\nfunction isEmbeddingModel(modelId: any): boolean {\n return String(modelId ?? '').toLowerCase().includes('embed');\n}\n\nfunction tracedInvokeModel(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const vendor = vendorFromModel(input?.modelId);\n const isEmbedding = !isStream && isEmbeddingModel(input?.modelId);\n const bodyIn = decodeBody(input?.body);\n\n let span: Span;\n if (isEmbedding) {\n span = trace.getTracer(TRACER_NAME).startSpan('bedrock.invoke_model', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': String(input?.modelId ?? ''),\n },\n }, otelContext.active());\n const text = bodyIn?.inputText ?? bodyIn?.texts ?? bodyIn?.input_text;\n if (text) {\n span.setAttribute('neatlogs.embedding.text', (typeof text === 'string' ? text : safeStringify(text)));\n }\n } else {\n span = startSpan(\n isStream ? 'bedrock.invoke_model_with_response_stream' : 'bedrock.invoke_model',\n input?.modelId,\n isStream,\n );\n setInvokeInput(span, vendor, bodyIn);\n }\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const promise = otelContext.with(ctx, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapInvokeStream(response, span, vendor);\n }\n try {\n if (isEmbedding) {\n finalizeInvokeEmbedding(span, decodeBody(response?.body));\n } else {\n finalizeInvoke(span, vendor, decodeBody(response?.body));\n }\n } catch {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction finalizeInvokeEmbedding(span: Span, body: any): void {\n const emb = body?.embedding;\n const embs = body?.embeddings;\n if (Array.isArray(emb)) {\n span.setAttribute('neatlogs.embedding.count', 1);\n span.setAttribute('neatlogs.embedding.dimensions', emb.length);\n } else if (Array.isArray(embs) && embs.length) {\n span.setAttribute('neatlogs.embedding.count', embs.length);\n if (Array.isArray(embs[0])) span.setAttribute('neatlogs.embedding.dimensions', embs[0].length);\n }\n if (body?.inputTextTokenCount != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', body.inputTextTokenCount);\n span.setAttribute('neatlogs.embedding.token_count', body.inputTextTokenCount);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction decodeBody(body: any): any {\n try {\n if (body == null) return {};\n if (typeof body === 'string') return JSON.parse(body);\n // Uint8Array (AWS SDK v3 returns the response body as bytes)\n if (body instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(body));\n if (typeof body === 'object' && typeof body.byteLength === 'number') {\n return JSON.parse(new TextDecoder().decode(body));\n }\n if (typeof body === 'object') return body;\n } catch {\n /* fall through */\n }\n return {};\n}\n\nfunction setInvokeInput(span: Span, vendor: string, body: any): void {\n let idx = 0;\n if (body?.system) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof body.system === 'string' ? body.system : safeStringify(body.system),\n );\n idx++;\n }\n if (Array.isArray(body?.messages)) {\n for (const msg of body.messages) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content),\n );\n idx++;\n }\n } else if (body?.prompt) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.prompt));\n } else if (body?.inputText) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.inputText));\n }\n\n if (body?.temperature != null) span.setAttribute('neatlogs.llm.temperature', body.temperature);\n if (body?.top_p != null) span.setAttribute('neatlogs.llm.top_p', body.top_p);\n const maxTokens = body?.max_tokens ?? body?.maxTokens ?? body?.max_tokens_to_sample;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n const cfg = body?.textGenerationConfig;\n if (cfg) {\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokenCount != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokenCount);\n }\n}\n\nfunction finalizeInvoke(span: Span, vendor: string, body: any): void {\n let text: string | undefined;\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n if (vendor === 'anthropic') {\n if (Array.isArray(body?.content)) {\n text = body.content.filter((b: any) => b?.type === 'text').map((b: any) => b.text).join('');\n let toolIdx = 0;\n for (const b of body.content) {\n if (b?.type === 'tool_use') {\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(b.id ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(b.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(b.input ?? {}));\n toolIdx++;\n }\n }\n } else if (body?.completion != null) {\n text = body.completion;\n }\n promptTokens = body?.usage?.input_tokens;\n completionTokens = body?.usage?.output_tokens;\n finishReason = body?.stop_reason;\n } else if (vendor === 'amazon') {\n const r = Array.isArray(body?.results) ? body.results[0] : undefined;\n if (r) {\n text = r.outputText;\n completionTokens = r.tokenCount;\n finishReason = r.completionReason;\n }\n promptTokens = body?.inputTextTokenCount;\n } else if (vendor === 'meta') {\n text = body?.generation;\n promptTokens = body?.prompt_token_count;\n completionTokens = body?.generation_token_count;\n finishReason = body?.stop_reason;\n } else if (vendor === 'cohere') {\n const g = Array.isArray(body?.generations) ? body.generations[0] : undefined;\n if (g) {\n text = g.text;\n finishReason = g.finish_reason;\n }\n } else {\n text = body?.generation ?? body?.completion ?? body?.outputText;\n }\n\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(text));\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (promptTokens != null && completionTokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', promptTokens + completionTokens);\n }\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction wrapInvokeStream(response: any, span: Span, vendor: string): any {\n const body = response?.body;\n if (!body || typeof body[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = body[Symbol.asyncIterator].bind(body);\n const textParts: string[] = [];\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n const finalize = () => {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n const wrappedBody = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalize();\n return result;\n }\n const data = decodeBody(result.value?.chunk?.bytes);\n if (data?.type === 'content_block_delta') {\n textParts.push(data?.delta?.text ?? '');\n } else if (data?.type === 'message_delta') {\n if (data?.delta?.stop_reason) finishReason = data.delta.stop_reason;\n if (data?.usage?.output_tokens != null) completionTokens = data.usage.output_tokens;\n }\n if (data?.outputText) textParts.push(data.outputText);\n if (data?.generation) textParts.push(data.generation);\n const metrics = data?.['amazon-bedrock-invocationMetrics'];\n if (metrics) {\n promptTokens = metrics.inputTokenCount ?? promptTokens;\n completionTokens = metrics.outputTokenCount ?? completionTokens;\n }\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalize();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.body = wrappedBody;\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n span.end();\n}\n"],"mappings":"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","names":[]}