@lelemondev/sdk 0.9.2 → 0.9.4

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 (50) hide show
  1. package/README.md +148 -15
  2. package/dist/anthropic.d.mts +2 -2
  3. package/dist/anthropic.d.ts +2 -2
  4. package/dist/anthropic.js +1 -1
  5. package/dist/anthropic.mjs +1 -1
  6. package/dist/bedrock.d.mts +2 -2
  7. package/dist/bedrock.d.ts +2 -2
  8. package/dist/bedrock.js +1 -1
  9. package/dist/bedrock.mjs +1 -1
  10. package/dist/capture-BJnZrkYl.d.mts +264 -0
  11. package/dist/capture-BJnZrkYl.d.ts +264 -0
  12. package/dist/gemini.d.mts +2 -2
  13. package/dist/gemini.d.ts +2 -2
  14. package/dist/gemini.js +2 -2
  15. package/dist/gemini.mjs +1 -1
  16. package/dist/index.d.mts +21 -245
  17. package/dist/index.d.ts +21 -245
  18. package/dist/index.js +2 -2
  19. package/dist/index.mjs +2 -2
  20. package/dist/openai.d.mts +2 -2
  21. package/dist/openai.d.ts +2 -2
  22. package/dist/openai.js +1 -1
  23. package/dist/openai.mjs +1 -1
  24. package/dist/openrouter.d.mts +2 -2
  25. package/dist/openrouter.d.ts +2 -2
  26. package/dist/openrouter.js +1 -1
  27. package/dist/openrouter.mjs +1 -1
  28. package/package.json +5 -2
  29. package/dist/anthropic.js.map +0 -1
  30. package/dist/anthropic.mjs.map +0 -1
  31. package/dist/bedrock.js.map +0 -1
  32. package/dist/bedrock.mjs.map +0 -1
  33. package/dist/express.js.map +0 -1
  34. package/dist/express.mjs.map +0 -1
  35. package/dist/gemini.js.map +0 -1
  36. package/dist/gemini.mjs.map +0 -1
  37. package/dist/hono.js.map +0 -1
  38. package/dist/hono.mjs.map +0 -1
  39. package/dist/index.js.map +0 -1
  40. package/dist/index.mjs.map +0 -1
  41. package/dist/integrations.js.map +0 -1
  42. package/dist/integrations.mjs.map +0 -1
  43. package/dist/lambda.js.map +0 -1
  44. package/dist/lambda.mjs.map +0 -1
  45. package/dist/next.js.map +0 -1
  46. package/dist/next.mjs.map +0 -1
  47. package/dist/openai.js.map +0 -1
  48. package/dist/openai.mjs.map +0 -1
  49. package/dist/openrouter.js.map +0 -1
  50. package/dist/openrouter.mjs.map +0 -1
package/README.md CHANGED
@@ -30,7 +30,8 @@ npm install @lelemondev/sdk
30
30
  ## Quick Start
31
31
 
32
32
  ```typescript
33
- import { init, observe } from '@lelemondev/sdk';
33
+ // Import from provider-specific entry point for smaller bundle size
34
+ import { init, observe } from '@lelemondev/sdk/openai';
34
35
  import OpenAI from 'openai';
35
36
 
36
37
  // 1. Initialize once
@@ -46,6 +47,27 @@ const response = await openai.chat.completions.create({
46
47
  });
47
48
  ```
48
49
 
50
+ ### Provider-Specific Imports
51
+
52
+ Each provider has its own entry point for optimal bundle size:
53
+
54
+ ```typescript
55
+ // OpenAI
56
+ import { init, observe, flush } from '@lelemondev/sdk/openai';
57
+
58
+ // Anthropic
59
+ import { init, observe, flush } from '@lelemondev/sdk/anthropic';
60
+
61
+ // AWS Bedrock
62
+ import { init, observe, flush } from '@lelemondev/sdk/bedrock';
63
+
64
+ // Google Gemini
65
+ import { init, observe, flush } from '@lelemondev/sdk/gemini';
66
+
67
+ // OpenRouter
68
+ import { init, observe, flush } from '@lelemondev/sdk/openrouter';
69
+ ```
70
+
49
71
  ## Supported Providers
50
72
 
51
73
  | Provider | Status | Methods |
@@ -61,7 +83,7 @@ const response = await openai.chat.completions.create({
61
83
  [OpenRouter](https://openrouter.ai) provides unified access to 400+ models from OpenAI, Anthropic, Google, Meta, Mistral, and more through a single API.
62
84
 
63
85
  ```typescript
64
- import { init, observe } from '@lelemondev/sdk';
86
+ import { init, observe } from '@lelemondev/sdk/openrouter';
65
87
  import OpenAI from 'openai';
66
88
 
67
89
  init({ apiKey: process.env.LELEMON_API_KEY });
@@ -94,7 +116,7 @@ The SDK works with **any Node.js application**. Framework integrations are optio
94
116
  For long-running processes, the SDK auto-flushes every second (configurable via `flushIntervalMs`):
95
117
 
96
118
  ```typescript
97
- import { init, observe } from '@lelemondev/sdk';
119
+ import { init, observe } from '@lelemondev/sdk/openai';
98
120
  import OpenAI from 'openai';
99
121
 
100
122
  init({ apiKey: process.env.LELEMON_API_KEY });
@@ -119,7 +141,7 @@ async function handleRequest(userId: string, message: string) {
119
141
  For scripts or serverless functions, call `flush()` before the process exits:
120
142
 
121
143
  ```typescript
122
- import { init, observe, flush } from '@lelemondev/sdk';
144
+ import { init, observe, flush } from '@lelemondev/sdk/openai';
123
145
  import OpenAI from 'openai';
124
146
 
125
147
  init({ apiKey: process.env.LELEMON_API_KEY });
@@ -144,7 +166,7 @@ main();
144
166
 
145
167
  ```typescript
146
168
  import http from 'http';
147
- import { init, observe, flush } from '@lelemondev/sdk';
169
+ import { init, observe, flush } from '@lelemondev/sdk/openai';
148
170
  import OpenAI from 'openai';
149
171
 
150
172
  init({ apiKey: process.env.LELEMON_API_KEY });
@@ -194,7 +216,7 @@ Framework integrations automate the `flush()` call so you don't have to think ab
194
216
 
195
217
  ```typescript
196
218
  // app/api/chat/route.ts
197
- import { init, observe } from '@lelemondev/sdk';
219
+ import { init, observe } from '@lelemondev/sdk/openai';
198
220
  import { withObserve } from '@lelemondev/sdk/next';
199
221
  import { after } from 'next/server';
200
222
  import OpenAI from 'openai';
@@ -219,7 +241,7 @@ export const POST = withObserve(
219
241
 
220
242
  ```typescript
221
243
  import express from 'express';
222
- import { init, observe } from '@lelemondev/sdk';
244
+ import { init, observe } from '@lelemondev/sdk/openai';
223
245
  import { createMiddleware } from '@lelemondev/sdk/express';
224
246
  import OpenAI from 'openai';
225
247
 
@@ -241,7 +263,7 @@ app.post('/chat', async (req, res) => {
241
263
  ### AWS Lambda
242
264
 
243
265
  ```typescript
244
- import { init, observe } from '@lelemondev/sdk';
266
+ import { init, observe } from '@lelemondev/sdk/openai';
245
267
  import { withObserve } from '@lelemondev/sdk/lambda';
246
268
  import OpenAI from 'openai';
247
269
 
@@ -265,7 +287,7 @@ export const handler = withObserve(async (event) => {
265
287
 
266
288
  ```typescript
267
289
  import { Hono } from 'hono';
268
- import { init, observe } from '@lelemondev/sdk';
290
+ import { init, observe } from '@lelemondev/sdk/openai';
269
291
  import { createMiddleware } from '@lelemondev/sdk/hono';
270
292
  import OpenAI from 'openai';
271
293
 
@@ -299,8 +321,14 @@ init({
299
321
  endpoint: 'https://...', // Optional, custom endpoint
300
322
  debug: false, // Optional, enable debug logs
301
323
  disabled: false, // Optional, disable tracing
302
- batchSize: 10, // Optional, items per batch
303
- flushIntervalMs: 1000, // Optional, auto-flush interval
324
+ batchSize: 10, // Optional, items per batch (default: 10)
325
+ flushIntervalMs: 1000, // Optional, auto-flush interval in ms (default: 1000)
326
+ requestTimeoutMs: 10000, // Optional, HTTP request timeout in ms (default: 10000)
327
+ service: { // Optional, service metadata for telemetry
328
+ name: 'my-ai-app', // Service name
329
+ version: '1.0.0', // Service version
330
+ environment: 'production' // Deployment environment
331
+ }
304
332
  });
305
333
  ```
306
334
 
@@ -325,6 +353,101 @@ Manually flush pending traces. Use in serverless without framework integration.
325
353
  await flush();
326
354
  ```
327
355
 
356
+ ### `isEnabled()`
357
+
358
+ Check if tracing is enabled (useful for conditional logic).
359
+
360
+ ```typescript
361
+ import { isEnabled } from '@lelemondev/sdk/openai';
362
+
363
+ if (isEnabled()) {
364
+ console.log('Tracing is active');
365
+ }
366
+ ```
367
+
368
+ ### `trace(name, fn)` / `trace(options, fn)`
369
+
370
+ Group multiple LLM calls under a single trace. Useful for agents, RAG pipelines, and multi-step workflows.
371
+
372
+ ```typescript
373
+ import { trace, span } from '@lelemondev/sdk/openai';
374
+
375
+ // Simple usage
376
+ await trace('sales-agent', async () => {
377
+ const response = await openai.chat.completions.create({...});
378
+ return response;
379
+ });
380
+
381
+ // With options
382
+ await trace({
383
+ name: 'rag-query',
384
+ input: userQuestion,
385
+ metadata: { source: 'api' },
386
+ tags: ['production']
387
+ }, async () => {
388
+ // All LLM calls inside become children of this trace
389
+ const docs = await searchVectors(userQuestion);
390
+ const response = await openai.chat.completions.create({...});
391
+ return response;
392
+ });
393
+ ```
394
+
395
+ ### `span(options)`
396
+
397
+ Manually capture a span for non-LLM operations (retrieval, embedding, tool calls). Must be called within a `trace()` block.
398
+
399
+ ```typescript
400
+ import { trace, span } from '@lelemondev/sdk/openai';
401
+
402
+ await trace('rag-pipeline', async () => {
403
+ // Capture a retrieval span
404
+ const t0 = Date.now();
405
+ const docs = await pinecone.query({ vector, topK: 5 });
406
+ span({
407
+ type: 'retrieval',
408
+ name: 'pinecone-search',
409
+ input: { topK: 5 },
410
+ output: { count: docs.length },
411
+ durationMs: Date.now() - t0,
412
+ });
413
+
414
+ // LLM call is automatically captured
415
+ return openai.chat.completions.create({...});
416
+ });
417
+ ```
418
+
419
+ **Span types:** `retrieval`, `embedding`, `tool`, `guardrail`, `rerank`, `custom`
420
+
421
+ ### `captureSpan(options)`
422
+
423
+ Lower-level API for manual span capture. Works both inside and outside `trace()` blocks.
424
+
425
+ ```typescript
426
+ import { captureSpan } from '@lelemondev/sdk/openai';
427
+
428
+ captureSpan({
429
+ type: 'tool',
430
+ name: 'get_weather',
431
+ input: { location: 'San Francisco' },
432
+ output: { temperature: 72, conditions: 'sunny' },
433
+ durationMs: 150,
434
+ status: 'success', // or 'error'
435
+ });
436
+ ```
437
+
438
+ ### `getTraceContext()`
439
+
440
+ Get the current trace context (useful for advanced scenarios).
441
+
442
+ ```typescript
443
+ import { getTraceContext } from '@lelemondev/sdk/openai';
444
+
445
+ const ctx = getTraceContext();
446
+ if (ctx) {
447
+ console.log('Inside trace:', ctx.name, ctx.traceId);
448
+ }
449
+ ```
450
+
328
451
  ## User & Session Tracking
329
452
 
330
453
  Track which user generated each trace and group related conversations.
@@ -409,14 +532,18 @@ app.post('/chat', async (req, res) => {
409
532
 
410
533
  ### Reusable Context with createObserve()
411
534
 
412
- When you have multiple LLM clients or make calls from different places, use `createObserve()` to avoid repeating context:
535
+ When you have multiple LLM clients or make calls from different places, use `createObserve()` to avoid repeating context.
536
+
537
+ > **Note:** `createObserve` is imported from the generic `@lelemondev/sdk` entry point (not provider-specific) because it works with any provider.
413
538
 
414
539
  ```typescript
415
- import { createObserve } from '@lelemondev/sdk';
540
+ import { init, createObserve } from '@lelemondev/sdk';
416
541
  import OpenAI from 'openai';
417
542
  import { GoogleGenerativeAI } from '@google/generative-ai';
418
543
  import { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime';
419
544
 
545
+ init({ apiKey: process.env.LELEMON_API_KEY });
546
+
420
547
  // Create a scoped observe function with user context
421
548
  const observeForUser = createObserve({
422
549
  userId: 'user-123',
@@ -439,7 +566,9 @@ await gemini.getGenerativeModel({ model: 'gemini-pro' }).generateContent('...');
439
566
  Set up user context once, use it everywhere:
440
567
 
441
568
  ```typescript
442
- import { createObserve } from '@lelemondev/sdk';
569
+ import { init, createObserve } from '@lelemondev/sdk';
570
+
571
+ init({ apiKey: process.env.LELEMON_API_KEY });
443
572
 
444
573
  // Middleware to attach observe function to request
445
574
  app.use((req, res, next) => {
@@ -469,6 +598,8 @@ app.post('/summarize', async (req, res) => {
469
598
  ### Multi-tenant Application
470
599
 
471
600
  ```typescript
601
+ import { observe } from '@lelemondev/sdk/openai';
602
+
472
603
  app.post('/api/:tenantId/chat', async (req, res) => {
473
604
  const openai = observe(new OpenAI(), {
474
605
  userId: req.user.id,
@@ -491,7 +622,9 @@ When your application spans multiple services (REST API, WebSocket server, backg
491
622
  ```typescript
492
623
  // Shared utility for creating observe context
493
624
  // utils/observe-context.ts
494
- import { createObserve } from '@lelemondev/sdk';
625
+ import { init, createObserve } from '@lelemondev/sdk';
626
+
627
+ init({ apiKey: process.env.LELEMON_API_KEY });
495
628
 
496
629
  export function createUserObserve(userId: string, sessionId: string, service: string) {
497
630
  return createObserve({
@@ -1,5 +1,5 @@
1
- import { ObserveOptions } from './index.mjs';
2
- export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './index.mjs';
1
+ import { O as ObserveOptions } from './capture-BJnZrkYl.mjs';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.mjs';
3
3
 
4
4
  /**
5
5
  * Anthropic Provider Entry Point
@@ -1,5 +1,5 @@
1
- import { ObserveOptions } from './index.js';
2
- export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './index.js';
1
+ import { O as ObserveOptions } from './capture-BJnZrkYl.js';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.js';
3
3
 
4
4
  /**
5
5
  * Anthropic Provider Entry Point
package/dist/anthropic.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
2
- var de=Object.defineProperty;var le=(e,t,n)=>t in e?de(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var J=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>le(e,typeof t!="symbol"?t+"":t,n);var X=pe((Qe,be)=>{be.exports={name:"@lelemondev/sdk",version:"0.9.2",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function z(e){U=e;}function y(){return U?true:me("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&P("debug",e,t);}function $(e,t){y()&&P("info",e,t);}function E(e,t){P("warn",e,t);}function j(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function F(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function G(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function P(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,R=class{constructor(t){S(this,"config");S(this,"queue",[]);S(this,"flushPromise",null);S(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),G(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;W(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Y(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",ke="nodejs";function we(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Te(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof J<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function Z(e){if(!v){let n=we(),r=Te();v={"telemetry.sdk.name":he,"telemetry.sdk.version":ve(),"telemetry.sdk.language":ke},n&&(v["process.runtime.name"]=n.name,v["process.runtime.version"]=n.version),r&&(v["os.type"]=r);}let t={...v};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var N={},k=null,O=null,ee="https://www.lelemon.dev";function Se(e={}){N=e,e.debug&&z(true),O=Z(e.service),$("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),k=ne(e),k.isEnabled()?$("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function te(){return N}function D(){return O}function _e(){return w().isEnabled()}function w(){return k||(k=ne(N)),k}async function Ie(){k&&await k.flush();}function ne(e){let t=e.apiKey??Ce("LELEMON_API_KEY");return !t&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new R({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var se={};function oe(e){se=e,m("Global context updated",e);}function I(){return se}function A(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=I(),r=g(),o=x(),a=D(),u={provider:e.provider,model:e.model,input:L(e.input),rawResponse:e.rawResponse?_(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return j(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));return}}function C(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=I(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:x(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};j(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=I(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=D(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(e.input),output:_(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:x(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){M("unknown",t instanceof Error?t:new Error(String(t)));}}var re=1e5,Ee=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Re=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function De(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ee.some(n=>t.includes(n))||Me.some(n=>t.includes(n)))}function L(e){return _(e,0)}function _(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>re?e.slice(0,re)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>_(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))De(r)?n[r]="[REDACTED]":n[r]=_(o,t+1);return n}return String(e)}var ie=new async_hooks.AsyncLocalStorage;function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function q(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function qe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function $e(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function je(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??x(),a=x(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return ie.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{Pe(u,d?void 0:c,d);}})}function Pe(e,t,n){let r=w();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=I(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Oe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);K({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&$e(e.toolCallId);}var T="anthropic";function ae(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ue(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Ne(u))return Le(u,o,r);let c=Date.now()-r,d=u,s=A({provider:T,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=B(d.content);l.length>0&&q(l,s);}return u}catch(u){let c=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ce(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ke(a,o,r):a}catch(a){let u=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Ne(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ke(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;C({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=A({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=B(o.content);b.length>0&&q(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Le(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)C({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=A({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=B(r.content);i.length>0&&q(i,l);}}}}function B(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function _t(e,t){return t&&oe(t),te().disabled?(m("Tracing disabled, returning unwrapped client"),e):ae(e)?(F("anthropic"),Je(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Je(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Ue(a):a}})}function Ue(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ue(o.bind(t)):n==="stream"&&typeof o=="function"?ce(o.bind(t)):o}})}
2
+ var de=Object.defineProperty;var le=(e,t,n)=>t in e?de(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var J=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>le(e,typeof t!="symbol"?t+"":t,n);var X=pe((Qe,be)=>{be.exports={name:"@lelemondev/sdk",version:"0.9.4",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function z(e){U=e;}function y(){return U?true:me("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&P("debug",e,t);}function $(e,t){y()&&P("info",e,t);}function E(e,t){P("warn",e,t);}function j(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function F(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function G(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function P(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,R=class{constructor(t){S(this,"config");S(this,"queue",[]);S(this,"flushPromise",null);S(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),G(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;W(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Y(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",ke="nodejs";function we(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Te(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof J<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function Z(e){if(!v){let n=we(),r=Te();v={"telemetry.sdk.name":he,"telemetry.sdk.version":ve(),"telemetry.sdk.language":ke},n&&(v["process.runtime.name"]=n.name,v["process.runtime.version"]=n.version),r&&(v["os.type"]=r);}let t={...v};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var N={},k=null,O=null,ee="https://www.lelemon.dev";function Se(e={}){N=e,e.debug&&z(true),O=Z(e.service),$("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),k=ne(e),k.isEnabled()?$("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function te(){return N}function D(){return O}function _e(){return w().isEnabled()}function w(){return k||(k=ne(N)),k}async function Ie(){k&&await k.flush();}function ne(e){let t=e.apiKey??Ce("LELEMON_API_KEY");return !t&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new R({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var se={};function oe(e){se=e,m("Global context updated",e);}function I(){return se}function A(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=I(),r=g(),o=x(),a=D(),u={provider:e.provider,model:e.model,input:L(e.input),rawResponse:e.rawResponse?_(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return j(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));return}}function C(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=I(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:x(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};j(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=I(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=D(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(e.input),output:_(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:x(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){M("unknown",t instanceof Error?t:new Error(String(t)));}}var re=1e5,Ee=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Re=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function De(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ee.some(n=>t.includes(n))||Me.some(n=>t.includes(n)))}function L(e){return _(e,0)}function _(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>re?e.slice(0,re)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>_(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))De(r)?n[r]="[REDACTED]":n[r]=_(o,t+1);return n}return String(e)}var ie=new async_hooks.AsyncLocalStorage;function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function q(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function qe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function $e(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function je(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??x(),a=x(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return ie.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{Pe(u,d?void 0:c,d);}})}function Pe(e,t,n){let r=w();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=I(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Oe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);K({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&$e(e.toolCallId);}var T="anthropic";function ae(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ue(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Ne(u))return Le(u,o,r);let c=Date.now()-r,d=u,s=A({provider:T,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=B(d.content);l.length>0&&q(l,s);}return u}catch(u){let c=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ce(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ke(a,o,r):a}catch(a){let u=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Ne(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ke(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;C({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=A({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=B(o.content);b.length>0&&q(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Le(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)C({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=A({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=B(r.content);i.length>0&&q(i,l);}}}}function B(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function _t(e,t){return t&&oe(t),te().disabled?(m("Tracing disabled, returning unwrapped client"),e):ae(e)?(F("anthropic"),Je(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Je(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Ue(a):a}})}function Ue(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ue(o.bind(t)):n==="stream"&&typeof o=="function"?ce(o.bind(t)):o}})}
3
3
  exports.captureSpan=K;exports.flush=Ie;exports.getTraceContext=g;exports.init=Se;exports.isEnabled=_e;exports.observe=_t;exports.span=Oe;exports.trace=je;//# sourceMappingURL=anthropic.js.map
4
4
  //# sourceMappingURL=anthropic.js.map
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- var ce=Object.defineProperty;var de=(e,t,n)=>t in e?ce(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var B=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var Y=le((We,ye)=>{ye.exports={name:"@lelemondev/sdk",version:"0.9.2",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var J=false;function U(e){J=e;}function y(){return J?true:pe("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&j("debug",e,t);}function q(e,t){y()&&j("info",e,t);}function C(e,t){j("warn",e,t);}function $(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function E(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function F(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function V(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function W(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function j(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var me=10,fe=1e3,ge=1e4,M=class{constructor(t){x(this,"config");x(this,"queue",[]);x(this,"flushPromise",null);x(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??me,flushIntervalMs:t.flushIntervalMs??fe,requestTimeoutMs:t.requestTimeoutMs??ge};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){G(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;H(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),W(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var be="@lelemondev/sdk",he="nodejs";function ke(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function we(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Te(){try{if(typeof B<"u")return Y().version??"unknown"}catch{}return "unknown"}var T=null;function Q(e){if(!T){let n=ke(),r=we();T={"telemetry.sdk.name":be,"telemetry.sdk.version":Te(),"telemetry.sdk.language":he},n&&(T["process.runtime.name"]=n.name,T["process.runtime.version"]=n.version),r&&(T["os.type"]=r);}let t={...T};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var O={},h=null,P=null,Z="https://www.lelemon.dev";function xe(e={}){O=e,e.debug&&U(true),P=Q(e.service),q("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),h=te(e),h.isEnabled()?q("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ee(){return O}function R(){return P}function Se(){return k().isEnabled()}function k(){return h||(h=te(O)),h}async function _e(){h&&await h.flush();}function te(e){let t=e.apiKey??Ie("LELEMON_API_KEY");return !t&&!e.disabled&&C("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new M({apiKey:t??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ie(e){if(typeof process<"u"&&process.env)return process.env[e]}var re={};function se(e){re=e,m("Global context updated",e);}function _(){return re}function D(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=_(),r=g(),o=v(),a=R(),u={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function I(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=_(),r=g(),o=R(),a={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};$(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=_(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=R(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Ce=["api_key","apikey","password","secret","authorization"],Ee=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Me=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Re(e){let t=e.toLowerCase();return Me.includes(t)?false:!!(Ce.some(n=>t.includes(n))||Ee.some(n=>t.includes(n)))}function K(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ne?e.slice(0,ne)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Re(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var oe=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return oe.getStore()}function A(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ae(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function qe(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function $e(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??v(),a=v(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return oe.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{je(u,d?void 0:c,d);}})}function je(e,t,n){let r=k();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=_(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Pe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ae(e.toolCallId);N({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&qe(e.toolCallId);}var w="anthropic";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ae(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Oe(u))return Ke(u,o,r);let c=Date.now()-r,d=u,s=D({provider:w,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=L(d.content);l.length>0&&A(l,s);}return u}catch(u){let c=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ue(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ne(a,o,r):a}catch(a){let u=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Oe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ne(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;I({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=D({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=L(o.content);b.length>0&&A(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Ke(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)I({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=L(r.content);i.length>0&&A(i,l);}}}}function L(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function bt(e,t){return t&&se(t),ee().disabled?(m("Tracing disabled, returning unwrapped client"),e):ie(e)?(z("anthropic"),Be(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Be(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Je(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ae(o.bind(t)):n==="stream"&&typeof o=="function"?ue(o.bind(t)):o}})}
2
+ var ce=Object.defineProperty;var de=(e,t,n)=>t in e?ce(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var B=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var Y=le((We,ye)=>{ye.exports={name:"@lelemondev/sdk",version:"0.9.4",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var J=false;function U(e){J=e;}function y(){return J?true:pe("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&j("debug",e,t);}function q(e,t){y()&&j("info",e,t);}function C(e,t){j("warn",e,t);}function $(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function E(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function F(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function V(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function W(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function j(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var me=10,fe=1e3,ge=1e4,M=class{constructor(t){x(this,"config");x(this,"queue",[]);x(this,"flushPromise",null);x(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??me,flushIntervalMs:t.flushIntervalMs??fe,requestTimeoutMs:t.requestTimeoutMs??ge};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){G(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;H(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),W(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var be="@lelemondev/sdk",he="nodejs";function ke(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function we(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Te(){try{if(typeof B<"u")return Y().version??"unknown"}catch{}return "unknown"}var T=null;function Q(e){if(!T){let n=ke(),r=we();T={"telemetry.sdk.name":be,"telemetry.sdk.version":Te(),"telemetry.sdk.language":he},n&&(T["process.runtime.name"]=n.name,T["process.runtime.version"]=n.version),r&&(T["os.type"]=r);}let t={...T};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var O={},h=null,P=null,Z="https://www.lelemon.dev";function xe(e={}){O=e,e.debug&&U(true),P=Q(e.service),q("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),h=te(e),h.isEnabled()?q("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ee(){return O}function R(){return P}function Se(){return k().isEnabled()}function k(){return h||(h=te(O)),h}async function _e(){h&&await h.flush();}function te(e){let t=e.apiKey??Ie("LELEMON_API_KEY");return !t&&!e.disabled&&C("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new M({apiKey:t??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ie(e){if(typeof process<"u"&&process.env)return process.env[e]}var re={};function se(e){re=e,m("Global context updated",e);}function _(){return re}function D(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=_(),r=g(),o=v(),a=R(),u={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function I(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=_(),r=g(),o=R(),a={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};$(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=_(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=R(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Ce=["api_key","apikey","password","secret","authorization"],Ee=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Me=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Re(e){let t=e.toLowerCase();return Me.includes(t)?false:!!(Ce.some(n=>t.includes(n))||Ee.some(n=>t.includes(n)))}function K(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ne?e.slice(0,ne)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Re(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var oe=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return oe.getStore()}function A(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ae(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function qe(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function $e(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??v(),a=v(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return oe.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{je(u,d?void 0:c,d);}})}function je(e,t,n){let r=k();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=_(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Pe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ae(e.toolCallId);N({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&qe(e.toolCallId);}var w="anthropic";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ae(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Oe(u))return Ke(u,o,r);let c=Date.now()-r,d=u,s=D({provider:w,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=L(d.content);l.length>0&&A(l,s);}return u}catch(u){let c=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ue(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ne(a,o,r):a}catch(a){let u=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Oe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ne(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;I({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=D({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=L(o.content);b.length>0&&A(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Ke(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)I({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=L(r.content);i.length>0&&A(i,l);}}}}function L(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function bt(e,t){return t&&se(t),ee().disabled?(m("Tracing disabled, returning unwrapped client"),e):ie(e)?(z("anthropic"),Be(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Be(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Je(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ae(o.bind(t)):n==="stream"&&typeof o=="function"?ue(o.bind(t)):o}})}
3
3
  export{N as captureSpan,_e as flush,g as getTraceContext,xe as init,Se as isEnabled,bt as observe,Pe as span,$e as trace};//# sourceMappingURL=anthropic.mjs.map
4
4
  //# sourceMappingURL=anthropic.mjs.map
@@ -1,5 +1,5 @@
1
- import { ObserveOptions } from './index.mjs';
2
- export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './index.mjs';
1
+ import { O as ObserveOptions } from './capture-BJnZrkYl.mjs';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.mjs';
3
3
 
4
4
  /**
5
5
  * AWS Bedrock Provider Entry Point
package/dist/bedrock.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { ObserveOptions } from './index.js';
2
- export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './index.js';
1
+ import { O as ObserveOptions } from './capture-BJnZrkYl.js';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.js';
3
3
 
4
4
  /**
5
5
  * AWS Bedrock Provider Entry Point