@lelemondev/sdk 0.10.0 → 0.10.1

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/dist/bedrock.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- var L=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var X=pe((rt,ke)=>{ke.exports={name:"@lelemondev/sdk",version:"0.10.0",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var z=false;function F(e){z=e;}function k(){return z?true:me("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function l(e,t){k()&&O("debug",e,t);}function A(e,t){k()&&O("info",e,t);}function E(e,t){O("warn",e,t);}function B(e,t,n,r){k()&&console.log(`${m} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function R(e,t){console.error(`${m} Failed to capture trace: provider=${e} error=${t.message}`);}function G(e){k()&&console.log(`${m} Wrapped client: provider=${e}`);}function V(e,t){k()&&console.log(`${m} Sending batch: count=${e} endpoint=${t}`);}function J(e,t){k()&&console.log(`${m} Batch sent successfully: count=${e} duration=${t}ms`);}function W(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${m} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){k()&&console.log(`${m} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){k()&&console.log(`${m} 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(`${m} ${t}`,n):r(`${m} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,M=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),J(t.length,Date.now()-n);}catch(r){W(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;H(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),Y(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 be="@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 he(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof L<"u")return X().version??"unknown"}catch{}return "unknown"}var h=null;function Q(e){if(!h){let n=Te(),r=he();h={"telemetry.sdk.name":be,"telemetry.sdk.version":ve(),"telemetry.sdk.language":we},n&&(h["process.runtime.name"]=n.name,h["process.runtime.version"]=n.version),r&&(h["os.type"]=r);}let t={...h};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={},b=null,q=null,ee="https://api.lelemon.dev";function Se(e={}){P=e,e.debug&&F(true),q=Q(e.service),A("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:q}),b=te(e),b.isEnabled()?A("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function D(){return P}function _(){return q}function xe(){return w().isEnabled()}function w(){return b||(b=te(P)),b}async function Ce(){b&&await b.flush();}function te(e){let t=e.apiKey??Ee("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??ee,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 U=Symbol.for("@lelemondev/sdk:globalContext");function oe(){let e=globalThis;return e[U]||(e[U]={context:{}}),e[U]}function se(e){oe().context=e,l("Global context updated",e);}function S(){return oe().context}function x(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=S(),r=f(),o=v(),i=_(),a={provider:e.provider,model:e.model,input:j(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: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 B(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));return}}function T(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=S(),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: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}:{},...o?{_telemetry:o}:{}},tags:n.tags};B(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));}}function $(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=S(),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: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:o??r?.traceId,spanId:v(),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){R("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Re=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],De=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],re={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ie(){return D().redaction??{}}function _e(e){let t=e.toLowerCase();return De.includes(t)?false:!!(Re.some(r=>t.includes(r))||Me.some(r=>t.includes(r))||(ie().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Ae(e){let t=ie(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(re.emails,"[EMAIL]")),t.phones&&(n=n.replace(re.phones,"[PHONE]")),n}function j(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=Ae(e);return n.length>ne&&(n=n.slice(0,ne)+"...[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,o]of Object.entries(e))_e(r)?n[r]="[REDACTED]":n[r]=I(o,t+1);return n}return String(e)}var N=Symbol.for("@lelemondev/sdk:traceStorage");function Oe(){let e=globalThis;return e[N]||(e[N]=new AsyncLocalStorage),e[N]}var ae=Oe();function v(){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 K(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 qe(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Pe(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??v(),i=v(),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 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);}})}var $e=["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 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 $e)if(o in r&&typeof r[o]=="string")return r[o];return e}function Ne(e,t,n){let r=w();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=S(),i=Date.now()-e.startTime,a=n?null:je(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 Ke(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=qe(e.toolCallId);$({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 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"?Le(i.bind(n)):i}})}function Le(e){return async function(n){switch(n.constructor?.name||""){case "ConverseCommand":return ze(e,n);case "ConverseStreamCommand":return Fe(e,n);case "InvokeModelCommand":return Ve(e,n);case "InvokeModelWithResponseStreamCommand":return Je(e,n);default:return e(n)}}}async function ze(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=x({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&&K(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 Fe(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.stream?{...o,stream:Ge(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*Ge(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=x({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&&K(y,d);}}}}async function Ve(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=He(o.body);return x({provider:g,model:r.modelId||"unknown",input:C(r.body),rawResponse:a,durationMs:i,status:"success",streaming:!1}),o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:C(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Je(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.body?{...o,body:We(o.body,r,n)}:o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:C(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*We(e,t,n){let r=[],o=null;try{for await(let i of e){if(i.chunk?.bytes){let a=Ye(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:C(t.body),error:o,durationMs:i,streaming:true}):x({provider:g,model:t.modelId||"unknown",input:C(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 C(e){try{let t=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(t)}catch{return e}}function He(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function Ye(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function xt(e,t){return t&&se(t),D().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(G("bedrock"),de(e)):(E("Client is not a Bedrock client. Use @lelemondev/sdk/bedrock only with AWS Bedrock SDK."),e)}
2
+ var L=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var X=pe((rt,ke)=>{ke.exports={name:"@lelemondev/sdk",version:"0.10.1",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var z=false;function F(e){z=e;}function k(){return z?true:me("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function l(e,t){k()&&O("debug",e,t);}function A(e,t){k()&&O("info",e,t);}function E(e,t){O("warn",e,t);}function B(e,t,n,r){k()&&console.log(`${m} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function R(e,t){console.error(`${m} Failed to capture trace: provider=${e} error=${t.message}`);}function G(e){k()&&console.log(`${m} Wrapped client: provider=${e}`);}function V(e,t){k()&&console.log(`${m} Sending batch: count=${e} endpoint=${t}`);}function J(e,t){k()&&console.log(`${m} Batch sent successfully: count=${e} duration=${t}ms`);}function W(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${m} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){k()&&console.log(`${m} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){k()&&console.log(`${m} 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(`${m} ${t}`,n):r(`${m} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,M=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),J(t.length,Date.now()-n);}catch(r){W(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;H(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),Y(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 be="@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 he(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof L<"u")return X().version??"unknown"}catch{}return "unknown"}var h=null;function Q(e){if(!h){let n=Te(),r=he();h={"telemetry.sdk.name":be,"telemetry.sdk.version":ve(),"telemetry.sdk.language":we},n&&(h["process.runtime.name"]=n.name,h["process.runtime.version"]=n.version),r&&(h["os.type"]=r);}let t={...h};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={},b=null,q=null,ee="https://api.lelemon.dev";function Se(e={}){P=e,e.debug&&F(true),q=Q(e.service),A("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:q}),b=te(e),b.isEnabled()?A("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function D(){return P}function _(){return q}function xe(){return w().isEnabled()}function w(){return b||(b=te(P)),b}async function Ce(){b&&await b.flush();}function te(e){let t=e.apiKey??Ee("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??ee,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 U=Symbol.for("@lelemondev/sdk:globalContext");function oe(){let e=globalThis;return e[U]||(e[U]={context:{}}),e[U]}function se(e){oe().context=e,l("Global context updated",e);}function S(){return oe().context}function x(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=S(),r=f(),o=v(),i=_(),a={provider:e.provider,model:e.model,input:j(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: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 B(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));return}}function T(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=S(),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: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}:{},...o?{_telemetry:o}:{}},tags:n.tags};B(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));}}function $(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=S(),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: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:o??r?.traceId,spanId:v(),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){R("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Re=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],De=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],re={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ie(){return D().redaction??{}}function _e(e){let t=e.toLowerCase();return De.includes(t)?false:!!(Re.some(r=>t.includes(r))||Me.some(r=>t.includes(r))||(ie().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Ae(e){let t=ie(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(re.emails,"[EMAIL]")),t.phones&&(n=n.replace(re.phones,"[PHONE]")),n}function j(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=Ae(e);return n.length>ne&&(n=n.slice(0,ne)+"...[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,o]of Object.entries(e))_e(r)?n[r]="[REDACTED]":n[r]=I(o,t+1);return n}return String(e)}var N=Symbol.for("@lelemondev/sdk:traceStorage");function Oe(){let e=globalThis;return e[N]||(e[N]=new AsyncLocalStorage),e[N]}var ae=Oe();function v(){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 K(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 qe(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Pe(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??v(),i=v(),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,style:n.style,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);}})}var $e=["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 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 $e)if(o in r&&typeof r[o]=="string")return r[o];return e}function Ne(e,t,n){let r=w();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=S(),i=Date.now()-e.startTime,a=n?null:je(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,...e.style?{_style:e.style}:{}},tags:e.tags??o.tags};l(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(u);}function Ke(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=qe(e.toolCallId);$({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.style?{_style:e.style}:{}}}),e.toolCallId&&Pe(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"?Le(i.bind(n)):i}})}function Le(e){return async function(n){switch(n.constructor?.name||""){case "ConverseCommand":return ze(e,n);case "ConverseStreamCommand":return Fe(e,n);case "InvokeModelCommand":return Ve(e,n);case "InvokeModelWithResponseStreamCommand":return Je(e,n);default:return e(n)}}}async function ze(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=x({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&&K(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 Fe(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.stream?{...o,stream:Ge(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*Ge(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=x({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&&K(y,d);}}}}async function Ve(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=He(o.body);return x({provider:g,model:r.modelId||"unknown",input:C(r.body),rawResponse:a,durationMs:i,status:"success",streaming:!1}),o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:C(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Je(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.body?{...o,body:We(o.body,r,n)}:o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:C(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*We(e,t,n){let r=[],o=null;try{for await(let i of e){if(i.chunk?.bytes){let a=Ye(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:C(t.body),error:o,durationMs:i,streaming:true}):x({provider:g,model:t.modelId||"unknown",input:C(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 C(e){try{let t=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(t)}catch{return e}}function He(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function Ye(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function xt(e,t){return t&&se(t),D().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(G("bedrock"),de(e)):(E("Client is not a Bedrock client. Use @lelemondev/sdk/bedrock only with AWS Bedrock SDK."),e)}
3
3
  export{$ as captureSpan,Ce as flush,f as getTraceContext,Se as init,xe as isEnabled,xt as observe,Ke as span,Ue as trace};//# sourceMappingURL=bedrock.mjs.map
4
4
  //# sourceMappingURL=bedrock.mjs.map
@@ -159,9 +159,20 @@ interface TraceContext {
159
159
  sessionId?: string;
160
160
  /** User ID for filtering by user */
161
161
  userId?: string;
162
+ /** Visual styling options */
163
+ style?: StyleOptions;
162
164
  /** Map of toolCallId → llmSpanId for linking tool spans to their parent LLM */
163
165
  pendingToolCalls: Map<string, string>;
164
166
  }
167
+ /** Visual styling options for traces and spans in the Lelemon dashboard */
168
+ interface StyleOptions {
169
+ /** Hex color for the trace/span (e.g., '#22c55e') */
170
+ color?: string;
171
+ /** Emoji or icon name displayed next to the name (e.g., '🛒', '🤖', '🔍') */
172
+ icon?: string;
173
+ /** Short label shown as a badge (e.g., 'Sales', 'Support', 'RAG') */
174
+ label?: string;
175
+ }
165
176
  interface TraceOptions {
166
177
  /** Name for the trace (e.g., 'sales-agent', 'rag-query') */
167
178
  name: string;
@@ -171,6 +182,8 @@ interface TraceOptions {
171
182
  metadata?: Record<string, unknown>;
172
183
  /** Tags for filtering */
173
184
  tags?: string[];
185
+ /** Visual styling in the dashboard */
186
+ style?: StyleOptions;
174
187
  /**
175
188
  * Key to extract from result object for cleaner output display.
176
189
  * If not specified, auto-detection tries: text, content, message, output, response, result, answer.
@@ -233,6 +246,8 @@ interface SpanOptions {
233
246
  toolCallId?: string;
234
247
  /** Custom metadata */
235
248
  metadata?: Record<string, unknown>;
249
+ /** Visual styling in the dashboard */
250
+ style?: StyleOptions;
236
251
  }
237
252
  /**
238
253
  * Get the current trace context, if any
@@ -334,4 +349,4 @@ declare function span(options: SpanOptions): void;
334
349
  */
335
350
  declare function captureSpan(options: CaptureSpanOptions): void;
336
351
 
337
- export { type CaptureSpanOptions as C, type LelemonConfig as L, type ObserveOptions as O, type ProviderName as P, type ServiceConfig as S, type TraceContext as T, isEnabled as a, type SDKTelemetry as b, captureSpan as c, type SpanType as d, type TraceOptions as e, flush as f, getTraceContext as g, type SpanOptions as h, init as i, span as s, trace as t };
352
+ export { type CaptureSpanOptions as C, type LelemonConfig as L, type ObserveOptions as O, type ProviderName as P, type ServiceConfig as S, type TraceContext as T, isEnabled as a, type SDKTelemetry as b, captureSpan as c, type SpanType as d, type TraceOptions as e, flush as f, getTraceContext as g, type SpanOptions as h, init as i, type StyleOptions as j, span as s, trace as t };
@@ -159,9 +159,20 @@ interface TraceContext {
159
159
  sessionId?: string;
160
160
  /** User ID for filtering by user */
161
161
  userId?: string;
162
+ /** Visual styling options */
163
+ style?: StyleOptions;
162
164
  /** Map of toolCallId → llmSpanId for linking tool spans to their parent LLM */
163
165
  pendingToolCalls: Map<string, string>;
164
166
  }
167
+ /** Visual styling options for traces and spans in the Lelemon dashboard */
168
+ interface StyleOptions {
169
+ /** Hex color for the trace/span (e.g., '#22c55e') */
170
+ color?: string;
171
+ /** Emoji or icon name displayed next to the name (e.g., '🛒', '🤖', '🔍') */
172
+ icon?: string;
173
+ /** Short label shown as a badge (e.g., 'Sales', 'Support', 'RAG') */
174
+ label?: string;
175
+ }
165
176
  interface TraceOptions {
166
177
  /** Name for the trace (e.g., 'sales-agent', 'rag-query') */
167
178
  name: string;
@@ -171,6 +182,8 @@ interface TraceOptions {
171
182
  metadata?: Record<string, unknown>;
172
183
  /** Tags for filtering */
173
184
  tags?: string[];
185
+ /** Visual styling in the dashboard */
186
+ style?: StyleOptions;
174
187
  /**
175
188
  * Key to extract from result object for cleaner output display.
176
189
  * If not specified, auto-detection tries: text, content, message, output, response, result, answer.
@@ -233,6 +246,8 @@ interface SpanOptions {
233
246
  toolCallId?: string;
234
247
  /** Custom metadata */
235
248
  metadata?: Record<string, unknown>;
249
+ /** Visual styling in the dashboard */
250
+ style?: StyleOptions;
236
251
  }
237
252
  /**
238
253
  * Get the current trace context, if any
@@ -334,4 +349,4 @@ declare function span(options: SpanOptions): void;
334
349
  */
335
350
  declare function captureSpan(options: CaptureSpanOptions): void;
336
351
 
337
- export { type CaptureSpanOptions as C, type LelemonConfig as L, type ObserveOptions as O, type ProviderName as P, type ServiceConfig as S, type TraceContext as T, isEnabled as a, type SDKTelemetry as b, captureSpan as c, type SpanType as d, type TraceOptions as e, flush as f, getTraceContext as g, type SpanOptions as h, init as i, span as s, trace as t };
352
+ export { type CaptureSpanOptions as C, type LelemonConfig as L, type ObserveOptions as O, type ProviderName as P, type ServiceConfig as S, type TraceContext as T, isEnabled as a, type SDKTelemetry as b, captureSpan as c, type SpanType as d, type TraceOptions as e, flush as f, getTraceContext as g, type SpanOptions as h, init as i, type StyleOptions as j, span as s, trace as t };
package/dist/gemini.d.mts CHANGED
@@ -1,5 +1,5 @@
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';
1
+ import { O as ObserveOptions } from './capture-DOj4Z9MB.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-DOj4Z9MB.mjs';
3
3
 
4
4
  /**
5
5
  * Google Gemini Provider Entry Point
package/dist/gemini.d.ts CHANGED
@@ -1,5 +1,5 @@
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';
1
+ import { O as ObserveOptions } from './capture-DOj4Z9MB.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-DOj4Z9MB.js';
3
3
 
4
4
  /**
5
5
  * Google Gemini Provider Entry Point
package/dist/gemini.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
2
- 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 Te=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Z=Te((kt,Me)=>{Me.exports={name:"@lelemondev/sdk",version:"0.10.0",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var F=false;function V(e){F=e;}function C(){return F?true:ve("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function l(e,t){C()&&$("debug",e,t);}function _(e,t){C()&&$("info",e,t);}function E(e,t){$("warn",e,t);}function q(e,t,n,r){C()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function R(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function A(e){C()&&console.log(`${f} Wrapped client: provider=${e}`);}function B(e,t){C()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function H(e,t){C()&&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){C()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){C()&&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 ve(e){if(typeof process<"u"&&process.env)return process.env[e]}var ke=10,Ie=1e3,xe=1e4,G=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??ke,flushIntervalMs:t.flushIntervalMs??Ie,requestTimeoutMs:t.requestTimeoutMs??xe};}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();B(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 o=`${this.config.endpoint}${n}`,a=new AbortController,s=r?JSON.stringify(r):void 0;Y(t,o,s?.length??0);let d=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),i=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:s,signal:a.signal});if(clearTimeout(d),X(u.status,Date.now()-i),!u.ok){let S=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${S}`)}let c=await u.text();return c?JSON.parse(c):{}}catch(u){throw clearTimeout(d),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var Ee="@lelemondev/sdk",Re="nodejs";function Ge(){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 Pe(){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 De(){try{if(typeof z<"u")return Z().version??"unknown"}catch{}return "unknown"}var k=null;function Q(e){if(!k){let n=Ge(),r=Pe();k={"telemetry.sdk.name":Ee,"telemetry.sdk.version":De(),"telemetry.sdk.language":Re},n&&(k["process.runtime.name"]=n.name,k["process.runtime.version"]=n.version),r&&(k["os.type"]=r);}let t={...k};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var j={},T=null,O=null,ee="https://api.lelemon.dev";function qe(e={}){j=e,e.debug&&V(true),O=Q(e.service),_("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),T=te(e),T.isEnabled()?_("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function P(){return j}function D(){return O}function Ae(){return v().isEnabled()}function v(){return T||(T=te(j)),T}async function $e(){T&&await T.flush();}function te(e){let t=e.apiKey??Oe("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 G({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Oe(e){if(typeof process<"u"&&process.env)return process.env[e]}var N=Symbol.for("@lelemondev/sdk:globalContext");function oe(){let e=globalThis;return e[N]||(e[N]={context:{}}),e[N]}function se(e){oe().context=e,l("Global context updated",e);}function M(){return oe().context}function h(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=M(),r=g(),o=I(),a=D(),s={provider:e.provider,model:e.model,input:L(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}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return q(e.provider,e.model,e.durationMs,e.status),t.enqueue(s),o}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));return}}function p(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=M(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId: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(a);}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=M(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,s=D(),d={...n.metadata,...e.metadata,...s?{_telemetry:s}:{}};delete d._traceId,delete d._parentSpanId;let i={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(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:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(i);}catch(t){R("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,je=["api_key","apikey","password","secret","authorization"],Ne=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ke=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],re={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ae(){return P().redaction??{}}function Le(e){let t=e.toLowerCase();return Ke.includes(t)?false:!!(je.some(r=>t.includes(r))||Ne.some(r=>t.includes(r))||(ae().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Ue(e){let t=ae(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(re.emails,"[EMAIL]")),t.phones&&(n=n.replace(re.phones,"[PHONE]")),n}function L(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=Ue(e);return n.length>ne&&(n=n.slice(0,ne)+"...[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))Le(r)?n[r]="[REDACTED]":n[r]=x(o,t+1);return n}return String(e)}var U=Symbol.for("@lelemondev/sdk:traceStorage");function Fe(){let e=globalThis;return e[U]||(e[U]=new async_hooks.AsyncLocalStorage),e[U]}var ie=Fe();function I(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function w(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ve(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Be(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function He(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??I(),a=I(),s={traceId:o,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 ie.run(s,async()=>{let d,i;try{return d=await t(),d}catch(u){throw i=u instanceof Error?u:new Error(String(u)),u}finally{Xe(s,i?void 0:d,i);}})}var We=["text","content","message","output","response","result","answer"];function Ye(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 We)if(o in r&&typeof r[o]=="string")return r[o];return e}function Xe(e,t,n){let r=v();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=M(),a=Date.now()-e.startTime,s=n?null:Ye(t,e.outputKey,e.outputTransform),d={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:s,inputTokens:0,outputTokens:0,durationMs:a,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:a,hasError:!!n}),r.enqueue(d);}function Ze(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=Ve(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&&Be(e.toolCallId);}var y="gemini";function ue(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GoogleGenAI")return true;let n=e;return !!(n.models&&typeof n.models=="object"&&typeof n.models.generateContent=="function"&&n.chats&&typeof n.chats=="object")}function ce(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="models"&&a&&typeof a=="object"?Je(a):r==="chats"&&a&&typeof a=="object"?tt(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="generateContent"&&typeof o=="function"?Qe(o.bind(t)):n==="generateContentStream"&&typeof o=="function"?et(o.bind(t)):o}})}function Qe(e){return async function(n){let r=Date.now(),o=n.model,a=le(n);try{let s=await e(n),d=Date.now()-r,i=pe(s),u=h({provider:y,model:o,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=fe(s);c.length>0&&w(c,u);}return s}catch(s){throw p({provider:y,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:false}),s}}}function et(e){return async function(n){let r=Date.now(),o=n.model,a=le(n);try{let s=await e(n);return de(s,o,a,r)}catch(s){throw p({provider:y,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:true}),s}}}async function*de(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){let u=i.text;if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],S=c[c.length-1];S?.text!==void 0?S.text+=u:c.push({text:u});}if(i.candidates?.[0]?.content?.parts)for(let c of i.candidates[0].content.parts)c.functionCall&&o.candidates[0].content?.parts?.push(c);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:y,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=h({provider:y,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=at(o.candidates);c.length>0&&w(c,u);}}}}function tt(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?nt(o.bind(t)):o}})}function nt(e){return function(n){let r=e(n);return rt(r,n.model)}}function rt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?ot(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?st(a.bind(n),t):a}})}function ot(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r),d=Date.now()-o,i=pe(s),u=h({provider:y,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=fe(s);c.length>0&&w(c,u);}return s}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function st(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r);return de(s,t,a,o)}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function le(e){return e.contents}function pe(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata,modelVersion:e.modelVersion}}function fe(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function at(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}var b="gemini";function ge(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GenerativeModel")return true;let n=e;return typeof n.generateContent=="function"&&typeof n.generateContentStream=="function"&&typeof n.model=="string"}function me(e){return !e||typeof e!="object"?false:!!(e.constructor?.name==="GoogleGenerativeAI"||typeof e.getGenerativeModel=="function"||ge(e))}function Ce(e){if(ge(e)){let n=e;return he(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof a=="function"?ut(a.bind(n)):a}})}function ut(e){return function(n){let r=e(n);return he(r,n.model)}}function he(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="generateContent"&&typeof a=="function"?ct(a.bind(n),t):r==="generateContentStream"&&typeof a=="function"?dt(a.bind(n),t):r==="startChat"&&typeof a=="function"?lt(a.bind(n),t):a}})}function ct(e,t){return async function(r){let o=Date.now(),a=ye(r);try{let s=await e(r),d=Date.now()-o,i=be(s.response),u=h({provider:b,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=Se(s.response);c.length>0&&w(c,u);}return s}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function dt(e,t){return async function(r){let o=Date.now(),a=ye(r);try{let s=await e(r),d=we(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}async function*we(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){try{let u=i.text();if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],S=c[c.length-1];S?.text!==void 0?S.text+=u:c.push({text:u});}}catch{}if(i.candidates?.[0]?.content?.parts)for(let u of i.candidates[0].content.parts)u.functionCall&&o.candidates[0].content?.parts?.push(u);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:b,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=h({provider:b,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=mt(o.candidates);c.length>0&&w(c,u);}}}}function lt(e,t){return function(r){let o=e(r);return pt(o,t)}}function pt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?ft(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?gt(a.bind(n),t):a}})}function ft(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=Date.now()-o,i=be(s.response),u=h({provider:b,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=Se(s.response);c.length>0&&w(c,u);}return s}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function gt(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=we(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function ye(e){return typeof e=="string"?e:e.contents?e.contents:e}function be(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function Se(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function mt(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function en(e,t){return t&&se(t),P().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(A("gemini"),ce(e)):me(e)?(A("gemini"),Ce(e)):(E("Client is not a Gemini model. Use @lelemondev/sdk/gemini with Google Generative AI or Google GenAI SDK."),e)}
2
+ 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 Te=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Z=Te((kt,Me)=>{Me.exports={name:"@lelemondev/sdk",version:"0.10.1",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var F=false;function V(e){F=e;}function C(){return F?true:ve("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function l(e,t){C()&&$("debug",e,t);}function _(e,t){C()&&$("info",e,t);}function E(e,t){$("warn",e,t);}function q(e,t,n,r){C()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function R(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function A(e){C()&&console.log(`${f} Wrapped client: provider=${e}`);}function B(e,t){C()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function H(e,t){C()&&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){C()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){C()&&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 ve(e){if(typeof process<"u"&&process.env)return process.env[e]}var ke=10,Ie=1e3,xe=1e4,G=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??ke,flushIntervalMs:t.flushIntervalMs??Ie,requestTimeoutMs:t.requestTimeoutMs??xe};}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();B(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 o=`${this.config.endpoint}${n}`,a=new AbortController,s=r?JSON.stringify(r):void 0;Y(t,o,s?.length??0);let d=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),i=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:s,signal:a.signal});if(clearTimeout(d),X(u.status,Date.now()-i),!u.ok){let S=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${S}`)}let c=await u.text();return c?JSON.parse(c):{}}catch(u){throw clearTimeout(d),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var Ee="@lelemondev/sdk",Re="nodejs";function Ge(){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 Pe(){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 De(){try{if(typeof z<"u")return Z().version??"unknown"}catch{}return "unknown"}var k=null;function Q(e){if(!k){let n=Ge(),r=Pe();k={"telemetry.sdk.name":Ee,"telemetry.sdk.version":De(),"telemetry.sdk.language":Re},n&&(k["process.runtime.name"]=n.name,k["process.runtime.version"]=n.version),r&&(k["os.type"]=r);}let t={...k};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var j={},T=null,O=null,ee="https://api.lelemon.dev";function qe(e={}){j=e,e.debug&&V(true),O=Q(e.service),_("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),T=te(e),T.isEnabled()?_("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function P(){return j}function D(){return O}function Ae(){return v().isEnabled()}function v(){return T||(T=te(j)),T}async function $e(){T&&await T.flush();}function te(e){let t=e.apiKey??Oe("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 G({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Oe(e){if(typeof process<"u"&&process.env)return process.env[e]}var N=Symbol.for("@lelemondev/sdk:globalContext");function oe(){let e=globalThis;return e[N]||(e[N]={context:{}}),e[N]}function se(e){oe().context=e,l("Global context updated",e);}function M(){return oe().context}function h(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=M(),r=g(),o=I(),a=D(),s={provider:e.provider,model:e.model,input:L(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}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return q(e.provider,e.model,e.durationMs,e.status),t.enqueue(s),o}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));return}}function p(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=M(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId: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(a);}catch(t){R(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=v();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=M(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,s=D(),d={...n.metadata,...e.metadata,...s?{_telemetry:s}:{}};delete d._traceId,delete d._parentSpanId;let i={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(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:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(i);}catch(t){R("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,je=["api_key","apikey","password","secret","authorization"],Ne=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ke=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],re={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ae(){return P().redaction??{}}function Le(e){let t=e.toLowerCase();return Ke.includes(t)?false:!!(je.some(r=>t.includes(r))||Ne.some(r=>t.includes(r))||(ae().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Ue(e){let t=ae(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(re.emails,"[EMAIL]")),t.phones&&(n=n.replace(re.phones,"[PHONE]")),n}function L(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=Ue(e);return n.length>ne&&(n=n.slice(0,ne)+"...[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))Le(r)?n[r]="[REDACTED]":n[r]=x(o,t+1);return n}return String(e)}var U=Symbol.for("@lelemondev/sdk:traceStorage");function Fe(){let e=globalThis;return e[U]||(e[U]=new async_hooks.AsyncLocalStorage),e[U]}var ie=Fe();function I(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function y(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ve(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Be(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function He(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??I(),a=I(),s={traceId:o,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,style:n.style,pendingToolCalls:new Map};return ie.run(s,async()=>{let d,i;try{return d=await t(),d}catch(u){throw i=u instanceof Error?u:new Error(String(u)),u}finally{Xe(s,i?void 0:d,i);}})}var We=["text","content","message","output","response","result","answer"];function Ye(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 We)if(o in r&&typeof r[o]=="string")return r[o];return e}function Xe(e,t,n){let r=v();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=M(),a=Date.now()-e.startTime,s=n?null:Ye(t,e.outputKey,e.outputTransform),d={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:s,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:e.sessionId??o.sessionId,userId:e.userId??o.userId,metadata:{...o.metadata,...e.metadata,...e.style?{_style:e.style}:{}},tags:e.tags??o.tags};l(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(d);}function Ze(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=Ve(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.style?{_style:e.style}:{}}}),e.toolCallId&&Be(e.toolCallId);}var w="gemini";function ue(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GoogleGenAI")return true;let n=e;return !!(n.models&&typeof n.models=="object"&&typeof n.models.generateContent=="function"&&n.chats&&typeof n.chats=="object")}function ce(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="models"&&a&&typeof a=="object"?Je(a):r==="chats"&&a&&typeof a=="object"?tt(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="generateContent"&&typeof o=="function"?Qe(o.bind(t)):n==="generateContentStream"&&typeof o=="function"?et(o.bind(t)):o}})}function Qe(e){return async function(n){let r=Date.now(),o=n.model,a=le(n);try{let s=await e(n),d=Date.now()-r,i=pe(s),u=h({provider:w,model:o,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=fe(s);c.length>0&&y(c,u);}return s}catch(s){throw p({provider:w,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:false}),s}}}function et(e){return async function(n){let r=Date.now(),o=n.model,a=le(n);try{let s=await e(n);return de(s,o,a,r)}catch(s){throw p({provider:w,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:true}),s}}}async function*de(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){let u=i.text;if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],S=c[c.length-1];S?.text!==void 0?S.text+=u:c.push({text:u});}if(i.candidates?.[0]?.content?.parts)for(let c of i.candidates[0].content.parts)c.functionCall&&o.candidates[0].content?.parts?.push(c);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:w,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=h({provider:w,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=at(o.candidates);c.length>0&&y(c,u);}}}}function tt(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?nt(o.bind(t)):o}})}function nt(e){return function(n){let r=e(n);return rt(r,n.model)}}function rt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?ot(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?st(a.bind(n),t):a}})}function ot(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r),d=Date.now()-o,i=pe(s),u=h({provider:w,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=fe(s);c.length>0&&y(c,u);}return s}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function st(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r);return de(s,t,a,o)}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function le(e){return e.contents}function pe(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata,modelVersion:e.modelVersion}}function fe(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function at(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}var b="gemini";function ge(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GenerativeModel")return true;let n=e;return typeof n.generateContent=="function"&&typeof n.generateContentStream=="function"&&typeof n.model=="string"}function me(e){return !e||typeof e!="object"?false:!!(e.constructor?.name==="GoogleGenerativeAI"||typeof e.getGenerativeModel=="function"||ge(e))}function Ce(e){if(ge(e)){let n=e;return he(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof a=="function"?ut(a.bind(n)):a}})}function ut(e){return function(n){let r=e(n);return he(r,n.model)}}function he(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="generateContent"&&typeof a=="function"?ct(a.bind(n),t):r==="generateContentStream"&&typeof a=="function"?dt(a.bind(n),t):r==="startChat"&&typeof a=="function"?lt(a.bind(n),t):a}})}function ct(e,t){return async function(r){let o=Date.now(),a=we(r);try{let s=await e(r),d=Date.now()-o,i=be(s.response),u=h({provider:b,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=Se(s.response);c.length>0&&y(c,u);}return s}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function dt(e,t){return async function(r){let o=Date.now(),a=we(r);try{let s=await e(r),d=ye(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}async function*ye(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){try{let u=i.text();if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],S=c[c.length-1];S?.text!==void 0?S.text+=u:c.push({text:u});}}catch{}if(i.candidates?.[0]?.content?.parts)for(let u of i.candidates[0].content.parts)u.functionCall&&o.candidates[0].content?.parts?.push(u);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:b,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=h({provider:b,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=mt(o.candidates);c.length>0&&y(c,u);}}}}function lt(e,t){return function(r){let o=e(r);return pt(o,t)}}function pt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?ft(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?gt(a.bind(n),t):a}})}function ft(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=Date.now()-o,i=be(s.response),u=h({provider:b,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=Se(s.response);c.length>0&&y(c,u);}return s}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function gt(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=ye(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:b,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function we(e){return typeof e=="string"?e:e.contents?e.contents:e}function be(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function Se(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function mt(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function en(e,t){return t&&se(t),P().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(A("gemini"),ce(e)):me(e)?(A("gemini"),Ce(e)):(E("Client is not a Gemini model. Use @lelemondev/sdk/gemini with Google Generative AI or Google GenAI SDK."),e)}
3
3
  exports.captureSpan=K;exports.flush=$e;exports.getTraceContext=g;exports.init=qe;exports.isEnabled=Ae;exports.observe=en;exports.span=Ze;exports.trace=He;//# sourceMappingURL=gemini.js.map
4
4
  //# sourceMappingURL=gemini.js.map
package/dist/gemini.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- 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 Se=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var X=Se((St,xe)=>{xe.exports={name:"@lelemondev/sdk",version:"0.10.0",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var z=false;function F(e){z=e;}function m(){return z?true:Te("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function l(e,t){m()&&A("debug",e,t);}function D(e,t){m()&&A("info",e,t);}function M(e,t){A("warn",e,t);}function _(e,t,n,r){m()&&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 q(e){m()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){m()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function B(e,t){m()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){m()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){m()&&console.log(`${f} 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(`${f} ${t}`,n):r(`${f} ${t}`);}function Te(e){if(typeof process<"u"&&process.env)return process.env[e]}var ve=10,ke=1e3,Ie=1e4,R=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??ve,flushIntervalMs:t.flushIntervalMs??ke,requestTimeoutMs:t.requestTimeoutMs??Ie};}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}),B(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,s=r?JSON.stringify(r):void 0;W(t,o,s?.length??0);let d=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),i=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:s,signal:a.signal});if(clearTimeout(d),Y(u.status,Date.now()-i),!u.ok){let b=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${b}`)}let c=await u.text();return c?JSON.parse(c):{}}catch(u){throw clearTimeout(d),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var Me="@lelemondev/sdk",Ee="nodejs";function Re(){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 Ge(){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 Pe(){try{if(typeof U<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function J(e){if(!v){let n=Re(),r=Ge();v={"telemetry.sdk.name":Me,"telemetry.sdk.version":Pe(),"telemetry.sdk.language":Ee},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 O={},S=null,$=null,Q="https://api.lelemon.dev";function _e(e={}){O=e,e.debug&&F(true),$=J(e.service),D("Initializing SDK",{endpoint:e.endpoint??Q,debug:e.debug??false,disabled:e.disabled??false,telemetry:$}),S=ee(e),S.isEnabled()?D("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function G(){return O}function P(){return $}function qe(){return T().isEnabled()}function T(){return S||(S=ee(O)),S}async function Ae(){S&&await S.flush();}function ee(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 R({apiKey:t??"",endpoint:e.endpoint??Q,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 re(){let e=globalThis;return e[j]||(e[j]={context:{}}),e[j]}function oe(e){re().context=e,l("Global context updated",e);}function x(){return re().context}function C(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=x(),r=g(),o=k(),a=P(),s={provider:e.provider,model:e.model,input:K(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:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return _(e.provider,e.model,e.durationMs,e.status),t.enqueue(s),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function p(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=x(),r=g(),o=P(),a={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:k(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};_(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=x(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,s=P(),d={...n.metadata,...e.metadata,...s?{_telemetry:s}:{}};delete d._traceId,delete d._parentSpanId;let i={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(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:o??r?.traceId,spanId:k(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(i);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var te=1e5,Oe=["api_key","apikey","password","secret","authorization"],je=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ne=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],ne={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function se(){return G().redaction??{}}function Ke(e){let t=e.toLowerCase();return Ne.includes(t)?false:!!(Oe.some(r=>t.includes(r))||je.some(r=>t.includes(r))||(se().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Le(e){let t=se(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(ne.emails,"[EMAIL]")),t.phones&&(n=n.replace(ne.phones,"[PHONE]")),n}function K(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=Le(e);return n.length>te&&(n=n.slice(0,te)+"...[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,o]of Object.entries(e))Ke(r)?n[r]="[REDACTED]":n[r]=I(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function ze(){let e=globalThis;return e[L]||(e[L]=new AsyncLocalStorage),e[L]}var ae=ze();function k(){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 h(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Fe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ve(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function Be(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??k(),a=k(),s={traceId:o,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 ae.run(s,async()=>{let d,i;try{return d=await t(),d}catch(u){throw i=u instanceof Error?u:new Error(String(u)),u}finally{Ye(s,i?void 0:d,i);}})}var He=["text","content","message","output","response","result","answer"];function We(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 He)if(o in r&&typeof r[o]=="string")return r[o];return e}function Ye(e,t,n){let r=T();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=x(),a=Date.now()-e.startTime,s=n?null:We(t,e.outputKey,e.outputTransform),d={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:s,inputTokens:0,outputTokens:0,durationMs:a,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:a,hasError:!!n}),r.enqueue(d);}function Xe(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=Fe(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&&Ve(e.toolCallId);}var w="gemini";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GoogleGenAI")return true;let n=e;return !!(n.models&&typeof n.models=="object"&&typeof n.models.generateContent=="function"&&n.chats&&typeof n.chats=="object")}function ue(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="models"&&a&&typeof a=="object"?Ze(a):r==="chats"&&a&&typeof a=="object"?et(a):a}})}function Ze(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="generateContent"&&typeof o=="function"?Je(o.bind(t)):n==="generateContentStream"&&typeof o=="function"?Qe(o.bind(t)):o}})}function Je(e){return async function(n){let r=Date.now(),o=n.model,a=de(n);try{let s=await e(n),d=Date.now()-r,i=le(s),u=C({provider:w,model:o,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=pe(s);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:w,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:false}),s}}}function Qe(e){return async function(n){let r=Date.now(),o=n.model,a=de(n);try{let s=await e(n);return ce(s,o,a,r)}catch(s){throw p({provider:w,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:true}),s}}}async function*ce(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){let u=i.text;if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],b=c[c.length-1];b?.text!==void 0?b.text+=u:c.push({text:u});}if(i.candidates?.[0]?.content?.parts)for(let c of i.candidates[0].content.parts)c.functionCall&&o.candidates[0].content?.parts?.push(c);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:w,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=C({provider:w,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=st(o.candidates);c.length>0&&h(c,u);}}}}function et(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?tt(o.bind(t)):o}})}function tt(e){return function(n){let r=e(n);return nt(r,n.model)}}function nt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?rt(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?ot(a.bind(n),t):a}})}function rt(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r),d=Date.now()-o,i=le(s),u=C({provider:w,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=pe(s);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ot(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r);return ce(s,t,a,o)}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function de(e){return e.contents}function le(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata,modelVersion:e.modelVersion}}function pe(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function st(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}var y="gemini";function fe(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GenerativeModel")return true;let n=e;return typeof n.generateContent=="function"&&typeof n.generateContentStream=="function"&&typeof n.model=="string"}function ge(e){return !e||typeof e!="object"?false:!!(e.constructor?.name==="GoogleGenerativeAI"||typeof e.getGenerativeModel=="function"||fe(e))}function me(e){if(fe(e)){let n=e;return Ce(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof a=="function"?it(a.bind(n)):a}})}function it(e){return function(n){let r=e(n);return Ce(r,n.model)}}function Ce(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="generateContent"&&typeof a=="function"?ut(a.bind(n),t):r==="generateContentStream"&&typeof a=="function"?ct(a.bind(n),t):r==="startChat"&&typeof a=="function"?dt(a.bind(n),t):a}})}function ut(e,t){return async function(r){let o=Date.now(),a=we(r);try{let s=await e(r),d=Date.now()-o,i=ye(s.response),u=C({provider:y,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=be(s.response);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ct(e,t){return async function(r){let o=Date.now(),a=we(r);try{let s=await e(r),d=he(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}async function*he(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){try{let u=i.text();if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],b=c[c.length-1];b?.text!==void 0?b.text+=u:c.push({text:u});}}catch{}if(i.candidates?.[0]?.content?.parts)for(let u of i.candidates[0].content.parts)u.functionCall&&o.candidates[0].content?.parts?.push(u);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:y,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=C({provider:y,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=gt(o.candidates);c.length>0&&h(c,u);}}}}function dt(e,t){return function(r){let o=e(r);return lt(o,t)}}function lt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?pt(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?ft(a.bind(n),t):a}})}function pt(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=Date.now()-o,i=ye(s.response),u=C({provider:y,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=be(s.response);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ft(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=he(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function we(e){return typeof e=="string"?e:e.contents?e.contents:e}function ye(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function be(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function gt(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function Vt(e,t){return t&&oe(t),G().disabled?(l("Tracing disabled, returning unwrapped client"),e):ie(e)?(q("gemini"),ue(e)):ge(e)?(q("gemini"),me(e)):(M("Client is not a Gemini model. Use @lelemondev/sdk/gemini with Google Generative AI or Google GenAI SDK."),e)}
2
+ 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 Se=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var X=Se((St,xe)=>{xe.exports={name:"@lelemondev/sdk",version:"0.10.1",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"},"./google-genai":{types:"./dist/google-genai.d.ts",import:"./dist/google-genai.mjs",require:"./dist/google-genai.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"],"google-genai":["./dist/google-genai.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/genai":"^1.0.0","@google/generative-ai":"^0.24.1","@anthropic-ai/sdk":"^0.82.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",vite:"^6.0.0",typedoc:"^0.28.18",typescript:"^6.0.0",vitest:"^4.0.0"}};});var z=false;function F(e){z=e;}function m(){return z?true:Te("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function l(e,t){m()&&A("debug",e,t);}function D(e,t){m()&&A("info",e,t);}function M(e,t){A("warn",e,t);}function _(e,t,n,r){m()&&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 q(e){m()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){m()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function B(e,t){m()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){m()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){m()&&console.log(`${f} 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(`${f} ${t}`,n):r(`${f} ${t}`);}function Te(e){if(typeof process<"u"&&process.env)return process.env[e]}var ve=10,ke=1e3,Ie=1e4,R=class{config;queue=[];flushPromise=null;flushTimer=null;constructor(t){this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??ve,flushIntervalMs:t.flushIntervalMs??ke,requestTimeoutMs:t.requestTimeoutMs??Ie};}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}),B(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,s=r?JSON.stringify(r):void 0;W(t,o,s?.length??0);let d=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),i=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:s,signal:a.signal});if(clearTimeout(d),Y(u.status,Date.now()-i),!u.ok){let b=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${b}`)}let c=await u.text();return c?JSON.parse(c):{}}catch(u){throw clearTimeout(d),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var Me="@lelemondev/sdk",Ee="nodejs";function Re(){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 Ge(){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 Pe(){try{if(typeof U<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function J(e){if(!v){let n=Re(),r=Ge();v={"telemetry.sdk.name":Me,"telemetry.sdk.version":Pe(),"telemetry.sdk.language":Ee},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 O={},S=null,$=null,Q="https://api.lelemon.dev";function _e(e={}){O=e,e.debug&&F(true),$=J(e.service),D("Initializing SDK",{endpoint:e.endpoint??Q,debug:e.debug??false,disabled:e.disabled??false,telemetry:$}),S=ee(e),S.isEnabled()?D("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function G(){return O}function P(){return $}function qe(){return T().isEnabled()}function T(){return S||(S=ee(O)),S}async function Ae(){S&&await S.flush();}function ee(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 R({apiKey:t??"",endpoint:e.endpoint??Q,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 re(){let e=globalThis;return e[j]||(e[j]={context:{}}),e[j]}function oe(e){re().context=e,l("Global context updated",e);}function x(){return re().context}function C(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=x(),r=g(),o=k(),a=P(),s={provider:e.provider,model:e.model,input:K(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:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return _(e.provider,e.model,e.durationMs,e.status),t.enqueue(s),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function p(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=x(),r=g(),o=P(),a={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:k(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};_(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=T();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=x(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,s=P(),d={...n.metadata,...e.metadata,...s?{_telemetry:s}:{}};delete d._traceId,delete d._parentSpanId;let i={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(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:o??r?.traceId,spanId:k(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(i);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var te=1e5,Oe=["api_key","apikey","password","secret","authorization"],je=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ne=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],ne={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function se(){return G().redaction??{}}function Ke(e){let t=e.toLowerCase();return Ne.includes(t)?false:!!(Oe.some(r=>t.includes(r))||je.some(r=>t.includes(r))||(se().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Le(e){let t=se(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(ne.emails,"[EMAIL]")),t.phones&&(n=n.replace(ne.phones,"[PHONE]")),n}function K(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=Le(e);return n.length>te&&(n=n.slice(0,te)+"...[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,o]of Object.entries(e))Ke(r)?n[r]="[REDACTED]":n[r]=I(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function ze(){let e=globalThis;return e[L]||(e[L]=new AsyncLocalStorage),e[L]}var ae=ze();function k(){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 h(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Fe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ve(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function Be(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??k(),a=k(),s={traceId:o,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,style:n.style,pendingToolCalls:new Map};return ae.run(s,async()=>{let d,i;try{return d=await t(),d}catch(u){throw i=u instanceof Error?u:new Error(String(u)),u}finally{Ye(s,i?void 0:d,i);}})}var He=["text","content","message","output","response","result","answer"];function We(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 He)if(o in r&&typeof r[o]=="string")return r[o];return e}function Ye(e,t,n){let r=T();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=x(),a=Date.now()-e.startTime,s=n?null:We(t,e.outputKey,e.outputTransform),d={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:s,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:e.sessionId??o.sessionId,userId:e.userId??o.userId,metadata:{...o.metadata,...e.metadata,...e.style?{_style:e.style}:{}},tags:e.tags??o.tags};l(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(d);}function Xe(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=Fe(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.style?{_style:e.style}:{}}}),e.toolCallId&&Ve(e.toolCallId);}var y="gemini";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GoogleGenAI")return true;let n=e;return !!(n.models&&typeof n.models=="object"&&typeof n.models.generateContent=="function"&&n.chats&&typeof n.chats=="object")}function ue(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="models"&&a&&typeof a=="object"?Ze(a):r==="chats"&&a&&typeof a=="object"?et(a):a}})}function Ze(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="generateContent"&&typeof o=="function"?Je(o.bind(t)):n==="generateContentStream"&&typeof o=="function"?Qe(o.bind(t)):o}})}function Je(e){return async function(n){let r=Date.now(),o=n.model,a=de(n);try{let s=await e(n),d=Date.now()-r,i=le(s),u=C({provider:y,model:o,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=pe(s);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:y,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:false}),s}}}function Qe(e){return async function(n){let r=Date.now(),o=n.model,a=de(n);try{let s=await e(n);return ce(s,o,a,r)}catch(s){throw p({provider:y,model:o,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-r,streaming:true}),s}}}async function*ce(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){let u=i.text;if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],b=c[c.length-1];b?.text!==void 0?b.text+=u:c.push({text:u});}if(i.candidates?.[0]?.content?.parts)for(let c of i.candidates[0].content.parts)c.functionCall&&o.candidates[0].content?.parts?.push(c);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:y,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=C({provider:y,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=st(o.candidates);c.length>0&&h(c,u);}}}}function et(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?tt(o.bind(t)):o}})}function tt(e){return function(n){let r=e(n);return nt(r,n.model)}}function nt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?rt(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?ot(a.bind(n),t):a}})}function rt(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r),d=Date.now()-o,i=le(s),u=C({provider:y,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=pe(s);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ot(e,t){return async function(r){let o=Date.now(),a=r.message;try{let s=await e(r);return ce(s,t,a,o)}catch(s){throw p({provider:y,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function de(e){return e.contents}function le(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata,modelVersion:e.modelVersion}}function pe(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function st(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}var w="gemini";function fe(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="GenerativeModel")return true;let n=e;return typeof n.generateContent=="function"&&typeof n.generateContentStream=="function"&&typeof n.model=="string"}function ge(e){return !e||typeof e!="object"?false:!!(e.constructor?.name==="GoogleGenerativeAI"||typeof e.getGenerativeModel=="function"||fe(e))}function me(e){if(fe(e)){let n=e;return Ce(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof a=="function"?it(a.bind(n)):a}})}function it(e){return function(n){let r=e(n);return Ce(r,n.model)}}function Ce(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="generateContent"&&typeof a=="function"?ut(a.bind(n),t):r==="generateContentStream"&&typeof a=="function"?ct(a.bind(n),t):r==="startChat"&&typeof a=="function"?dt(a.bind(n),t):a}})}function ut(e,t){return async function(r){let o=Date.now(),a=ye(r);try{let s=await e(r),d=Date.now()-o,i=we(s.response),u=C({provider:w,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=be(s.response);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ct(e,t){return async function(r){let o=Date.now(),a=ye(r);try{let s=await e(r),d=he(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}async function*he(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},a=null,s,d=false;try{for await(let i of e){try{let u=i.text();if(u){d||(d=!0,s=Date.now()-r);let c=o.candidates[0].content?.parts||[],b=c[c.length-1];b?.text!==void 0?b.text+=u:c.push({text:u});}}catch{}if(i.candidates?.[0]?.content?.parts)for(let u of i.candidates[0].content.parts)u.functionCall&&o.candidates[0].content?.parts?.push(u);i.usageMetadata&&(o.usageMetadata=i.usageMetadata),i.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=i.candidates[0].finishReason),yield i;}}catch(i){throw a=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-r;if(a)p({provider:w,model:t,input:n,error:a,durationMs:i,streaming:true});else {let u=C({provider:w,model:t,input:n,rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(u){let c=gt(o.candidates);c.length>0&&h(c,u);}}}}function dt(e,t){return function(r){let o=e(r);return lt(o,t)}}function lt(e,t){return new Proxy(e,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="sendMessage"&&typeof a=="function"?pt(a.bind(n),t):r==="sendMessageStream"&&typeof a=="function"?ft(a.bind(n),t):a}})}function pt(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=Date.now()-o,i=we(s.response),u=C({provider:w,model:t,input:a,rawResponse:i,durationMs:d,status:"success",streaming:!1});if(u){let c=be(s.response);c.length>0&&h(c,u);}return s}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:false}),s}}}function ft(e,t){return async function(r){let o=Date.now(),a=r;try{let s=await e(r),d=he(s.stream,t,a,o);return {...s,stream:d}}catch(s){throw p({provider:w,model:t,input:a,error:s instanceof Error?s:new Error(String(s)),durationMs:Date.now()-o,streaming:true}),s}}}function ye(e){return typeof e=="string"?e:e.contents?e.contents:e}function we(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function be(e){let t=[],n=e.candidates?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function gt(e){let t=[],n=e?.[0]?.content?.parts;return n&&n.forEach((r,o)=>{r.functionCall?.name&&t.push(`gemini-fc-${r.functionCall.name}-${o}`);}),t}function Vt(e,t){return t&&oe(t),G().disabled?(l("Tracing disabled, returning unwrapped client"),e):ie(e)?(q("gemini"),ue(e)):ge(e)?(q("gemini"),me(e)):(M("Client is not a Gemini model. Use @lelemondev/sdk/gemini with Google Generative AI or Google GenAI SDK."),e)}
3
3
  export{N as captureSpan,Ae as flush,g as getTraceContext,_e as init,qe as isEnabled,Vt as observe,Xe as span,Be as trace};//# sourceMappingURL=gemini.mjs.map
4
4
  //# sourceMappingURL=gemini.mjs.map
@@ -1,5 +1,5 @@
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';
1
+ import { O as ObserveOptions } from './capture-DOj4Z9MB.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-DOj4Z9MB.mjs';
3
3
 
4
4
  /**
5
5
  * Google GenAI Provider Entry Point
@@ -1,5 +1,5 @@
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';
1
+ import { O as ObserveOptions } from './capture-DOj4Z9MB.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-DOj4Z9MB.js';
3
3
 
4
4
  /**
5
5
  * Google GenAI Provider Entry Point