@lelemondev/sdk 0.9.6 → 0.9.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.
package/README.md CHANGED
@@ -20,6 +20,7 @@ https://lelemondev.github.io/lelemondev-sdk/llms-full.txt
20
20
  - **Framework Integrations** - Next.js, Express, Lambda, Hono
21
21
  - **Streaming Support** - Full support for streaming responses
22
22
  - **Type-safe** - Preserves your client's TypeScript types
23
+ - **PII Redaction** - Optional email, phone, and custom pattern redaction
23
24
 
24
25
  ## Installation
25
26
 
@@ -328,6 +329,12 @@ init({
328
329
  name: 'my-ai-app', // Service name
329
330
  version: '1.0.0', // Service version
330
331
  environment: 'production' // Deployment environment
332
+ },
333
+ redaction: { // Optional, PII redaction config
334
+ emails: true, // Redact email addresses → [EMAIL]
335
+ phones: true, // Redact 9+ digit numbers → [PHONE]
336
+ patterns: [/SSN-\d{9}/g], // Custom regex patterns → [REDACTED]
337
+ keys: ['cpf', 'rut'], // Additional sensitive key names
331
338
  }
332
339
  });
333
340
  ```
@@ -345,6 +352,62 @@ const openai = observe(new OpenAI(), {
345
352
  });
346
353
  ```
347
354
 
355
+ #### Multi-Tenant Servers (Important!)
356
+
357
+ For multi-tenant servers handling concurrent requests from different users, **create a new observed client per-request** with the user's context:
358
+
359
+ ```typescript
360
+ // ❌ WRONG - Global client with no context
361
+ const client = observe(new BedrockRuntimeClient());
362
+
363
+ async function handleRequest(userId: string, sessionId: string) {
364
+ await client.send(command); // No user/session info!
365
+ }
366
+
367
+ // ✅ CORRECT - Observed client per-request with context
368
+ const rawClient = new BedrockRuntimeClient();
369
+
370
+ async function handleRequest(userId: string, sessionId: string) {
371
+ const client = observe(rawClient, {
372
+ userId,
373
+ sessionId,
374
+ metadata: { tenantId },
375
+ });
376
+ await client.send(command); // Traces include user/session!
377
+ }
378
+ ```
379
+
380
+ **Recommended pattern for NestJS/Express:**
381
+
382
+ ```typescript
383
+ // llm.provider.ts
384
+ @Injectable()
385
+ export class LlmProvider {
386
+ private rawClient: BedrockRuntimeClient;
387
+
388
+ constructor() {
389
+ this.rawClient = new BedrockRuntimeClient({ region: 'us-east-1' });
390
+ }
391
+
392
+ // Create observed client with per-request context
393
+ getClient(ctx: { userId: string; sessionId: string; tenantId?: string }) {
394
+ return observe(this.rawClient, {
395
+ userId: ctx.userId,
396
+ sessionId: ctx.sessionId,
397
+ metadata: { tenantId: ctx.tenantId },
398
+ });
399
+ }
400
+ }
401
+
402
+ // Usage in service
403
+ const client = this.llmProvider.getClient({
404
+ userId: request.userId,
405
+ sessionId: request.conversationId,
406
+ tenantId: request.tenantId,
407
+ });
408
+ await client.send(command);
409
+ ```
410
+
348
411
  ### `flush()`
349
412
 
350
413
  Manually flush pending traces. Use in serverless without framework integration.
@@ -779,9 +842,47 @@ Each LLM call automatically captures:
779
842
  The SDK automatically sanitizes sensitive data:
780
843
 
781
844
  - API keys and tokens are redacted
782
- - Large payloads are truncated
845
+ - Large payloads are truncated (100KB limit per field)
783
846
  - Errors are captured safely
784
847
 
848
+ ### PII Redaction
849
+
850
+ Optionally redact personally identifiable information before traces are sent:
851
+
852
+ ```typescript
853
+ init({
854
+ apiKey: process.env.LELEMON_API_KEY,
855
+ redaction: {
856
+ emails: true, // user@example.com → [EMAIL]
857
+ phones: true, // 123456789 → [PHONE] (9+ digits)
858
+ }
859
+ });
860
+ ```
861
+
862
+ **Custom patterns** for domain-specific PII:
863
+
864
+ ```typescript
865
+ init({
866
+ redaction: {
867
+ // Regex patterns (replaced with [REDACTED])
868
+ patterns: [
869
+ /SSN-\d{9}/g, // Social Security Numbers
870
+ /CARD-\d{16}/g, // Credit card numbers
871
+ /CPF-\d{11}/g, // Brazilian CPF
872
+ ],
873
+ // Additional key names to redact (case-insensitive, partial match)
874
+ keys: ['cpf', 'rut', 'dni', 'national_id'],
875
+ }
876
+ });
877
+ ```
878
+
879
+ **Default redacted keys** (always active):
880
+ - `api_key`, `apikey`, `password`, `secret`, `authorization`
881
+ - `access_token`, `auth_token`, `bearer_token`, `refresh_token`, `id_token`, `session_token`
882
+
883
+ **Safe keys** (never redacted even if containing "token"):
884
+ - `inputTokens`, `outputTokens`, `totalTokens`, `promptTokens`, `completionTokens`, etc.
885
+
785
886
  ## Environment Variables
786
887
 
787
888
  | Variable | Description |
@@ -1,5 +1,5 @@
1
- import { O as ObserveOptions } from './capture-ChybLulj.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-ChybLulj.mjs';
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.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-CiUL-4hv.mjs';
3
3
 
4
4
  /**
5
5
  * Anthropic Provider Entry Point
@@ -1,5 +1,5 @@
1
- import { O as ObserveOptions } from './capture-ChybLulj.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-ChybLulj.js';
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.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-CiUL-4hv.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 pe=Object.defineProperty;var me=(e,t,n)=>t in e?pe(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var z=(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 fe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>me(e,typeof t!="symbol"?t+"":t,n);var Z=fe((tt,ke)=>{ke.exports={name:"@lelemondev/sdk",version:"0.9.6",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 F=false;function G(e){F=e;}function y(){return F?true:ge("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&$("debug",e,t);}function j(e,t){y()&&$("info",e,t);}function E(e,t){$("warn",e,t);}function O(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 V(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function H(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function W(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function Y(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function X(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Q(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function $(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 ge(e){if(typeof process<"u"&&process.env)return process.env[e]}var ye=10,be=1e3,he=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??ye,flushIntervalMs:t.flushIntervalMs??be,requestTimeoutMs:t.requestTimeoutMs??he};}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();H(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),W(t.length,Date.now()-n);}catch(r){Y(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;X(t,s,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Q(o.status,Date.now()-d),!o.ok){let i=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${i}`)}let l=await o.text();return l?JSON.parse(l):{}}catch(o){throw clearTimeout(c),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var we="@lelemondev/sdk",Te="nodejs";function ve(){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 xe(){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 Se(){try{if(typeof z<"u")return Z().version??"unknown"}catch{}return "unknown"}var v=null;function te(e){if(!v){let n=ve(),r=xe();v={"telemetry.sdk.name":we,"telemetry.sdk.version":Se(),"telemetry.sdk.language":Te},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,P=null,ne="https://api.lelemon.dev";function Ie(e={}){N=e,e.debug&&G(true),P=te(e.service),j("Initializing SDK",{endpoint:e.endpoint??ne,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),k=oe(e),k.isEnabled()?j("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function re(){return N}function D(){return P}function Ce(){return w().isEnabled()}function w(){return k||(k=oe(N)),k}async function Ee(){k&&await k.flush();}function oe(e){let t=e.apiKey??Me("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??ne,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Me(e){if(typeof process<"u"&&process.env)return process.env[e]}var K=Symbol.for("@lelemondev/sdk:globalContext");function ie(){let e=globalThis;return e[K]||(e[K]={context:{}}),e[K]}function ae(e){ie().context=e,m("Global context updated",e);}function I(){return ie().context}function A(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=I(),r=g(),s=x(),a=D(),u={provider:e.provider,model:e.model,input:B(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:s,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 O(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),s}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(),s=D(),a={provider:e.provider,model:e.model,input:B(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}:{},...s?{_telemetry:s}:{}},tags:n.tags};O(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 L(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=I(),r=g(),s=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:B(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:s??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 se=1e5,Re=["api_key","apikey","password","secret","authorization"],De=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ae=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function qe(e){let t=e.toLowerCase();return Ae.includes(t)?false:!!(Re.some(n=>t.includes(n))||De.some(n=>t.includes(n)))}function B(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>se?e.slice(0,se)+"...[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,s]of Object.entries(e))qe(r)?n[r]="[REDACTED]":n[r]=_(s,t+1);return n}return String(e)}var J=Symbol.for("@lelemondev/sdk:traceStorage");function Oe(){let e=globalThis;return e[J]||(e[J]=new async_hooks.AsyncLocalStorage),e[J]}var ue=Oe();function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ue.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 $e(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Pe(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function Ne(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),s=r?.traceId??x(),a=x(),u={traceId:s,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 ue.run(u,async()=>{let c,d;try{return c=await t(),c}catch(o){throw d=o instanceof Error?o:new Error(String(o)),o}finally{Ke(u,d?void 0:c,d);}})}function Ke(e,t,n){let r=w();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let s=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:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Le(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=$e(e.toolCallId);L({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&&Pe(e.toolCallId);}var T="anthropic";function ce(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 de(e){return async function(...n){let r=Date.now(),s=n[0]||{},a=s.stream===true;try{let u=await e(...n);if(a&&Be(u))return Ue(u,s,r);let c=Date.now()-r,d=u,o=A({provider:T,model:s.model||d.model||"unknown",input:{system:s.system,messages:s.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(o&&d.content){let l=U(d.content);l.length>0&&q(l,o);}return u}catch(u){let c=Date.now()-r;throw C({provider:T,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function le(e){return function(...n){let r=Date.now(),s=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Je(a,s,r):a}catch(a){let u=Date.now()-r;throw C({provider:T,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Be(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Je(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let s={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,o=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(s.model=i.message.model,s.id=i.message.id,s.role=i.message.role,i.message.usage&&(s.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??o.length,o[d]={...i.content_block},i.content_block.type==="text"&&(o[d].text=""),i.content_block.type==="thinking"&&(o[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=o[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=o[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&&(s.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(s.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;C({provider:T,model:s.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;s.content=o.filter(Boolean);let p=A({provider:T,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:s,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&s.content){let b=U(s.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*Ue(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=null,a,u=false,c=null,d=[];try{for await(let o of e){if(o.type==="message_start"&&o.message&&(r.model=o.message.model,r.id=o.message.id,r.role=o.message.role,o.message.usage&&(r.usage={...o.message.usage})),o.type==="content_block_start"&&o.content_block&&(c=o.index??d.length,d[c]={...o.content_block},o.content_block.type==="text"&&(d[c].text=""),o.content_block.type==="thinking"&&(d[c].thinking="")),o.type==="content_block_delta"&&o.delta&&c!==null){let l=d[c];l&&(o.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+o.delta.text:l.type==="text"&&(l.text=(l.text||"")+o.delta.text)),o.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+o.delta.partial_json));}if(o.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;}o.type==="message_delta"&&(o.usage?.output_tokens&&(r.usage.output_tokens=o.usage.output_tokens),o.delta?.stop_reason&&(r.stop_reason=o.delta.stop_reason)),yield o;}}catch(o){throw s=o instanceof Error?o:new Error(String(o)),o}finally{let o=Date.now()-n;if(r.content=d.filter(Boolean),s)C({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:s,durationMs:o,streaming:true});else {let l=A({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:o,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=U(r.content);i.length>0&&q(i,l);}}}}function U(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function Et(e,t){return t&&ae(t),re().disabled?(m("Tracing disabled, returning unwrapped client"),e):ce(e)?(V("anthropic"),Fe(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Fe(e){let t=e;return new Proxy(t,{get(n,r,s){let a=Reflect.get(n,r,s);return r==="messages"&&a&&typeof a=="object"?Ge(a):a}})}function Ge(e){return new Proxy(e,{get(t,n,r){let s=Reflect.get(t,n,r);return n==="create"&&typeof s=="function"?de(s.bind(t)):n==="stream"&&typeof s=="function"?le(s.bind(t)):s}})}
3
- exports.captureSpan=L;exports.flush=Ee;exports.getTraceContext=g;exports.init=Ie;exports.isEnabled=Ce;exports.observe=Et;exports.span=Le;exports.trace=Ne;//# sourceMappingURL=anthropic.js.map
2
+ var ge=Object.defineProperty;var me=(e,t,n)=>t in e?ge(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var F=(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 ye=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var I=(e,t,n)=>me(e,typeof t!="symbol"?t+"":t,n);var ee=ye((it,Te)=>{Te.exports={name:"@lelemondev/sdk",version:"0.9.8",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 G=false;function V(e){G=e;}function y(){return G?true:be("LELEMON_DEBUG")==="true"}var g="[Lelemon]";function f(e,t){y()&&P("debug",e,t);}function q(e,t){y()&&P("info",e,t);}function C(e,t){P("warn",e,t);}function $(e,t,n,r){y()&&console.log(`${g} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${g} Failed to capture trace: provider=${e} error=${t.message}`);}function H(e){y()&&console.log(`${g} Wrapped client: provider=${e}`);}function W(e,t){y()&&console.log(`${g} Sending batch: count=${e} endpoint=${t}`);}function Y(e,t){y()&&console.log(`${g} Batch sent successfully: count=${e} duration=${t}ms`);}function X(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${g} Batch send failed: count=${e} error=${n}`);}function Z(e,t,n){y()&&console.log(`${g} Request: ${e} ${t} (${n} bytes)`);}function Q(e,t){y()&&console.log(`${g} 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(`${g} ${t}`,n):r(`${g} ${t}`);}function be(e){if(typeof process<"u"&&process.env)return process.env[e]}var he=10,ke=1e3,we=1e4,R=class{constructor(t){I(this,"config");I(this,"queue",[]);I(this,"flushPromise",null);I(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??he,flushIntervalMs:t.flushIntervalMs??ke,requestTimeoutMs:t.requestTimeoutMs??we};}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();W(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),Y(t.length,Date.now()-n);}catch(r){X(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;Z(t,s,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Q(o.status,Date.now()-d),!o.ok){let i=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${i}`)}let l=await o.text();return l?JSON.parse(l):{}}catch(o){throw clearTimeout(c),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var ve="@lelemondev/sdk",xe="nodejs";function Ie(){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 Se(){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 _e(){try{if(typeof F<"u")return ee().version??"unknown"}catch{}return "unknown"}var v=null;function ne(e){if(!v){let n=Ie(),r=Se();v={"telemetry.sdk.name":ve,"telemetry.sdk.version":_e(),"telemetry.sdk.language":xe},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,K=null,re="https://api.lelemon.dev";function Ce(e={}){N=e,e.debug&&V(true),K=ne(e.service),q("Initializing SDK",{endpoint:e.endpoint??re,debug:e.debug??false,disabled:e.disabled??false,telemetry:K}),k=se(e),k.isEnabled()?q("SDK initialized - tracing enabled"):f("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function A(){return N}function D(){return K}function Me(){return w().isEnabled()}function w(){return k||(k=se(N)),k}async function Re(){k&&await k.flush();}function se(e){let t=e.apiKey??Ae("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 R({apiKey:t??"",endpoint:e.endpoint??re,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ae(e){if(typeof process<"u"&&process.env)return process.env[e]}var L=Symbol.for("@lelemondev/sdk:globalContext");function ae(){let e=globalThis;return e[L]||(e[L]={context:{}}),e[L]}function ue(e){ae().context=e,f("Global context updated",e);}function _(){return ae().context}function j(e){try{let t=w();if(!t.isEnabled()){f("Transport disabled, skipping trace capture");return}let n=_(),r=m(),s=x(),a=D(),u={provider:e.provider,model:e.model,input:B(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:s,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),s}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));return}}function E(e){try{let t=w();if(!t.isEnabled()){f("Transport disabled, skipping error capture");return}let n=_(),r=m(),s=D(),a={provider:e.provider,model:e.model,input:B(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:x(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...s?{_telemetry:s}:{}},tags:n.tags};$(e.provider,e.model,e.durationMs,"error"),f("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 U(e){try{let t=w();if(!t.isEnabled()){f("Transport disabled, skipping span capture");return}let n=_(),r=m(),s=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:B(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:s??r?.traceId,spanId:x(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};f(`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 oe=1e5,De=["api_key","apikey","password","secret","authorization"],je=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Oe=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],ie={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ce(){return A().redaction??{}}function qe(e){let t=e.toLowerCase();return Oe.includes(t)?false:!!(De.some(r=>t.includes(r))||je.some(r=>t.includes(r))||(ce().keys??[]).some(r=>t.includes(r.toLowerCase())))}function $e(e){let t=ce(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(ie.emails,"[EMAIL]")),t.phones&&(n=n.replace(ie.phones,"[PHONE]")),n}function B(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"){let n=$e(e);return n.length>oe&&(n=n.slice(0,oe)+"...[truncated]"),n}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,s]of Object.entries(e))qe(r)?n[r]="[REDACTED]":n[r]=S(s,t+1);return n}return String(e)}var J=Symbol.for("@lelemondev/sdk:traceStorage");function Ke(){let e=globalThis;return e[J]||(e[J]=new async_hooks.AsyncLocalStorage),e[J]}var de=Ke();function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return de.getStore()}function O(e,t){let n=m();if(n)for(let r of e)n.pendingToolCalls.set(r,t),f(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ne(e){let t=m();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Le(e){let t=m();t&&t.pendingToolCalls.delete(e);}async function Ue(e,t){let n=typeof e=="string"?{name:e}:e,r=m(),s=r?.traceId??x(),a=x(),u={traceId:s,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,outputKey:n.outputKey,outputTransform:n.outputTransform,sessionId:n.sessionId,userId:n.userId,pendingToolCalls:new Map};return de.run(u,async()=>{let c,d;try{return c=await t(),c}catch(o){throw d=o instanceof Error?o:new Error(String(o)),o}finally{ze(u,d?void 0:c,d);}})}var Be=["text","content","message","output","response","result","answer"];function Je(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let s=e;return t in s?s[t]:e}if(e==null||typeof e!="object"||Array.isArray(e))return e;let r=e;for(let s of Be)if(s in r&&typeof r[s]=="string")return r[s];return e}function ze(e,t,n){let r=w();if(!r.isEnabled()){f("Transport disabled, skipping root span");return}let s=_(),a=Date.now()-e.startTime,u=n?null:Je(t,e.outputKey,e.outputTransform),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:e.sessionId??s.sessionId,userId:e.userId??s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};f(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Fe(e){let t=m();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ne(e.toolCallId);U({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&&Le(e.toolCallId);}var T="anthropic";function le(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 pe(e){return async function(...n){let r=Date.now(),s=n[0]||{},a=s.stream===true;try{let u=await e(...n);if(a&&Ge(u))return He(u,s,r);let c=Date.now()-r,d=u,o=j({provider:T,model:s.model||d.model||"unknown",input:{system:s.system,messages:s.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(o&&d.content){let l=z(d.content);l.length>0&&O(l,o);}return u}catch(u){let c=Date.now()-r;throw E({provider:T,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function fe(e){return function(...n){let r=Date.now(),s=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ve(a,s,r):a}catch(a){let u=Date.now()-r;throw E({provider:T,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Ge(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ve(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let s={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,o=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(s.model=i.message.model,s.id=i.message.id,s.role=i.message.role,i.message.usage&&(s.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??o.length,o[d]={...i.content_block},i.content_block.type==="text"&&(o[d].text=""),i.content_block.type==="thinking"&&(o[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=o[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=o[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&&(s.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(s.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;E({provider:T,model:s.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;s.content=o.filter(Boolean);let p=j({provider:T,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:s,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&s.content){let b=z(s.content);b.length>0&&O(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*He(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=null,a,u=false,c=null,d=[];try{for await(let o of e){if(o.type==="message_start"&&o.message&&(r.model=o.message.model,r.id=o.message.id,r.role=o.message.role,o.message.usage&&(r.usage={...o.message.usage})),o.type==="content_block_start"&&o.content_block&&(c=o.index??d.length,d[c]={...o.content_block},o.content_block.type==="text"&&(d[c].text=""),o.content_block.type==="thinking"&&(d[c].thinking="")),o.type==="content_block_delta"&&o.delta&&c!==null){let l=d[c];l&&(o.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+o.delta.text:l.type==="text"&&(l.text=(l.text||"")+o.delta.text)),o.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+o.delta.partial_json));}if(o.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;}o.type==="message_delta"&&(o.usage?.output_tokens&&(r.usage.output_tokens=o.usage.output_tokens),o.delta?.stop_reason&&(r.stop_reason=o.delta.stop_reason)),yield o;}}catch(o){throw s=o instanceof Error?o:new Error(String(o)),o}finally{let o=Date.now()-n;if(r.content=d.filter(Boolean),s)E({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:s,durationMs:o,streaming:true});else {let l=j({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:o,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=z(r.content);i.length>0&&O(i,l);}}}}function z(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function jt(e,t){return t&&ue(t),A().disabled?(f("Tracing disabled, returning unwrapped client"),e):le(e)?(H("anthropic"),Ye(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Ye(e){let t=e;return new Proxy(t,{get(n,r,s){let a=Reflect.get(n,r,s);return r==="messages"&&a&&typeof a=="object"?Xe(a):a}})}function Xe(e){return new Proxy(e,{get(t,n,r){let s=Reflect.get(t,n,r);return n==="create"&&typeof s=="function"?pe(s.bind(t)):n==="stream"&&typeof s=="function"?fe(s.bind(t)):s}})}
3
+ exports.captureSpan=U;exports.flush=Re;exports.getTraceContext=m;exports.init=Ce;exports.isEnabled=Me;exports.observe=jt;exports.span=Fe;exports.trace=Ue;//# 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 le=Object.defineProperty;var pe=(e,t,n)=>t in e?le(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var U=(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 me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>pe(e,typeof t!="symbol"?t+"":t,n);var Q=me((Qe,he)=>{he.exports={name:"@lelemondev/sdk",version:"0.9.6",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 z=false;function F(e){z=e;}function y(){return z?true:fe("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&O("debug",e,t);}function q(e,t){y()&&O("info",e,t);}function C(e,t){O("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 E(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function G(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function H(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function W(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function Y(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function O(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 fe(e){if(typeof process<"u"&&process.env)return process.env[e]}var ge=10,ye=1e3,be=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??ge,flushIntervalMs:t.flushIntervalMs??ye,requestTimeoutMs:t.requestTimeoutMs??be};}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}),H(t.length,Date.now()-n);}catch(r){W(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;Y(t,s,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),X(o.status,Date.now()-d),!o.ok){let i=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${i}`)}let l=await o.text();return l?JSON.parse(l):{}}catch(o){throw clearTimeout(c),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var ke="@lelemondev/sdk",we="nodejs";function Te(){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 ve(){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 xe(){try{if(typeof U<"u")return Q().version??"unknown"}catch{}return "unknown"}var T=null;function ee(e){if(!T){let n=Te(),r=ve();T={"telemetry.sdk.name":ke,"telemetry.sdk.version":xe(),"telemetry.sdk.language":we},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 P={},h=null,$=null,te="https://api.lelemon.dev";function _e(e={}){P=e,e.debug&&F(true),$=ee(e.service),q("Initializing SDK",{endpoint:e.endpoint??te,debug:e.debug??false,disabled:e.disabled??false,telemetry:$}),h=re(e),h.isEnabled()?q("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ne(){return P}function R(){return $}function Ie(){return k().isEnabled()}function k(){return h||(h=re(P)),h}async function Ce(){h&&await h.flush();}function re(e){let t=e.apiKey??Ee("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??te,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ee(e){if(typeof process<"u"&&process.env)return process.env[e]}var N=Symbol.for("@lelemondev/sdk:globalContext");function se(){let e=globalThis;return e[N]||(e[N]={context:{}}),e[N]}function ie(e){se().context=e,m("Global context updated",e);}function _(){return se().context}function D(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=_(),r=g(),s=v(),a=R(),u={provider:e.provider,model:e.model,input:L(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:s,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),s}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(),s=R(),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:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...s?{_telemetry:s}:{}},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){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=_(),r=g(),s=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:L(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:s??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 oe=1e5,Me=["api_key","apikey","password","secret","authorization"],Re=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],De=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Ae(e){let t=e.toLowerCase();return De.includes(t)?false:!!(Me.some(n=>t.includes(n))||Re.some(n=>t.includes(n)))}function L(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>oe?e.slice(0,oe)+"...[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,s]of Object.entries(e))Ae(r)?n[r]="[REDACTED]":n[r]=S(s,t+1);return n}return String(e)}var B=Symbol.for("@lelemondev/sdk:traceStorage");function je(){let e=globalThis;return e[B]||(e[B]=new AsyncLocalStorage),e[B]}var ae=je();function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ae.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 Oe(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 Pe(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),s=r?.traceId??v(),a=v(),u={traceId:s,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 ae.run(u,async()=>{let c,d;try{return c=await t(),c}catch(o){throw d=o instanceof Error?o:new Error(String(o)),o}finally{Ne(u,d?void 0:c,d);}})}function Ne(e,t,n){let r=k();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let s=_(),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:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Ke(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=Oe(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 w="anthropic";function ue(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 ce(e){return async function(...n){let r=Date.now(),s=n[0]||{},a=s.stream===true;try{let u=await e(...n);if(a&&Le(u))return Je(u,s,r);let c=Date.now()-r,d=u,o=D({provider:w,model:s.model||d.model||"unknown",input:{system:s.system,messages:s.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(o&&d.content){let l=J(d.content);l.length>0&&A(l,o);}return u}catch(u){let c=Date.now()-r;throw I({provider:w,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function de(e){return function(...n){let r=Date.now(),s=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Be(a,s,r):a}catch(a){let u=Date.now()-r;throw I({provider:w,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Le(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Be(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let s={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,o=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(s.model=i.message.model,s.id=i.message.id,s.role=i.message.role,i.message.usage&&(s.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??o.length,o[d]={...i.content_block},i.content_block.type==="text"&&(o[d].text=""),i.content_block.type==="thinking"&&(o[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=o[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=o[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&&(s.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(s.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;I({provider:w,model:s.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;s.content=o.filter(Boolean);let p=D({provider:w,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:s,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&s.content){let b=J(s.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*Je(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=null,a,u=false,c=null,d=[];try{for await(let o of e){if(o.type==="message_start"&&o.message&&(r.model=o.message.model,r.id=o.message.id,r.role=o.message.role,o.message.usage&&(r.usage={...o.message.usage})),o.type==="content_block_start"&&o.content_block&&(c=o.index??d.length,d[c]={...o.content_block},o.content_block.type==="text"&&(d[c].text=""),o.content_block.type==="thinking"&&(d[c].thinking="")),o.type==="content_block_delta"&&o.delta&&c!==null){let l=d[c];l&&(o.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+o.delta.text:l.type==="text"&&(l.text=(l.text||"")+o.delta.text)),o.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+o.delta.partial_json));}if(o.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;}o.type==="message_delta"&&(o.usage?.output_tokens&&(r.usage.output_tokens=o.usage.output_tokens),o.delta?.stop_reason&&(r.stop_reason=o.delta.stop_reason)),yield o;}}catch(o){throw s=o instanceof Error?o:new Error(String(o)),o}finally{let o=Date.now()-n;if(r.content=d.filter(Boolean),s)I({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:s,durationMs:o,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:o,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=J(r.content);i.length>0&&A(i,l);}}}}function J(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function wt(e,t){return t&&ie(t),ne().disabled?(m("Tracing disabled, returning unwrapped client"),e):ue(e)?(G("anthropic"),ze(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function ze(e){let t=e;return new Proxy(t,{get(n,r,s){let a=Reflect.get(n,r,s);return r==="messages"&&a&&typeof a=="object"?Fe(a):a}})}function Fe(e){return new Proxy(e,{get(t,n,r){let s=Reflect.get(t,n,r);return n==="create"&&typeof s=="function"?ce(s.bind(t)):n==="stream"&&typeof s=="function"?de(s.bind(t)):s}})}
3
- export{K as captureSpan,Ce as flush,g as getTraceContext,_e as init,Ie as isEnabled,wt as observe,Ke as span,Pe as trace};//# sourceMappingURL=anthropic.mjs.map
2
+ var fe=Object.defineProperty;var ge=(e,t,n)=>t in e?fe(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var z=(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 me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>ge(e,typeof t!="symbol"?t+"":t,n);var Q=me((rt,we)=>{we.exports={name:"@lelemondev/sdk",version:"0.9.8",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 F=false;function G(e){F=e;}function y(){return F?true:ye("LELEMON_DEBUG")==="true"}var g="[Lelemon]";function f(e,t){y()&&$("debug",e,t);}function O(e,t){y()&&$("info",e,t);}function E(e,t){$("warn",e,t);}function q(e,t,n,r){y()&&console.log(`${g} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function C(e,t){console.error(`${g} Failed to capture trace: provider=${e} error=${t.message}`);}function V(e){y()&&console.log(`${g} Wrapped client: provider=${e}`);}function H(e,t){y()&&console.log(`${g} Sending batch: count=${e} endpoint=${t}`);}function W(e,t){y()&&console.log(`${g} Batch sent successfully: count=${e} duration=${t}ms`);}function Y(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${g} Batch send failed: count=${e} error=${n}`);}function X(e,t,n){y()&&console.log(`${g} Request: ${e} ${t} (${n} bytes)`);}function Z(e,t){y()&&console.log(`${g} Response: status=${e} duration=${t}ms`);}function $(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${g} ${t}`,n):r(`${g} ${t}`);}function ye(e){if(typeof process<"u"&&process.env)return process.env[e]}var be=10,he=1e3,ke=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??be,flushIntervalMs:t.flushIntervalMs??he,requestTimeoutMs:t.requestTimeoutMs??ke};}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();H(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),W(t.length,Date.now()-n);}catch(r){Y(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;X(t,s,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Z(o.status,Date.now()-d),!o.ok){let i=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${i}`)}let l=await o.text();return l?JSON.parse(l):{}}catch(o){throw clearTimeout(c),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var Te="@lelemondev/sdk",ve="nodejs";function xe(){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 Ie(){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 Se(){try{if(typeof z<"u")return Q().version??"unknown"}catch{}return "unknown"}var T=null;function te(e){if(!T){let n=xe(),r=Ie();T={"telemetry.sdk.name":Te,"telemetry.sdk.version":Se(),"telemetry.sdk.language":ve},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 K={},h=null,P=null,ne="https://api.lelemon.dev";function Ee(e={}){K=e,e.debug&&G(true),P=te(e.service),O("Initializing SDK",{endpoint:e.endpoint??ne,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),h=re(e),h.isEnabled()?O("SDK initialized - tracing enabled"):f("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function R(){return K}function A(){return P}function Ce(){return k().isEnabled()}function k(){return h||(h=re(K)),h}async function Me(){h&&await h.flush();}function re(e){let t=e.apiKey??Re("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 M({apiKey:t??"",endpoint:e.endpoint??ne,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Re(e){if(typeof process<"u"&&process.env)return process.env[e]}var N=Symbol.for("@lelemondev/sdk:globalContext");function ie(){let e=globalThis;return e[N]||(e[N]={context:{}}),e[N]}function ae(e){ie().context=e,f("Global context updated",e);}function S(){return ie().context}function D(e){try{let t=k();if(!t.isEnabled()){f("Transport disabled, skipping trace capture");return}let n=S(),r=m(),s=v(),a=A(),u={provider:e.provider,model:e.model,input:U(e.input),rawResponse:e.rawResponse?I(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:s,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 q(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),s}catch(t){C(e.provider,t instanceof Error?t:new Error(String(t)));return}}function _(e){try{let t=k();if(!t.isEnabled()){f("Transport disabled, skipping error capture");return}let n=S(),r=m(),s=A(),a={provider:e.provider,model:e.model,input:U(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...s?{_telemetry:s}:{}},tags:n.tags};q(e.provider,e.model,e.durationMs,"error"),f("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){C(e.provider,t instanceof Error?t:new Error(String(t)));}}function L(e){try{let t=k();if(!t.isEnabled()){f("Transport disabled, skipping span capture");return}let n=S(),r=m(),s=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=A(),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:U(e.input),output:I(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:s??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};f(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){C("unknown",t instanceof Error?t:new Error(String(t)));}}var se=1e5,Ae=["api_key","apikey","password","secret","authorization"],De=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],je=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],oe={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ue(){return R().redaction??{}}function Oe(e){let t=e.toLowerCase();return je.includes(t)?false:!!(Ae.some(r=>t.includes(r))||De.some(r=>t.includes(r))||(ue().keys??[]).some(r=>t.includes(r.toLowerCase())))}function qe(e){let t=ue(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(oe.emails,"[EMAIL]")),t.phones&&(n=n.replace(oe.phones,"[PHONE]")),n}function U(e){return I(e,0)}function I(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=qe(e);return n.length>se&&(n=n.slice(0,se)+"...[truncated]"),n}if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>I(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))Oe(r)?n[r]="[REDACTED]":n[r]=I(s,t+1);return n}return String(e)}var B=Symbol.for("@lelemondev/sdk:traceStorage");function Pe(){let e=globalThis;return e[B]||(e[B]=new AsyncLocalStorage),e[B]}var ce=Pe();function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return ce.getStore()}function j(e,t){let n=m();if(n)for(let r of e)n.pendingToolCalls.set(r,t),f(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ke(e){let t=m();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ne(e){let t=m();t&&t.pendingToolCalls.delete(e);}async function Le(e,t){let n=typeof e=="string"?{name:e}:e,r=m(),s=r?.traceId??v(),a=v(),u={traceId:s,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,outputKey:n.outputKey,outputTransform:n.outputTransform,sessionId:n.sessionId,userId:n.userId,pendingToolCalls:new Map};return ce.run(u,async()=>{let c,d;try{return c=await t(),c}catch(o){throw d=o instanceof Error?o:new Error(String(o)),o}finally{Je(u,d?void 0:c,d);}})}var Ue=["text","content","message","output","response","result","answer"];function Be(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let s=e;return t in s?s[t]:e}if(e==null||typeof e!="object"||Array.isArray(e))return e;let r=e;for(let s of Ue)if(s in r&&typeof r[s]=="string")return r[s];return e}function Je(e,t,n){let r=k();if(!r.isEnabled()){f("Transport disabled, skipping root span");return}let s=S(),a=Date.now()-e.startTime,u=n?null:Be(t,e.outputKey,e.outputTransform),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:e.sessionId??s.sessionId,userId:e.userId??s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};f(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function ze(e){let t=m();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ke(e.toolCallId);L({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&&Ne(e.toolCallId);}var w="anthropic";function de(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 le(e){return async function(...n){let r=Date.now(),s=n[0]||{},a=s.stream===true;try{let u=await e(...n);if(a&&Fe(u))return Ve(u,s,r);let c=Date.now()-r,d=u,o=D({provider:w,model:s.model||d.model||"unknown",input:{system:s.system,messages:s.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(o&&d.content){let l=J(d.content);l.length>0&&j(l,o);}return u}catch(u){let c=Date.now()-r;throw _({provider:w,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function pe(e){return function(...n){let r=Date.now(),s=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ge(a,s,r):a}catch(a){let u=Date.now()-r;throw _({provider:w,model:s.model||"unknown",input:{system:s.system,messages:s.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Fe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ge(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let s={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,o=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(s.model=i.message.model,s.id=i.message.id,s.role=i.message.role,i.message.usage&&(s.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??o.length,o[d]={...i.content_block},i.content_block.type==="text"&&(o[d].text=""),i.content_block.type==="thinking"&&(o[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=o[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=o[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&&(s.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(s.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;_({provider:w,model:s.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;s.content=o.filter(Boolean);let p=D({provider:w,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:s,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&s.content){let b=J(s.content);b.length>0&&j(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Ve(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=null,a,u=false,c=null,d=[];try{for await(let o of e){if(o.type==="message_start"&&o.message&&(r.model=o.message.model,r.id=o.message.id,r.role=o.message.role,o.message.usage&&(r.usage={...o.message.usage})),o.type==="content_block_start"&&o.content_block&&(c=o.index??d.length,d[c]={...o.content_block},o.content_block.type==="text"&&(d[c].text=""),o.content_block.type==="thinking"&&(d[c].thinking="")),o.type==="content_block_delta"&&o.delta&&c!==null){let l=d[c];l&&(o.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+o.delta.text:l.type==="text"&&(l.text=(l.text||"")+o.delta.text)),o.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+o.delta.partial_json));}if(o.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;}o.type==="message_delta"&&(o.usage?.output_tokens&&(r.usage.output_tokens=o.usage.output_tokens),o.delta?.stop_reason&&(r.stop_reason=o.delta.stop_reason)),yield o;}}catch(o){throw s=o instanceof Error?o:new Error(String(o)),o}finally{let o=Date.now()-n;if(r.content=d.filter(Boolean),s)_({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:s,durationMs:o,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:o,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=J(r.content);i.length>0&&j(i,l);}}}}function J(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function St(e,t){return t&&ae(t),R().disabled?(f("Tracing disabled, returning unwrapped client"),e):de(e)?(V("anthropic"),We(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function We(e){let t=e;return new Proxy(t,{get(n,r,s){let a=Reflect.get(n,r,s);return r==="messages"&&a&&typeof a=="object"?Ye(a):a}})}function Ye(e){return new Proxy(e,{get(t,n,r){let s=Reflect.get(t,n,r);return n==="create"&&typeof s=="function"?le(s.bind(t)):n==="stream"&&typeof s=="function"?pe(s.bind(t)):s}})}
3
+ export{L as captureSpan,Me as flush,m as getTraceContext,Ee as init,Ce as isEnabled,St as observe,ze as span,Le as trace};//# sourceMappingURL=anthropic.mjs.map
4
4
  //# sourceMappingURL=anthropic.mjs.map
@@ -1,5 +1,5 @@
1
- import { O as ObserveOptions } from './capture-ChybLulj.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-ChybLulj.mjs';
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.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-CiUL-4hv.mjs';
3
3
 
4
4
  /**
5
5
  * AWS Bedrock Provider Entry Point
package/dist/bedrock.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as ObserveOptions } from './capture-ChybLulj.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-ChybLulj.js';
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.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-CiUL-4hv.js';
3
3
 
4
4
  /**
5
5
  * AWS Bedrock Provider Entry Point
package/dist/bedrock.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
2
- var pe=Object.defineProperty;var me=(e,t,n)=>t in e?pe(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var z=(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 fe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>me(e,typeof t!="symbol"?t+"":t,n);var Q=fe((st,we)=>{we.exports={name:"@lelemondev/sdk",version:"0.9.6",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 F=false;function G(e){F=e;}function k(){return F?true:ge("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function l(e,t){k()&&A("debug",e,t);}function q(e,t){k()&&A("info",e,t);}function R(e,t){A("warn",e,t);}function O(e,t,n,r){k()&&console.log(`${m} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function D(e,t){console.error(`${m} Failed to capture trace: provider=${e} error=${t.message}`);}function V(e){k()&&console.log(`${m} Wrapped client: provider=${e}`);}function J(e,t){k()&&console.log(`${m} Sending batch: count=${e} endpoint=${t}`);}function W(e,t){k()&&console.log(`${m} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${m} Batch send failed: count=${e} error=${n}`);}function Y(e,t,n){k()&&console.log(`${m} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){k()&&console.log(`${m} Response: status=${e} duration=${t}ms`);}function A(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${m} ${t}`,n):r(`${m} ${t}`);}function ge(e){if(typeof process<"u"&&process.env)return process.env[e]}var ye=10,ke=1e3,be=1e4,B=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??ye,flushIntervalMs:t.flushIntervalMs??ke,requestTimeoutMs:t.requestTimeoutMs??be};}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();J(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),W(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;Y(t,o,a?.length??0);let u=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),p=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(u),X(s.status,Date.now()-p),!s.ok){let d=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${d}`)}let c=await s.text();return c?JSON.parse(c):{}}catch(s){throw clearTimeout(u),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",Te="nodejs";function ve(){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 Ie(){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 Se(){try{if(typeof z<"u")return Q().version??"unknown"}catch{}return "unknown"}var v=null;function ee(e){if(!v){let n=ve(),r=Ie();v={"telemetry.sdk.name":he,"telemetry.sdk.version":Se(),"telemetry.sdk.language":Te},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 $={},w=null,P=null,te="https://api.lelemon.dev";function Ce(e={}){$=e,e.debug&&G(true),P=ee(e.service),q("Initializing SDK",{endpoint:e.endpoint??te,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),w=re(e),w.isEnabled()?q("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ne(){return $}function _(){return P}function Ee(){return h().isEnabled()}function h(){return w||(w=re($)),w}async function Me(){w&&await w.flush();}function re(e){let t=e.apiKey??Re("LELEMON_API_KEY");return !t&&!e.disabled&&R("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new B({apiKey:t??"",endpoint:e.endpoint??te,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Re(e){if(typeof process<"u"&&process.env)return process.env[e]}var U=Symbol.for("@lelemondev/sdk:globalContext");function se(){let e=globalThis;return e[U]||(e[U]={context:{}}),e[U]}function ie(e){se().context=e,l("Global context updated",e);}function C(){return se().context}function E(e){try{let t=h();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=C(),r=f(),o=I(),i=_(),a={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?x(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}:{},...i?{_telemetry:i}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return O(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){D(e.provider,t instanceof Error?t:new Error(String(t)));return}}function T(e){try{let t=h();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=C(),r=f(),o=_(),i={provider:e.provider,model:e.model,input:j(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:I(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};O(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){D(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=h();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=C(),r=f(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=_(),u={...n.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let p={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:j(e.input),output:x(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:I(),parentSpanId:i??r?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(p);}catch(t){D("unknown",t instanceof Error?t:new Error(String(t)));}}var oe=1e5,De=["api_key","apikey","password","secret","authorization"],Be=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],_e=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function qe(e){let t=e.toLowerCase();return _e.includes(t)?false:!!(De.some(n=>t.includes(n))||Be.some(n=>t.includes(n)))}function j(e){return x(e,0)}function x(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>oe?e.slice(0,oe)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>x(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))qe(r)?n[r]="[REDACTED]":n[r]=x(o,t+1);return n}return String(e)}var K=Symbol.for("@lelemondev/sdk:traceStorage");function Ae(){let e=globalThis;return e[K]||(e[K]=new async_hooks.AsyncLocalStorage),e[K]}var ae=Ae();function I(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return ae.getStore()}function L(e,t){let n=f();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Pe(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function $e(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function Ue(e,t){let n=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??I(),i=I(),a={traceId:o,rootSpanId:i,currentSpanId:i,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return ae.run(a,async()=>{let u,p;try{return u=await t(),u}catch(s){throw p=s instanceof Error?s:new Error(String(s)),s}finally{Ne(a,p?void 0:u,p);}})}function Ne(e,t,n){let r=h();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=C(),i=Date.now()-e.startTime,a=n?null:t,u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:i,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};l(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(u);}function je(e){let t=f();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Pe(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&&$e(e.toolCallId);}var g="bedrock";function ue(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let n=e;return typeof n.send!="function"||!n.config||typeof n.config!="object"?false:"region"in n.config}function de(e){let t=e;return new Proxy(t,{get(n,r,o){let i=Reflect.get(n,r,o);return r==="send"&&typeof i=="function"?Ke(i.bind(n)):i}})}function Ke(e){return async function(n){switch(n.constructor?.name||""){case "ConverseCommand":return Le(e,n);case "ConverseStreamCommand":return ze(e,n);case "InvokeModelCommand":return Ge(e,n);case "InvokeModelWithResponseStreamCommand":return Ve(e,n);default:return e(n)}}}async function Le(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=E({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},rawResponse:ce(o),durationMs:i,status:"success",streaming:!1});if(a){let u=le(o);u.length>0&&L(u,a);}return o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function ze(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.stream?{...o,stream:Fe(o.stream,r,n)}:o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*Fe(e,t,n){let r={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},o=null,i,a=false,u=new Map,p=new Map;try{for await(let s of e){if(s.contentBlockStart){let c=s.contentBlockStart.contentBlockIndex;if(s.contentBlockStart.start?.toolUse){let d=s.contentBlockStart.start.toolUse;u.set(c,{toolUse:{toolUseId:d.toolUseId,name:d.name,input:{}}}),p.set(c,"");}else u.set(c,{text:""});}if(s.contentBlockDelta){let c=s.contentBlockDelta.contentBlockIndex,d=u.get(c);if(d&&s.contentBlockDelta.delta?.text&&(a||(a=!0,i=Date.now()-n),d.text=(d.text||"")+s.contentBlockDelta.delta.text),d?.toolUse&&s.contentBlockDelta.delta?.toolUse?.input){let y=p.get(c)||"";p.set(c,y+s.contentBlockDelta.delta.toolUse.input);}}if(s.contentBlockStop){let c=s.contentBlockStop.contentBlockIndex,d=u.get(c),y=p.get(c);if(d?.toolUse&&y)try{d.toolUse.input=JSON.parse(y);}catch{}}s.messageStop?.stopReason&&(r.stopReason=s.messageStop.stopReason),s.metadata?.usage&&(r.usage={inputTokens:s.metadata.usage.inputTokens||0,outputTokens:s.metadata.usage.outputTokens||0}),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n,c=Array.from(u.entries()).sort((d,y)=>d[0]-y[0]).map(([,d])=>d);if(r.output.message.content=c,o)T({provider:g,model:t.modelId||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let d=E({provider:g,model:t.modelId||"unknown",input:{system:t.system,messages:t.messages},rawResponse:ce(r),durationMs:s,status:"success",streaming:true,firstTokenMs:i});if(d){let y=le(r);y.length>0&&L(y,d);}}}}async function Ge(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=We(o.body);return E({provider:g,model:r.modelId||"unknown",input:M(r.body),rawResponse:a,durationMs:i,status:"success",streaming:!1}),o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:M(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Ve(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.body?{...o,body:Je(o.body,r,n)}:o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:M(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*Je(e,t,n){let r=[],o=null;try{for await(let i of e){if(i.chunk?.bytes){let a=He(i.chunk.bytes);a&&r.push(a);}yield i;}}catch(i){throw o=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-n;o?T({provider:g,model:t.modelId||"unknown",input:M(t.body),error:o,durationMs:i,streaming:true}):E({provider:g,model:t.modelId||"unknown",input:M(t.body),rawResponse:{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function ce(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function le(e){let t=[],n=e.output?.message?.content;if(Array.isArray(n))for(let r of n)r.toolUse?.toolUseId&&t.push(r.toolUse.toolUseId);return t}function M(e){try{let t=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(t)}catch{return e}}function We(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function He(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function _t(e,t){return t&&ie(t),ne().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(V("bedrock"),de(e)):(R("Client is not a Bedrock client. Use @lelemondev/sdk/bedrock only with AWS Bedrock SDK."),e)}
3
- exports.captureSpan=N;exports.flush=Me;exports.getTraceContext=f;exports.init=Ce;exports.isEnabled=Ee;exports.observe=_t;exports.span=je;exports.trace=Ue;//# sourceMappingURL=bedrock.js.map
2
+ var fe=Object.defineProperty;var ge=(e,t,n)=>t in e?fe(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var F=(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 ye=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>ge(e,typeof t!="symbol"?t+"":t,n);var Q=ye((ct,he)=>{he.exports={name:"@lelemondev/sdk",version:"0.9.8",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 G=false;function V(e){G=e;}function k(){return G?true:ke("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function l(e,t){k()&&P("debug",e,t);}function O(e,t){k()&&P("info",e,t);}function M(e,t){P("warn",e,t);}function q(e,t,n,r){k()&&console.log(`${m} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function D(e,t){console.error(`${m} Failed to capture trace: provider=${e} error=${t.message}`);}function J(e){k()&&console.log(`${m} Wrapped client: provider=${e}`);}function W(e,t){k()&&console.log(`${m} Sending batch: count=${e} endpoint=${t}`);}function H(e,t){k()&&console.log(`${m} Batch sent successfully: count=${e} duration=${t}ms`);}function Y(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${m} Batch send failed: count=${e} error=${n}`);}function X(e,t,n){k()&&console.log(`${m} Request: ${e} ${t} (${n} bytes)`);}function Z(e,t){k()&&console.log(`${m} 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(`${m} ${t}`,n):r(`${m} ${t}`);}function ke(e){if(typeof process<"u"&&process.env)return process.env[e]}var be=10,we=1e3,Te=1e4,_=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??be,flushIntervalMs:t.flushIntervalMs??we,requestTimeoutMs:t.requestTimeoutMs??Te};}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();W(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),H(t.length,Date.now()-n);}catch(r){Y(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;X(t,o,a?.length??0);let u=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),p=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(u),Z(s.status,Date.now()-p),!s.ok){let d=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${d}`)}let c=await s.text();return c?JSON.parse(c):{}}catch(s){throw clearTimeout(u),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var ve="@lelemondev/sdk",Ie="nodejs";function Se(){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 xe(){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 Ce(){try{if(typeof F<"u")return Q().version??"unknown"}catch{}return "unknown"}var v=null;function te(e){if(!v){let n=Se(),r=xe();v={"telemetry.sdk.name":ve,"telemetry.sdk.version":Ce(),"telemetry.sdk.language":Ie},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 $={},w=null,U=null,ne="https://api.lelemon.dev";function Re(e={}){$=e,e.debug&&V(true),U=te(e.service),O("Initializing SDK",{endpoint:e.endpoint??ne,debug:e.debug??false,disabled:e.disabled??false,telemetry:U}),w=re(e),w.isEnabled()?O("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function A(){return $}function B(){return U}function Me(){return T().isEnabled()}function T(){return w||(w=re($)),w}async function De(){w&&await w.flush();}function re(e){let t=e.apiKey??_e("LELEMON_API_KEY");return !t&&!e.disabled&&M("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new _({apiKey:t??"",endpoint:e.endpoint??ne,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function _e(e){if(typeof process<"u"&&process.env)return process.env[e]}var j=Symbol.for("@lelemondev/sdk:globalContext");function ie(){let e=globalThis;return e[j]||(e[j]={context:{}}),e[j]}function ae(e){ie().context=e,l("Global context updated",e);}function C(){return ie().context}function E(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=C(),r=f(),o=I(),i=B(),a={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?x(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...i?{_telemetry:i}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return q(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){D(e.provider,t instanceof Error?t:new Error(String(t)));return}}function h(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=C(),r=f(),o=B(),i={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:I(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};q(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){D(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=C(),r=f(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=B(),u={...n.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let p={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:x(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:o??r?.traceId,spanId:I(),parentSpanId:i??r?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(p);}catch(t){D("unknown",t instanceof Error?t:new Error(String(t)));}}var oe=1e5,Ae=["api_key","apikey","password","secret","authorization"],Be=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Oe=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],se={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ue(){return A().redaction??{}}function qe(e){let t=e.toLowerCase();return Oe.includes(t)?false:!!(Ae.some(r=>t.includes(r))||Be.some(r=>t.includes(r))||(ue().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Pe(e){let t=ue(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(se.emails,"[EMAIL]")),t.phones&&(n=n.replace(se.phones,"[PHONE]")),n}function K(e){return x(e,0)}function x(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=Pe(e);return n.length>oe&&(n=n.slice(0,oe)+"...[truncated]"),n}if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>x(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))qe(r)?n[r]="[REDACTED]":n[r]=x(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function $e(){let e=globalThis;return e[L]||(e[L]=new async_hooks.AsyncLocalStorage),e[L]}var de=$e();function I(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return de.getStore()}function z(e,t){let n=f();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function je(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ne(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function Ke(e,t){let n=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??I(),i=I(),a={traceId:o,rootSpanId:i,currentSpanId:i,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,outputKey:n.outputKey,outputTransform:n.outputTransform,sessionId:n.sessionId,userId:n.userId,pendingToolCalls:new Map};return de.run(a,async()=>{let u,p;try{return u=await t(),u}catch(s){throw p=s instanceof Error?s:new Error(String(s)),s}finally{Fe(a,p?void 0:u,p);}})}var Le=["text","content","message","output","response","result","answer"];function ze(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let o=e;return t in o?o[t]:e}if(e==null||typeof e!="object"||Array.isArray(e))return e;let r=e;for(let o of Le)if(o in r&&typeof r[o]=="string")return r[o];return e}function Fe(e,t,n){let r=T();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=C(),i=Date.now()-e.startTime,a=n?null:ze(t,e.outputKey,e.outputTransform),u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:i,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:e.sessionId??o.sessionId,userId:e.userId??o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};l(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(u);}function Ge(e){let t=f();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=je(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&&Ne(e.toolCallId);}var g="bedrock";function ce(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let n=e;return typeof n.send!="function"||!n.config||typeof n.config!="object"?false:"region"in n.config}function le(e){let t=e;return new Proxy(t,{get(n,r,o){let i=Reflect.get(n,r,o);return r==="send"&&typeof i=="function"?Ve(i.bind(n)):i}})}function Ve(e){return async function(n){switch(n.constructor?.name||""){case "ConverseCommand":return Je(e,n);case "ConverseStreamCommand":return We(e,n);case "InvokeModelCommand":return Ye(e,n);case "InvokeModelWithResponseStreamCommand":return Xe(e,n);default:return e(n)}}}async function Je(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=E({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},rawResponse:pe(o),durationMs:i,status:"success",streaming:!1});if(a){let u=me(o);u.length>0&&z(u,a);}return o}catch(o){throw h({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function We(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.stream?{...o,stream:He(o.stream,r,n)}:o}catch(o){throw h({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*He(e,t,n){let r={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},o=null,i,a=false,u=new Map,p=new Map;try{for await(let s of e){if(s.contentBlockStart){let c=s.contentBlockStart.contentBlockIndex;if(s.contentBlockStart.start?.toolUse){let d=s.contentBlockStart.start.toolUse;u.set(c,{toolUse:{toolUseId:d.toolUseId,name:d.name,input:{}}}),p.set(c,"");}else u.set(c,{text:""});}if(s.contentBlockDelta){let c=s.contentBlockDelta.contentBlockIndex,d=u.get(c);if(d&&s.contentBlockDelta.delta?.text&&(a||(a=!0,i=Date.now()-n),d.text=(d.text||"")+s.contentBlockDelta.delta.text),d?.toolUse&&s.contentBlockDelta.delta?.toolUse?.input){let y=p.get(c)||"";p.set(c,y+s.contentBlockDelta.delta.toolUse.input);}}if(s.contentBlockStop){let c=s.contentBlockStop.contentBlockIndex,d=u.get(c),y=p.get(c);if(d?.toolUse&&y)try{d.toolUse.input=JSON.parse(y);}catch{}}s.messageStop?.stopReason&&(r.stopReason=s.messageStop.stopReason),s.metadata?.usage&&(r.usage={inputTokens:s.metadata.usage.inputTokens||0,outputTokens:s.metadata.usage.outputTokens||0}),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n,c=Array.from(u.entries()).sort((d,y)=>d[0]-y[0]).map(([,d])=>d);if(r.output.message.content=c,o)h({provider:g,model:t.modelId||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let d=E({provider:g,model:t.modelId||"unknown",input:{system:t.system,messages:t.messages},rawResponse:pe(r),durationMs:s,status:"success",streaming:true,firstTokenMs:i});if(d){let y=me(r);y.length>0&&z(y,d);}}}}async function Ye(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=Qe(o.body);return E({provider:g,model:r.modelId||"unknown",input:R(r.body),rawResponse:a,durationMs:i,status:"success",streaming:!1}),o}catch(o){throw h({provider:g,model:r.modelId||"unknown",input:R(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Xe(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.body?{...o,body:Ze(o.body,r,n)}:o}catch(o){throw h({provider:g,model:r.modelId||"unknown",input:R(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*Ze(e,t,n){let r=[],o=null;try{for await(let i of e){if(i.chunk?.bytes){let a=et(i.chunk.bytes);a&&r.push(a);}yield i;}}catch(i){throw o=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-n;o?h({provider:g,model:t.modelId||"unknown",input:R(t.body),error:o,durationMs:i,streaming:true}):E({provider:g,model:t.modelId||"unknown",input:R(t.body),rawResponse:{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function pe(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function me(e){let t=[],n=e.output?.message?.content;if(Array.isArray(n))for(let r of n)r.toolUse?.toolUseId&&t.push(r.toolUse.toolUseId);return t}function R(e){try{let t=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(t)}catch{return e}}function Qe(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function et(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function Ut(e,t){return t&&ae(t),A().disabled?(l("Tracing disabled, returning unwrapped client"),e):ce(e)?(J("bedrock"),le(e)):(M("Client is not a Bedrock client. Use @lelemondev/sdk/bedrock only with AWS Bedrock SDK."),e)}
3
+ exports.captureSpan=N;exports.flush=De;exports.getTraceContext=f;exports.init=Re;exports.isEnabled=Me;exports.observe=Ut;exports.span=Ge;exports.trace=Ke;//# sourceMappingURL=bedrock.js.map
4
4
  //# sourceMappingURL=bedrock.js.map