@lelemondev/sdk 0.9.9 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bedrock.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- var me=Object.defineProperty;var fe=(e,t,n)=>t in e?me(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var z=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ge=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var I=(e,t,n)=>fe(e,typeof t!="symbol"?t+"":t,n);var Z=ge((at,Te)=>{Te.exports={name:"@lelemondev/sdk",version:"0.9.9",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var F=false;function G(e){F=e;}function k(){return F?true:ye("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function l(e,t){k()&&q("debug",e,t);}function B(e,t){k()&&q("info",e,t);}function R(e,t){q("warn",e,t);}function O(e,t,n,r){k()&&console.log(`${m} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${m} Failed to capture trace: provider=${e} error=${t.message}`);}function V(e){k()&&console.log(`${m} Wrapped client: provider=${e}`);}function J(e,t){k()&&console.log(`${m} Sending batch: count=${e} endpoint=${t}`);}function W(e,t){k()&&console.log(`${m} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${m} Batch send failed: count=${e} error=${n}`);}function Y(e,t,n){k()&&console.log(`${m} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){k()&&console.log(`${m} Response: status=${e} duration=${t}ms`);}function q(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 ye(e){if(typeof process<"u"&&process.env)return process.env[e]}var ke=10,be=1e3,we=1e4,D=class{constructor(t){I(this,"config");I(this,"queue",[]);I(this,"flushPromise",null);I(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??ke,flushIntervalMs:t.flushIntervalMs??be,requestTimeoutMs:t.requestTimeoutMs??we};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();J(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),W(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;Y(t,o,a?.length??0);let u=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),p=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(u),X(s.status,Date.now()-p),!s.ok){let d=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${d}`)}let c=await s.text();return c?JSON.parse(c):{}}catch(s){throw clearTimeout(u),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",ve="nodejs";function Ie(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Se(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function xe(){try{if(typeof z<"u")return Z().version??"unknown"}catch{}return "unknown"}var h=null;function ee(e){if(!h){let n=Ie(),r=Se();h={"telemetry.sdk.name":he,"telemetry.sdk.version":xe(),"telemetry.sdk.language":ve},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 U={},b=null,P=null,te="https://api.lelemon.dev";function Ee(e={}){U=e,e.debug&&G(true),P=ee(e.service),B("Initializing SDK",{endpoint:e.endpoint??te,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),b=ne(e),b.isEnabled()?B("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function _(){return U}function A(){return P}function Re(){return w().isEnabled()}function w(){return b||(b=ne(U)),b}async function Me(){b&&await b.flush();}function ne(e){let t=e.apiKey??De("LELEMON_API_KEY");return !t&&!e.disabled&&R("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new D({apiKey:t??"",endpoint:e.endpoint??te,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function De(e){if(typeof process<"u"&&process.env)return process.env[e]}var $=Symbol.for("@lelemondev/sdk:globalContext");function se(){let e=globalThis;return e[$]||(e[$]={context:{}}),e[$]}function ie(e){se().context=e,l("Global context updated",e);}function x(){return se().context}function C(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=x(),r=f(),o=v(),i=A(),a={provider:e.provider,model:e.model,input:N(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...i?{_telemetry:i}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return O(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){M(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=x(),r=f(),o=A(),i={provider:e.provider,model:e.model,input:N(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};O(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));}}function j(e){try{let t=w();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=x(),r=f(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=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:N(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId: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){M("unknown",t instanceof Error?t:new Error(String(t)));}}var re=1e5,_e=["api_key","apikey","password","secret","authorization"],Ae=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Be=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"],oe={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function ae(){return _().redaction??{}}function Oe(e){let t=e.toLowerCase();return Be.includes(t)?false:!!(_e.some(r=>t.includes(r))||Ae.some(r=>t.includes(r))||(ae().keys??[]).some(r=>t.includes(r.toLowerCase())))}function qe(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(oe.emails,"[EMAIL]")),t.phones&&(n=n.replace(oe.phones,"[PHONE]")),n}function N(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=qe(e);return n.length>re&&(n=n.slice(0,re)+"...[truncated]"),n}if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Oe(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var K=Symbol.for("@lelemondev/sdk:traceStorage");function Ue(){let e=globalThis;return e[K]||(e[K]=new AsyncLocalStorage),e[K]}var ue=Ue();function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return ue.getStore()}function L(e,t){let n=f();if(n)for(let r of e)n.pendingToolCalls.set(r,t),l(`Registered tool call ${r} \u2192 LLM span ${t}`);}function $e(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function je(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function Ne(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 ue.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{ze(a,p?void 0:u,p);}})}var Ke=["text","content","message","output","response","result","answer"];function Le(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 Ke)if(o in r&&typeof r[o]=="string")return r[o];return e}function ze(e,t,n){let r=w();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=x(),i=Date.now()-e.startTime,a=n?null:Le(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 Fe(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=$e(e.toolCallId);j({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&&je(e.toolCallId);}var g="bedrock";function de(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 ce(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"?Ge(i.bind(n)):i}})}function Ge(e){return async function(n){switch(n.constructor?.name||""){case "ConverseCommand":return Ve(e,n);case "ConverseStreamCommand":return Je(e,n);case "InvokeModelCommand":return He(e,n);case "InvokeModelWithResponseStreamCommand":return Ye(e,n);default:return e(n)}}}async function Ve(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=C({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},rawResponse:le(o),durationMs:i,status:"success",streaming:!1});if(a){let u=pe(o);u.length>0&&L(u,a);}return o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:{system:r.system,messages:r.messages},error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Je(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.stream?{...o,stream:We(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*We(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=C({provider:g,model:t.modelId||"unknown",input:{system:t.system,messages:t.messages},rawResponse:le(r),durationMs:s,status:"success",streaming:true,firstTokenMs:i});if(d){let y=pe(r);y.length>0&&L(y,d);}}}}async function He(e,t){let n=Date.now(),r=t.input;try{let o=await e(t),i=Date.now()-n,a=Ze(o.body);return C({provider:g,model:r.modelId||"unknown",input:E(r.body),rawResponse:a,durationMs:i,status:"success",streaming:!1}),o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:E(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:false}),o}}async function Ye(e,t){let n=Date.now(),r=t.input;try{let o=await e(t);return o.body?{...o,body:Xe(o.body,r,n)}:o}catch(o){throw T({provider:g,model:r.modelId||"unknown",input:E(r.body),error:o instanceof Error?o:new Error(String(o)),durationMs:Date.now()-n,streaming:true}),o}}async function*Xe(e,t,n){let r=[],o=null;try{for await(let i of e){if(i.chunk?.bytes){let a=Qe(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:E(t.body),error:o,durationMs:i,streaming:true}):C({provider:g,model:t.modelId||"unknown",input:E(t.body),rawResponse:{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function le(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function pe(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 E(e){try{let t=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(t)}catch{return e}}function Ze(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function Qe(e){try{let t=new TextDecoder().decode(e);return JSON.parse(t)}catch{return null}}function Mt(e,t){return t&&ie(t),_().disabled?(l("Tracing disabled, returning unwrapped client"),e):de(e)?(V("bedrock"),ce(e)):(R("Client is not a Bedrock client. Use @lelemondev/sdk/bedrock only with AWS Bedrock SDK."),e)}
3
- export{j as captureSpan,Me as flush,f as getTraceContext,Ee as init,Re as isEnabled,Mt as observe,Fe as span,Ne as trace};//# sourceMappingURL=bedrock.mjs.map
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)}
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
package/dist/gemini.d.mts CHANGED
@@ -20,6 +20,8 @@ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as Spa
20
20
 
21
21
  /**
22
22
  * Wrap a Gemini model with automatic tracing
23
+ *
24
+ * Supports both @google/generative-ai (old) and @google/genai (new) SDKs.
23
25
  */
24
26
  declare function observe<T>(client: T, options?: ObserveOptions): T;
25
27
 
package/dist/gemini.d.ts CHANGED
@@ -20,6 +20,8 @@ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as Spa
20
20
 
21
21
  /**
22
22
  * Wrap a Gemini model with automatic tracing
23
+ *
24
+ * Supports both @google/generative-ai (old) and @google/genai (new) SDKs.
23
25
  */
24
26
  declare function observe<T>(client: T, options?: ObserveOptions): T;
25
27
 
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 he=Object.defineProperty;var ye=(e,t,n)=>t in e?he(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var U=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var v=(e,t,n)=>ye(e,typeof t!="symbol"?t+"":t,n);var Z=Ce((lt,Se)=>{Se.exports={name:"@lelemondev/sdk",version:"0.9.9",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var z=false;function F(e){z=e;}function g(){return z?true:be("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function l(e,t){g()&&$("debug",e,t);}function D(e,t){g()&&$("info",e,t);}function x(e,t){$("warn",e,t);}function q(e,t,n,r){g()&&console.log(`${p} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function E(e,t){console.error(`${p} Failed to capture trace: provider=${e} error=${t.message}`);}function B(e){g()&&console.log(`${p} Wrapped client: provider=${e}`);}function V(e,t){g()&&console.log(`${p} Sending batch: count=${e} endpoint=${t}`);}function H(e,t){g()&&console.log(`${p} Batch sent successfully: count=${e} duration=${t}ms`);}function W(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${p} Batch send failed: count=${e} error=${n}`);}function Y(e,t,n){g()&&console.log(`${p} Request: ${e} ${t} (${n} bytes)`);}function X(e,t){g()&&console.log(`${p} 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(`${p} ${t}`,n):r(`${p} ${t}`);}function be(e){if(typeof process<"u"&&process.env)return process.env[e]}var we=10,Te=1e3,ve=1e4,M=class{constructor(t){v(this,"config");v(this,"queue",[]);v(this,"flushPromise",null);v(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??we,flushIntervalMs:t.flushIntervalMs??Te,requestTimeoutMs:t.requestTimeoutMs??ve};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),H(t.length,Date.now()-n);}catch(r){W(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,s=new AbortController,i=r?JSON.stringify(r):void 0;Y(t,o,i?.length??0);let d=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),u=Date.now();try{let a=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(d),X(a.status,Date.now()-u),!a.ok){let I=await a.text().catch(()=>"Unknown error");throw new Error(`HTTP ${a.status}: ${I}`)}let c=await a.text();return c?JSON.parse(c):{}}catch(a){throw clearTimeout(d),a instanceof Error&&a.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):a}}};var ke="@lelemondev/sdk",Ie="nodejs";function xe(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Ee(){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 Me(){try{if(typeof U<"u")return Z().version??"unknown"}catch{}return "unknown"}var b=null;function Q(e){if(!b){let n=xe(),r=Ee();b={"telemetry.sdk.name":ke,"telemetry.sdk.version":Me(),"telemetry.sdk.language":Ie},n&&(b["process.runtime.name"]=n.name,b["process.runtime.version"]=n.version),r&&(b["os.type"]=r);}let t={...b};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var A={},y=null,O=null,ee="https://api.lelemon.dev";function Ge(e={}){A=e,e.debug&&F(true),O=Q(e.service),D("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),y=te(e),y.isEnabled()?D("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function R(){return A}function G(){return O}function _e(){return C().isEnabled()}function C(){return y||(y=te(A)),y}async function Pe(){y&&await y.flush();}function te(e){let t=e.apiKey??De("LELEMON_API_KEY");return !t&&!e.disabled&&x("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 De(e){if(typeof process<"u"&&process.env)return process.env[e]}var j=Symbol.for("@lelemondev/sdk:globalContext");function oe(){let e=globalThis;return e[j]||(e[j]={context:{}}),e[j]}function se(e){oe().context=e,l("Global context updated",e);}function k(){return oe().context}function _(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=k(),r=f(),o=T(),s=G(),i={provider:e.provider,model:e.model,input:L(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId: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}:{},...s?{_telemetry:s}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return q(e.provider,e.model,e.durationMs,e.status),t.enqueue(i),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function w(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=k(),r=f(),o=G(),s={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:T(),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(s);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=k(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=G(),d={...n.metadata,...e.metadata,...i?{_telemetry:i}:{}};delete d._traceId,delete d._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:o??r?.traceId,spanId:T(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(u);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,qe=["api_key","apikey","password","secret","authorization"],$e=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Oe=["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 R().redaction??{}}function Ae(e){let t=e.toLowerCase();return Oe.includes(t)?false:!!(qe.some(r=>t.includes(r))||$e.some(r=>t.includes(r))||(ie().keys??[]).some(r=>t.includes(r.toLowerCase())))}function je(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 L(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=je(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=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Ae(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var N=Symbol.for("@lelemondev/sdk:traceStorage");function Le(){let e=globalThis;return e[N]||(e[N]=new async_hooks.AsyncLocalStorage),e[N]}var ae=Le();function T(){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 P(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 Ne(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ue(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function ze(e,t){let n=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??T(),s=T(),i={traceId:o,rootSpanId:s,currentSpanId:s,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(i,async()=>{let d,u;try{return d=await t(),d}catch(a){throw u=a instanceof Error?a:new Error(String(a)),a}finally{Ve(i,u?void 0:d,u);}})}var Fe=["text","content","message","output","response","result","answer"];function Be(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let 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 Fe)if(o in r&&typeof r[o]=="string")return r[o];return e}function Ve(e,t,n){let r=C();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=k(),s=Date.now()-e.startTime,i=n?null:Be(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:i,inputTokens:0,outputTokens:0,durationMs:s,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:s,hasError:!!n}),r.enqueue(d);}function He(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=Ne(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&&Ue(e.toolCallId);}var m="gemini";function ue(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 de(e){if(!e||typeof e!="object")return false;let t=e.constructor?.name;if(t==="GoogleGenerativeAI"||t==="GoogleGenAI")return true;let n=e;return !!(typeof n.getGenerativeModel=="function"||n.models&&typeof n.models.generate=="function"||ue(e))}function ce(e){if(ue(e)){let n=e;return le(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof s=="function"?We(s.bind(n)):s}})}function We(e){return function(n){let r=e(n);return le(r,n.model)}}function le(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="generateContent"&&typeof s=="function"?Ye(s.bind(n),t):r==="generateContentStream"&&typeof s=="function"?Xe(s.bind(n),t):r==="startChat"&&typeof s=="function"?Ze(s.bind(n),t):s}})}function Ye(e,t){return async function(r){let o=Date.now(),s=fe(r);try{let i=await e(r),d=Date.now()-o,u=ge(i.response),a=_({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=me(i.response);c.length>0&&P(c,a);}return i}catch(i){throw w({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:false}),i}}}function Xe(e,t){return async function(r){let o=Date.now(),s=fe(r);try{let i=await e(r),d=pe(i.stream,t,s,o);return {...i,stream:d}}catch(i){throw w({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:true}),i}}}async function*pe(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},s=null,i,d=false;try{for await(let u of e){try{let a=u.text();if(a){d||(d=!0,i=Date.now()-r);let c=o.candidates[0].content?.parts||[],I=c[c.length-1];I?.text!==void 0?I.text+=a:c.push({text:a});}}catch{}if(u.candidates?.[0]?.content?.parts)for(let a of u.candidates[0].content.parts)a.functionCall&&o.candidates[0].content?.parts?.push(a);u.usageMetadata&&(o.usageMetadata=u.usageMetadata),u.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=u.candidates[0].finishReason),yield u;}}catch(u){throw s=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-r;if(s)w({provider:m,model:t,input:n,error:s,durationMs:u,streaming:true});else {let a=_({provider:m,model:t,input:n,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:i});if(a){let c=tt(o.candidates);c.length>0&&P(c,a);}}}}function Ze(e,t){return function(r){let o=e(r);return Je(o,t)}}function Je(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="sendMessage"&&typeof s=="function"?Qe(s.bind(n),t):r==="sendMessageStream"&&typeof s=="function"?et(s.bind(n),t):s}})}function Qe(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=Date.now()-o,u=ge(i.response),a=_({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=me(i.response);c.length>0&&P(c,a);}return i}catch(i){throw w({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:false}),i}}}function et(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=pe(i.stream,t,s,o);return {...i,stream:d}}catch(i){throw w({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:true}),i}}}function fe(e){return typeof e=="string"?e:e.contents?e.contents:e}function ge(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function me(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 tt(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 jt(e,t){return t&&se(t),R().disabled?(l("Tracing disabled, returning unwrapped client"),e):de(e)?(B("gemini"),ce(e)):(x("Client is not a Gemini model. Use @lelemondev/sdk/gemini only with Google Generative AI SDK."),e)}
3
- exports.captureSpan=K;exports.flush=Pe;exports.getTraceContext=f;exports.init=Ge;exports.isEnabled=_e;exports.observe=jt;exports.span=He;exports.trace=ze;//# sourceMappingURL=gemini.js.map
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)}
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 me=Object.defineProperty;var he=(e,t,n)=>t in e?me(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var N=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ye=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>he(e,typeof t!="symbol"?t+"":t,n);var X=ye((ut,ve)=>{ve.exports={name:"@lelemondev/sdk",version:"0.9.9",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function z(e){U=e;}function g(){return U?true:Ce("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function l(e,t){g()&&q("debug",e,t);}function P(e,t){g()&&q("info",e,t);}function I(e,t){q("warn",e,t);}function D(e,t,n,r){g()&&console.log(`${p} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function x(e,t){console.error(`${p} Failed to capture trace: provider=${e} error=${t.message}`);}function F(e){g()&&console.log(`${p} Wrapped client: provider=${e}`);}function B(e,t){g()&&console.log(`${p} Sending batch: count=${e} endpoint=${t}`);}function V(e,t){g()&&console.log(`${p} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${p} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){g()&&console.log(`${p} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){g()&&console.log(`${p} Response: status=${e} duration=${t}ms`);}function q(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${p} ${t}`,n):r(`${p} ${t}`);}function Ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var be=10,we=1e3,Te=1e4,E=class{constructor(t){T(this,"config");T(this,"queue",[]);T(this,"flushPromise",null);T(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??be,flushIntervalMs:t.flushIntervalMs??we,requestTimeoutMs:t.requestTimeoutMs??Te};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();B(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,s=new AbortController,i=r?JSON.stringify(r):void 0;W(t,o,i?.length??0);let d=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),u=Date.now();try{let a=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(d),Y(a.status,Date.now()-u),!a.ok){let k=await a.text().catch(()=>"Unknown error");throw new Error(`HTTP ${a.status}: ${k}`)}let c=await a.text();return c?JSON.parse(c):{}}catch(a){throw clearTimeout(d),a instanceof Error&&a.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):a}}};var Se="@lelemondev/sdk",ke="nodejs";function Ie(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function xe(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Ee(){try{if(typeof N<"u")return X().version??"unknown"}catch{}return "unknown"}var C=null;function J(e){if(!C){let n=Ie(),r=xe();C={"telemetry.sdk.name":Se,"telemetry.sdk.version":Ee(),"telemetry.sdk.language":ke},n&&(C["process.runtime.name"]=n.name,C["process.runtime.version"]=n.version),r&&(C["os.type"]=r);}let t={...C};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var O={},h=null,$=null,Q="https://api.lelemon.dev";function Re(e={}){O=e,e.debug&&z(true),$=J(e.service),P("Initializing SDK",{endpoint:e.endpoint??Q,debug:e.debug??false,disabled:e.disabled??false,telemetry:$}),h=ee(e),h.isEnabled()?P("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function M(){return O}function R(){return $}function Ge(){return y().isEnabled()}function y(){return h||(h=ee(O)),h}async function _e(){h&&await h.flush();}function ee(e){let t=e.apiKey??Pe("LELEMON_API_KEY");return !t&&!e.disabled&&I("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new E({apiKey:t??"",endpoint:e.endpoint??Q,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var A=Symbol.for("@lelemondev/sdk:globalContext");function re(){let e=globalThis;return e[A]||(e[A]={context:{}}),e[A]}function oe(e){re().context=e,l("Global context updated",e);}function S(){return re().context}function G(e){try{let t=y();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=S(),r=f(),o=w(),s=R(),i={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?v(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}:{},...s?{_telemetry:s}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return D(e.provider,e.model,e.durationMs,e.status),t.enqueue(i),o}catch(t){x(e.provider,t instanceof Error?t:new Error(String(t)));return}}function b(e){try{let t=y();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=S(),r=f(),o=R(),s={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:w(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};D(e.provider,e.model,e.durationMs,"error"),l("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(s);}catch(t){x(e.provider,t instanceof Error?t:new Error(String(t)));}}function j(e){try{let t=y();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=S(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=R(),d={...n.metadata,...e.metadata,...i?{_telemetry:i}:{}};delete d._traceId,delete d._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:v(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:w(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:d,tags:n.tags};l(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(u);}catch(t){x("unknown",t instanceof Error?t:new Error(String(t)));}}var te=1e5,De=["api_key","apikey","password","secret","authorization"],qe=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],$e=["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 M().redaction??{}}function Oe(e){let t=e.toLowerCase();return $e.includes(t)?false:!!(De.some(r=>t.includes(r))||qe.some(r=>t.includes(r))||(se().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Ae(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 v(e,0)}function v(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>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=>v(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Oe(r)?n[r]="[REDACTED]":n[r]=v(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function Ke(){let e=globalThis;return e[L]||(e[L]=new AsyncLocalStorage),e[L]}var ie=Ke();function w(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return ie.getStore()}function _(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 Le(e){let t=f();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ne(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function Ue(e,t){let n=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??w(),s=w(),i={traceId:o,rootSpanId:s,currentSpanId:s,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(i,async()=>{let d,u;try{return d=await t(),d}catch(a){throw u=a instanceof Error?a:new Error(String(a)),a}finally{Be(i,u?void 0:d,u);}})}var ze=["text","content","message","output","response","result","answer"];function Fe(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 ze)if(o in r&&typeof r[o]=="string")return r[o];return e}function Be(e,t,n){let r=y();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=S(),s=Date.now()-e.startTime,i=n?null:Fe(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:i,inputTokens:0,outputTokens:0,durationMs:s,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:s,hasError:!!n}),r.enqueue(d);}function Ve(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=Le(e.toolCallId);j({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&Ne(e.toolCallId);}var m="gemini";function ae(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 ue(e){if(!e||typeof e!="object")return false;let t=e.constructor?.name;if(t==="GoogleGenerativeAI"||t==="GoogleGenAI")return true;let n=e;return !!(typeof n.getGenerativeModel=="function"||n.models&&typeof n.models.generate=="function"||ae(e))}function de(e){if(ae(e)){let n=e;return ce(n,n.model)}let t=e;return new Proxy(t,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof s=="function"?He(s.bind(n)):s}})}function He(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 s=Reflect.get(n,r,o);return r==="generateContent"&&typeof s=="function"?We(s.bind(n),t):r==="generateContentStream"&&typeof s=="function"?Ye(s.bind(n),t):r==="startChat"&&typeof s=="function"?Xe(s.bind(n),t):s}})}function We(e,t){return async function(r){let o=Date.now(),s=pe(r);try{let i=await e(r),d=Date.now()-o,u=fe(i.response),a=G({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ge(i.response);c.length>0&&_(c,a);}return i}catch(i){throw b({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:false}),i}}}function Ye(e,t){return async function(r){let o=Date.now(),s=pe(r);try{let i=await e(r),d=le(i.stream,t,s,o);return {...i,stream:d}}catch(i){throw b({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:true}),i}}}async function*le(e,t,n,r){let o={candidates:[{content:{parts:[]}}]},s=null,i,d=false;try{for await(let u of e){try{let a=u.text();if(a){d||(d=!0,i=Date.now()-r);let c=o.candidates[0].content?.parts||[],k=c[c.length-1];k?.text!==void 0?k.text+=a:c.push({text:a});}}catch{}if(u.candidates?.[0]?.content?.parts)for(let a of u.candidates[0].content.parts)a.functionCall&&o.candidates[0].content?.parts?.push(a);u.usageMetadata&&(o.usageMetadata=u.usageMetadata),u.candidates?.[0]?.finishReason&&(o.candidates[0].finishReason=u.candidates[0].finishReason),yield u;}}catch(u){throw s=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-r;if(s)b({provider:m,model:t,input:n,error:s,durationMs:u,streaming:true});else {let a=G({provider:m,model:t,input:n,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:i});if(a){let c=et(o.candidates);c.length>0&&_(c,a);}}}}function Xe(e,t){return function(r){let o=e(r);return Ze(o,t)}}function Ze(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="sendMessage"&&typeof s=="function"?Je(s.bind(n),t):r==="sendMessageStream"&&typeof s=="function"?Qe(s.bind(n),t):s}})}function Je(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=Date.now()-o,u=fe(i.response),a=G({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ge(i.response);c.length>0&&_(c,a);}return i}catch(i){throw b({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:false}),i}}}function Qe(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=le(i.stream,t,s,o);return {...i,stream:d}}catch(i){throw b({provider:m,model:t,input:s,error:i instanceof Error?i:new Error(String(i)),durationMs:Date.now()-o,streaming:true}),i}}}function pe(e){return typeof e=="string"?e:e.contents?e.contents:e}function fe(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function ge(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 et(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 Gt(e,t){return t&&oe(t),M().disabled?(l("Tracing disabled, returning unwrapped client"),e):ue(e)?(F("gemini"),de(e)):(I("Client is not a Gemini model. Use @lelemondev/sdk/gemini only with Google Generative AI SDK."),e)}
3
- export{j as captureSpan,_e as flush,f as getTraceContext,Re as init,Ge as isEnabled,Gt as observe,Ve as span,Ue as trace};//# sourceMappingURL=gemini.mjs.map
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)}
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
@@ -0,0 +1,31 @@
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.mjs';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-CiUL-4hv.mjs';
3
+
4
+ /**
5
+ * Google GenAI Provider Entry Point
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { init, observe, flush } from '@lelemondev/sdk/google-genai';
10
+ * import { GoogleGenAI } from '@google/genai';
11
+ *
12
+ * init({ apiKey: process.env.LELEMON_API_KEY });
13
+ * const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
14
+ * const client = observe(ai);
15
+ *
16
+ * const response = await client.models.generateContent({
17
+ * model: 'gemini-pro',
18
+ * contents: 'Hello!',
19
+ * });
20
+ * await flush();
21
+ * ```
22
+ */
23
+
24
+ /**
25
+ * Wrap a Google GenAI client with automatic tracing
26
+ *
27
+ * Supports both @google/genai (new) and @google/generative-ai (old) SDKs.
28
+ */
29
+ declare function observe<T>(client: T, options?: ObserveOptions): T;
30
+
31
+ export { ObserveOptions, observe };
@@ -0,0 +1,31 @@
1
+ import { O as ObserveOptions } from './capture-CiUL-4hv.js';
2
+ export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-CiUL-4hv.js';
3
+
4
+ /**
5
+ * Google GenAI Provider Entry Point
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { init, observe, flush } from '@lelemondev/sdk/google-genai';
10
+ * import { GoogleGenAI } from '@google/genai';
11
+ *
12
+ * init({ apiKey: process.env.LELEMON_API_KEY });
13
+ * const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
14
+ * const client = observe(ai);
15
+ *
16
+ * const response = await client.models.generateContent({
17
+ * model: 'gemini-pro',
18
+ * contents: 'Hello!',
19
+ * });
20
+ * await flush();
21
+ * ```
22
+ */
23
+
24
+ /**
25
+ * Wrap a Google GenAI client with automatic tracing
26
+ *
27
+ * Supports both @google/genai (new) and @google/generative-ai (old) SDKs.
28
+ */
29
+ declare function observe<T>(client: T, options?: ObserveOptions): T;
30
+
31
+ export { ObserveOptions, observe };
@@ -0,0 +1,4 @@
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 Google GenAI or Gemini model. Use @lelemondev/sdk/google-genai with Google GenAI or Google Generative AI SDK."),e)}
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=google-genai.js.map
4
+ //# sourceMappingURL=google-genai.js.map
@@ -0,0 +1,4 @@
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 Google GenAI or Gemini model. Use @lelemondev/sdk/google-genai with Google GenAI or Google Generative AI SDK."),e)}
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=google-genai.mjs.map
4
+ //# sourceMappingURL=google-genai.mjs.map