@lelemondev/sdk 0.9.5 → 0.9.6

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/gemini.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- var de=Object.defineProperty;var ce=(e,t,n)=>t in e?de(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>ce(e,typeof t!="symbol"?t+"":t,n);var H=le((Ze,he)=>{he.exports={name:"@lelemondev/sdk",version:"0.9.5",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 K=false;function L(e){K=e;}function g(){return K?true:pe("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function l(e,t){g()&&D("debug",e,t);}function P(e,t){g()&&D("info",e,t);}function x(e,t){D("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 I(e,t){console.error(`${p} Failed to capture trace: provider=${e} error=${t.message}`);}function N(e){g()&&console.log(`${p} Wrapped client: provider=${e}`);}function U(e,t){g()&&console.log(`${p} Sending batch: count=${e} endpoint=${t}`);}function z(e,t){g()&&console.log(`${p} Batch sent successfully: count=${e} duration=${t}ms`);}function F(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${p} Batch send failed: count=${e} error=${n}`);}function V(e,t,n){g()&&console.log(`${p} Request: ${e} ${t} (${n} bytes)`);}function B(e,t){g()&&console.log(`${p} Response: status=${e} duration=${t}ms`);}function D(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 pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,me=1e4,M=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??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??me};}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();U(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),z(t.length,Date.now()-n);}catch(r){F(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,s=new AbortController,i=r?JSON.stringify(r):void 0;V(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),B(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 Ce="@lelemondev/sdk",ye="nodejs";function we(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function be(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Te(){try{if(typeof A<"u")return H().version??"unknown"}catch{}return "unknown"}var y=null;function Y(e){if(!y){let n=we(),r=be();y={"telemetry.sdk.name":Ce,"telemetry.sdk.version":Te(),"telemetry.sdk.language":ye},n&&(y["process.runtime.name"]=n.name,y["process.runtime.version"]=n.version),r&&(y["os.type"]=r);}let t={...y};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var $={},h=null,_=null,J="https://api.lelemon.dev";function Se(e={}){$=e,e.debug&&L(true),_=Y(e.service),P("Initializing SDK",{endpoint:e.endpoint??J,debug:e.debug??false,disabled:e.disabled??false,telemetry:_}),h=Q(e),h.isEnabled()?P("SDK initialized - tracing enabled"):l("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function X(){return $}function E(){return _}function ke(){return C().isEnabled()}function C(){return h||(h=Q($)),h}async function xe(){h&&await h.flush();}function Q(e){let t=e.apiKey??Ie("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??J,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ie(e){if(typeof process<"u"&&process.env)return process.env[e]}var ee={};function te(e){ee=e,l("Global context updated",e);}function S(){return ee}function R(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=S(),r=f(),o=b(),s=E(),i={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?v(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...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){I(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=S(),r=f(),o=E(),s={provider:e.provider,model:e.model,input:j(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:b(),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){I(e.provider,t instanceof Error?t:new Error(String(t)));}}function O(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=S(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=E(),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:j(e.input),output:v(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:b(),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){I("unknown",t instanceof Error?t:new Error(String(t)));}}var Z=1e5,Me=["api_key","apikey","password","secret","authorization"],Ee=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Re=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Ge(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Me.some(n=>t.includes(n))||Ee.some(n=>t.includes(n)))}function j(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")return e.length>Z?e.slice(0,Z)+"...[truncated]":e;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))Ge(r)?n[r]="[REDACTED]":n[r]=v(o,t+1);return n}return String(e)}var ne=new AsyncLocalStorage;function b(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return ne.getStore()}function G(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 De(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function _e(e,t){let n=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??b(),s=b(),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,pendingToolCalls:new Map};return ne.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{$e(i,u?void 0:d,u);}})}function $e(e,t,n){let r=C();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=S(),s=Date.now()-e.startTime,i=n?null:t,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:o.sessionId,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 Oe(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);O({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&&De(e.toolCallId);}var m="gemini";function re(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")}function oe(e){let t=e;return new Proxy(t,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof s=="function"?je(s.bind(n)):s}})}function je(e){return function(n){let r=e(n);return Ae(r,n.model)}}function Ae(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="generateContent"&&typeof s=="function"?Ke(s.bind(n),t):r==="generateContentStream"&&typeof s=="function"?Le(s.bind(n),t):r==="startChat"&&typeof s=="function"?Ne(s.bind(n),t):s}})}function Ke(e,t){return async function(r){let o=Date.now(),s=ie(r);try{let i=await e(r),d=Date.now()-o,u=ae(i.response),a=R({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ue(i.response);c.length>0&&G(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 Le(e,t){return async function(r){let o=Date.now(),s=ie(r);try{let i=await e(r),d=se(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*se(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)w({provider:m,model:t,input:n,error:s,durationMs:u,streaming:true});else {let a=R({provider:m,model:t,input:n,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:i});if(a){let c=Ve(o.candidates);c.length>0&&G(c,a);}}}}function Ne(e,t){return function(r){let o=e(r);return Ue(o,t)}}function Ue(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="sendMessage"&&typeof s=="function"?ze(s.bind(n),t):r==="sendMessageStream"&&typeof s=="function"?Fe(s.bind(n),t):s}})}function ze(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=Date.now()-o,u=ae(i.response),a=R({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ue(i.response);c.length>0&&G(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 Fe(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=se(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 ie(e){return typeof e=="string"?e:e.contents?e.contents:e}function ae(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function ue(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 Ve(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 Tt(e,t){return t&&te(t),X().disabled?(l("Tracing disabled, returning unwrapped client"),e):re(e)?(N("gemini"),oe(e)):(x("Client is not a Gemini model. Use @lelemondev/sdk/gemini only with Google Generative AI SDK."),e)}
3
- export{O as captureSpan,xe as flush,f as getTraceContext,Se as init,ke as isEnabled,Tt as observe,Oe as span,_e as trace};//# sourceMappingURL=gemini.mjs.map
2
+ var le=Object.defineProperty;var pe=(e,t,n)=>t in e?le(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var 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 fe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>pe(e,typeof t!="symbol"?t+"":t,n);var Y=fe((nt,ye)=>{ye.exports={name:"@lelemondev/sdk",version:"0.9.6",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var N=false;function U(e){N=e;}function g(){return N?true:ge("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function l(e,t){g()&&D("debug",e,t);}function P(e,t){g()&&D("info",e,t);}function k(e,t){D("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 I(e,t){console.error(`${p} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){g()&&console.log(`${p} Wrapped client: provider=${e}`);}function F(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 B(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${p} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){g()&&console.log(`${p} Request: ${e} ${t} (${n} bytes)`);}function W(e,t){g()&&console.log(`${p} Response: status=${e} duration=${t}ms`);}function D(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 ge(e){if(typeof process<"u"&&process.env)return process.env[e]}var me=10,he=1e3,Ce=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??me,flushIntervalMs:t.flushIntervalMs??he,requestTimeoutMs:t.requestTimeoutMs??Ce};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){B(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,s=new AbortController,i=r?JSON.stringify(r):void 0;H(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),W(a.status,Date.now()-u),!a.ok){let x=await a.text().catch(()=>"Unknown error");throw new Error(`HTTP ${a.status}: ${x}`)}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 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 ve(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Se(){try{if(typeof L<"u")return Y().version??"unknown"}catch{}return "unknown"}var y=null;function J(e){if(!y){let n=Te(),r=ve();y={"telemetry.sdk.name":be,"telemetry.sdk.version":Se(),"telemetry.sdk.language":we},n&&(y["process.runtime.name"]=n.name,y["process.runtime.version"]=n.version),r&&(y["os.type"]=r);}let t={...y};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var $={},h=null,_=null,Q="https://api.lelemon.dev";function ke(e={}){$=e,e.debug&&U(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 Z(){return $}function M(){return _}function Ie(){return C().isEnabled()}function C(){return h||(h=ee($)),h}async function Ee(){h&&await h.flush();}function ee(e){let t=e.apiKey??Me("LELEMON_API_KEY");return !t&&!e.disabled&&k("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 Me(e){if(typeof process<"u"&&process.env)return process.env[e]}var O=Symbol.for("@lelemondev/sdk:globalContext");function ne(){let e=globalThis;return e[O]||(e[O]={context:{}}),e[O]}function re(e){ne().context=e,l("Global context updated",e);}function S(){return ne().context}function R(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping trace capture");return}let n=S(),r=f(),o=w(),s=M(),i={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?v(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...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){I(e.provider,t instanceof Error?t:new Error(String(t)));return}}function b(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping error capture");return}let n=S(),r=f(),o=M(),s={provider:e.provider,model:e.model,input:j(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:w(),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){I(e.provider,t instanceof Error?t:new Error(String(t)));}}function A(e){try{let t=C();if(!t.isEnabled()){l("Transport disabled, skipping span capture");return}let n=S(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=M(),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:j(e.input),output:v(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId: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){I("unknown",t instanceof Error?t:new Error(String(t)));}}var te=1e5,Re=["api_key","apikey","password","secret","authorization"],Ge=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Pe=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function qe(e){let t=e.toLowerCase();return Pe.includes(t)?false:!!(Re.some(n=>t.includes(n))||Ge.some(n=>t.includes(n)))}function j(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")return e.length>te?e.slice(0,te)+"...[truncated]":e;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))qe(r)?n[r]="[REDACTED]":n[r]=v(o,t+1);return n}return String(e)}var K=Symbol.for("@lelemondev/sdk:traceStorage");function _e(){let e=globalThis;return e[K]||(e[K]=new AsyncLocalStorage),e[K]}var oe=_e();function w(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return oe.getStore()}function G(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 Oe(e){let t=f();t&&t.pendingToolCalls.delete(e);}async function Ae(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,pendingToolCalls:new Map};return oe.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{je(i,u?void 0:d,u);}})}function je(e,t,n){let r=C();if(!r.isEnabled()){l("Transport disabled, skipping root span");return}let o=S(),s=Date.now()-e.startTime,i=n?null:t,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:o.sessionId,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 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=$e(e.toolCallId);A({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&&Oe(e.toolCallId);}var m="gemini";function se(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")}function ie(e){let t=e;return new Proxy(t,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="getGenerativeModel"&&typeof s=="function"?Le(s.bind(n)):s}})}function Le(e){return function(n){let r=e(n);return Ne(r,n.model)}}function Ne(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="generateContent"&&typeof s=="function"?Ue(s.bind(n),t):r==="generateContentStream"&&typeof s=="function"?ze(s.bind(n),t):r==="startChat"&&typeof s=="function"?Fe(s.bind(n),t):s}})}function Ue(e,t){return async function(r){let o=Date.now(),s=ue(r);try{let i=await e(r),d=Date.now()-o,u=de(i.response),a=R({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ce(i.response);c.length>0&&G(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 ze(e,t){return async function(r){let o=Date.now(),s=ue(r);try{let i=await e(r),d=ae(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*ae(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||[],x=c[c.length-1];x?.text!==void 0?x.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=R({provider:m,model:t,input:n,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:i});if(a){let c=We(o.candidates);c.length>0&&G(c,a);}}}}function Fe(e,t){return function(r){let o=e(r);return Ve(o,t)}}function Ve(e,t){return new Proxy(e,{get(n,r,o){let s=Reflect.get(n,r,o);return r==="sendMessage"&&typeof s=="function"?Be(s.bind(n),t):r==="sendMessageStream"&&typeof s=="function"?He(s.bind(n),t):s}})}function Be(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=Date.now()-o,u=de(i.response),a=R({provider:m,model:t,input:s,rawResponse:u,durationMs:d,status:"success",streaming:!1});if(a){let c=ce(i.response);c.length>0&&G(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 He(e,t){return async function(r){let o=Date.now(),s=r;try{let i=await e(r),d=ae(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 ue(e){return typeof e=="string"?e:e.contents?e.contents:e}function de(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function ce(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 We(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 xt(e,t){return t&&re(t),Z().disabled?(l("Tracing disabled, returning unwrapped client"),e):se(e)?(z("gemini"),ie(e)):(k("Client is not a Gemini model. Use @lelemondev/sdk/gemini only with Google Generative AI SDK."),e)}
3
+ export{A as captureSpan,Ee as flush,f as getTraceContext,ke as init,Ie as isEnabled,xt as observe,Ke as span,Ae as trace};//# sourceMappingURL=gemini.mjs.map
4
4
  //# sourceMappingURL=gemini.mjs.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
2
- var Ge=Object.defineProperty;var je=(e,n,t)=>n in e?Ge(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var W=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ue=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var P=(e,n,t)=>je(e,typeof n!="symbol"?n+"":n,t);var re=Ue((ut,Ke)=>{Ke.exports={name:"@lelemondev/sdk",version:"0.9.5",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 Y=false;function X(e){Y=e;}function I(){return Y?true:qe("LELEMON_DEBUG")==="true"}var b="[Lelemon]";function w(e,n){I()&&K("debug",e,n);}function $(e,n){I()&&K("info",e,n);}function B(e,n){K("warn",e,n);}function L(e,n,t,o){I()&&console.log(`${b} Captured trace: provider=${e} model=${n} duration=${t}ms status=${o}`);}function G(e,n){console.error(`${b} Failed to capture trace: provider=${e} error=${n.message}`);}function _(e){I()&&console.log(`${b} Wrapped client: provider=${e}`);}function Q(e,n){I()&&console.log(`${b} Sending batch: count=${e} endpoint=${n}`);}function Z(e,n){I()&&console.log(`${b} Batch sent successfully: count=${e} duration=${n}ms`);}function ee(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${b} Batch send failed: count=${e} error=${t}`);}function ne(e,n,t){I()&&console.log(`${b} Request: ${e} ${n} (${t} bytes)`);}function te(e,n){I()&&console.log(`${b} Response: status=${e} duration=${n}ms`);}function K(e,n,t){let o=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?o(`${b} ${n}`,t):o(`${b} ${n}`);}function qe(e){if(typeof process<"u"&&process.env)return process.env[e]}var Ne=10,$e=1e3,Le=1e4,j=class{constructor(n){P(this,"config");P(this,"queue",[]);P(this,"flushPromise",null);P(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??Ne,flushIntervalMs:n.flushIntervalMs??$e,requestTimeoutMs:n.requestTimeoutMs??Le};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),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 n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).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(n){if(n.length===0)return;let t=Date.now();Q(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),Z(n.length,Date.now()-t);}catch(o){ee(n.length,o);}}async request(n,t,o){let r=`${this.config.endpoint}${t}`,s=new AbortController,a=o?JSON.stringify(o):void 0;ne(n,r,a?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let i=await fetch(r,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:s.signal});if(clearTimeout(u),te(i.status,Date.now()-c),!i.ok){let l=await i.text().catch(()=>"Unknown error");throw new Error(`HTTP ${i.status}: ${l}`)}let d=await i.text();return d?JSON.parse(d):{}}catch(i){throw clearTimeout(u),i instanceof Error&&i.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):i}}};var Je="@lelemondev/sdk",Fe="nodejs";function ze(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Ve(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function He(){try{if(typeof W<"u")return re().version??"unknown"}catch{}return "unknown"}var M=null;function se(e){if(!M){let t=ze(),o=Ve();M={"telemetry.sdk.name":Je,"telemetry.sdk.version":He(),"telemetry.sdk.language":Fe},t&&(M["process.runtime.name"]=t.name,M["process.runtime.version"]=t.version),o&&(M["os.type"]=o);}let n={...M};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var F={},R=null,J=null,ae="https://api.lelemon.dev";function Ye(e={}){F=e,e.debug&&X(true),J=se(e.service),$("Initializing SDK",{endpoint:e.endpoint??ae,debug:e.debug??false,disabled:e.disabled??false,telemetry:J}),R=ue(e),R.isEnabled()?$("SDK initialized - tracing enabled"):w("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ie(){return F}function U(){return J}function Xe(){return T().isEnabled()}function T(){return R||(R=ue(F)),R}async function Qe(){R&&await R.flush();}function ue(e){let n=e.apiKey??Ze("LELEMON_API_KEY");return !n&&!e.disabled&&B("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new j({apiKey:n??"",endpoint:e.endpoint??ae,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ze(e){if(typeof process<"u"&&process.env)return process.env[e]}var le={};function de(e){le=e,w("Global context updated",e);}function D(){return le}function f(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping trace capture");return}let t=D(),o=C(),r=E(),s=U(),a={provider:e.provider,model:e.model,input:V(e.input),rawResponse:e.rawResponse?A(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:r,parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return L(e.provider,e.model,e.durationMs,e.status),n.enqueue(a),r}catch(n){G(e.provider,n instanceof Error?n:new Error(String(n)));return}}function m(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping error capture");return}let t=D(),o=C(),r=U(),s={provider:e.provider,model:e.model,input:V(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:E(),parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...r?{_telemetry:r}:{}},tags:t.tags};L(e.provider,e.model,e.durationMs,"error"),w("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){G(e.provider,n instanceof Error?n:new Error(String(n)));}}function z(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping span capture");return}let t=D(),o=C(),r=e.metadata?._traceId,s=e.metadata?._parentSpanId,a=U(),u={...t.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:V(e.input),output:A(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:r??o?.traceId,spanId:E(),parentSpanId:s??o?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:t.tags};w(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){G("unknown",n instanceof Error?n:new Error(String(n)));}}var ce=1e5,en=["api_key","apikey","password","secret","authorization"],nn=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],tn=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function rn(e){let n=e.toLowerCase();return tn.includes(n)?false:!!(en.some(t=>n.includes(t))||nn.some(t=>n.includes(t)))}function V(e){return A(e,0)}function A(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ce?e.slice(0,ce)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>A(t,n+1));if(typeof e=="object"){let t={};for(let[o,r]of Object.entries(e))rn(o)?t[o]="[REDACTED]":t[o]=A(r,n+1);return t}return String(e)}var pe=new async_hooks.AsyncLocalStorage;function E(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function C(){return pe.getStore()}function k(e,n){let t=C();if(t)for(let o of e)t.pendingToolCalls.set(o,n),w(`Registered tool call ${o} \u2192 LLM span ${n}`);}function sn(e){let n=C();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function an(e){let n=C();n&&n.pendingToolCalls.delete(e);}async function un(e,n){let t=typeof e=="string"?{name:e}:e,o=C(),r=o?.traceId??E(),s=E(),a={traceId:r,rootSpanId:s,currentSpanId:s,parentSpanId:o?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return pe.run(a,async()=>{let u,c;try{return u=await n(),u}catch(i){throw c=i instanceof Error?i:new Error(String(i)),i}finally{cn(a,c?void 0:u,c);}})}function cn(e,n,t){let o=T();if(!o.isEnabled()){w("Transport disabled, skipping root span");return}let r=D(),s=Date.now()-e.startTime,a=t?null:n,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:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:r.sessionId,userId:r.userId,metadata:{...r.metadata,...e.metadata},tags:e.tags??r.tags};w(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),o.enqueue(u);}function ln(e){let n=C();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=sn(e.toolCallId);z({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:n.traceId,_parentSpanId:t}}),e.toolCallId&&an(e.toolCallId);}var h="openai";function me(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function fe(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&ge(a))return dn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:h,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i){let d=he(c);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function ge(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*dn(e,n,t){let o={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false,u=new Map;try{for await(let c of e){let i=c,d=i?.choices?.[0]?.delta?.content;d&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=d);let l=i?.choices?.[0]?.delta?.tool_calls;if(l)for(let g of l){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let N=u.get(g.index);g.id&&(N.id=g.id),g.function?.name&&(N.function.name=g.function.name),g.function?.arguments&&(N.function.arguments+=g.function.arguments);}let p=i?.choices?.[0]?.finish_reason;p&&(o.choices[0].finish_reason=p),i?.usage&&(o.usage=i.usage),yield c;}}catch(c){throw r=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(o.choices[0].message.tool_calls=Array.from(u.entries()).sort((i,d)=>i[0]-d[0]).map(([,i])=>i)),r)m({provider:h,model:n.model||"unknown",input:n.messages,error:r,durationMs:c,streaming:true});else {let i=f({provider:h,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(i){let d=he(o);d.length>0&&k(d,i);}}}}function we(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&ge(a))return pn(a,r,o);let u=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}async function*pn(e,n,t){let o=[],r=null,s=null;try{for await(let a of e){o.push(a);let u=a;u.type==="response.done"&&u.response&&(r=u.response),yield a;}}catch(a){throw s=a instanceof Error?a:new Error(String(a)),a}finally{let a=Date.now()-t;s?m({provider:h,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:a,streaming:true}):f({provider:h,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:r||{streamEvents:o},durationMs:a,status:"success",streaming:true});}}function ke(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:r.prompt,rawResponse:s,durationMs:a,status:"success",streaming:!1}),s}catch(s){let a=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function ye(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:r.input,rawResponse:s,durationMs:a,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let a=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.input,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function he(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let o of t)o.id&&n.push(o.id);return n}var x="anthropic";function be(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let t=e;return !!(t.messages&&typeof t.messages=="object")}function Ce(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&fn(a))return wn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:x,model:r.model||c.model||"unknown",input:{system:r.system,messages:r.messages},rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i&&c.content){let d=H(c.content);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:x,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function ve(e){return function(...t){let o=Date.now(),r=t[0]||{};try{let s=e(...t);return s&&typeof s=="object"?gn(s,r,o):s}catch(s){let a=Date.now()-o;throw m({provider:x,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:true}),s}}}function fn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function gn(e,n,t){let o=e;if(!o[Symbol.asyncIterator])return e;let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=false,a,u=false,c=null,i=[],d=async function*(){try{for await(let l of o){if(l.type==="message_start"&&l.message&&(r.model=l.message.model,r.id=l.message.id,r.role=l.message.role,l.message.usage&&(r.usage={...l.message.usage})),l.type==="content_block_start"&&l.content_block&&(c=l.index??i.length,i[c]={...l.content_block},l.content_block.type==="text"&&(i[c].text=""),l.content_block.type==="thinking"&&(i[c].thinking="")),l.type==="content_block_delta"&&l.delta&&c!==null){let p=i[c];p&&(l.delta.text&&(u||(u=!0,a=Date.now()-t),p.type==="thinking"?p.thinking=(p.thinking||"")+l.delta.text:p.type==="text"&&(p.text=(p.text||"")+l.delta.text)),l.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+l.delta.partial_json));}if(l.type==="content_block_stop"&&c!==null){let p=i[c];if(p&&p.type==="tool_use"){let g=p._inputJson;if(g){try{p.input=JSON.parse(g);}catch{}delete p._inputJson;}}c=null;}l.type==="message_delta"&&(l.usage?.output_tokens&&(r.usage.output_tokens=l.usage.output_tokens),l.delta?.stop_reason&&(r.stop_reason=l.delta.stop_reason)),yield l;}}catch(l){if(!s){s=true;let p=Date.now()-t;m({provider:x,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:l instanceof Error?l:new Error(String(l)),durationMs:p,streaming:true});}throw l}finally{if(!s){s=true;let l=Date.now()-t;r.content=i.filter(Boolean);let p=f({provider:x,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:r,durationMs:l,status:"success",streaming:true,firstTokenMs:a});if(p&&r.content){let g=H(r.content);g.length>0&&k(g,p);}}}};return new Proxy(e,{get(l,p,g){return p===Symbol.asyncIterator?()=>d()[Symbol.asyncIterator]():Reflect.get(l,p,g)}})}async function*wn(e,n,t){let o={content:[],usage:{input_tokens:0,output_tokens:0}},r=null,s,a=false,u=null,c=[];try{for await(let i of e){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(u=i.index??c.length,c[u]={...i.content_block},i.content_block.type==="text"&&(c[u].text=""),i.content_block.type==="thinking"&&(c[u].thinking="")),i.type==="content_block_delta"&&i.delta&&u!==null){let d=c[u];d&&(i.delta.text&&(a||(a=!0,s=Date.now()-t),d.type==="thinking"?d.thinking=(d.thinking||"")+i.delta.text:d.type==="text"&&(d.text=(d.text||"")+i.delta.text)),i.delta.partial_json&&d.type==="tool_use"&&(d._inputJson=(d._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&u!==null){let d=c[u];if(d&&d.type==="tool_use"){let l=d._inputJson;if(l){try{d.input=JSON.parse(l);}catch{}delete d._inputJson;}}u=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;if(o.content=c.filter(Boolean),r)m({provider:x,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let d=f({provider:x,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(d&&o.content){let l=H(o.content);l.length>0&&k(l,d);}}}}function H(e){let n=[];for(let t of e)t.type==="tool_use"&&t.id&&n.push(t.id);return n}var v="bedrock";function Ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let t=e;return typeof t.send!="function"||!t.config||typeof t.config!="object"?false:"region"in t.config}function Se(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="send"&&typeof s=="function"?yn(s.bind(t)):s}})}function yn(e){return async function(t){switch(t.constructor?.name||""){case "ConverseCommand":return hn(e,t);case "ConverseStreamCommand":return bn(e,t);case "InvokeModelCommand":return vn(e,t);case "InvokeModelWithResponseStreamCommand":return In(e,t);default:return e(t)}}}async function hn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=f({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},rawResponse:Re(r),durationMs:s,status:"success",streaming:!1});if(a){let u=Te(r);u.length>0&&k(u,a);}return r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function bn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.stream?{...r,stream:Cn(r.stream,o,t)}:r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*Cn(e,n,t){let o={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},r=null,s,a=false,u=new Map,c=new Map;try{for await(let i of e){if(i.contentBlockStart){let d=i.contentBlockStart.contentBlockIndex;if(i.contentBlockStart.start?.toolUse){let l=i.contentBlockStart.start.toolUse;u.set(d,{toolUse:{toolUseId:l.toolUseId,name:l.name,input:{}}}),c.set(d,"");}else u.set(d,{text:""});}if(i.contentBlockDelta){let d=i.contentBlockDelta.contentBlockIndex,l=u.get(d);if(l&&i.contentBlockDelta.delta?.text&&(a||(a=!0,s=Date.now()-t),l.text=(l.text||"")+i.contentBlockDelta.delta.text),l?.toolUse&&i.contentBlockDelta.delta?.toolUse?.input){let p=c.get(d)||"";c.set(d,p+i.contentBlockDelta.delta.toolUse.input);}}if(i.contentBlockStop){let d=i.contentBlockStop.contentBlockIndex,l=u.get(d),p=c.get(d);if(l?.toolUse&&p)try{l.toolUse.input=JSON.parse(p);}catch{}}i.messageStop?.stopReason&&(o.stopReason=i.messageStop.stopReason),i.metadata?.usage&&(o.usage={inputTokens:i.metadata.usage.inputTokens||0,outputTokens:i.metadata.usage.outputTokens||0}),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t,d=Array.from(u.entries()).sort((l,p)=>l[0]-p[0]).map(([,l])=>l);if(o.output.message.content=d,r)m({provider:v,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let l=f({provider:v,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},rawResponse:Re(o),durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(l){let p=Te(o);p.length>0&&k(p,l);}}}}async function vn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=Rn(r.body);return f({provider:v,model:o.modelId||"unknown",input:O(o.body),rawResponse:a,durationMs:s,status:"success",streaming:!1}),r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:O(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function In(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.body?{...r,body:Sn(r.body,o,t)}:r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:O(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*Sn(e,n,t){let o=[],r=null;try{for await(let s of e){if(s.chunk?.bytes){let a=Tn(s.chunk.bytes);a&&o.push(a);}yield s;}}catch(s){throw r=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-t;r?m({provider:v,model:n.modelId||"unknown",input:O(n.body),error:r,durationMs:s,streaming:true}):f({provider:v,model:n.modelId||"unknown",input:O(n.body),rawResponse:{streamEvents:o},durationMs:s,status:"success",streaming:true});}}function Re(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Te(e){let n=[],t=e.output?.message?.content;if(Array.isArray(t))for(let o of t)o.toolUse?.toolUseId&&n.push(o.toolUse.toolUseId);return n}function O(e){try{let n=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(n)}catch{return e}}function Rn(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}function Tn(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}var S="gemini";function xe(e){if(!e||typeof e!="object")return false;let n=e.constructor?.name;if(n==="GoogleGenerativeAI"||n==="GoogleGenAI")return true;let t=e;return !!(typeof t.getGenerativeModel=="function"||t.models&&typeof t.models.generate=="function")}function _e(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="getGenerativeModel"&&typeof s=="function"?_n(s.bind(t)):s}})}function _n(e){return function(t){let o=e(t);return Mn(o,t.model)}}function Mn(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="generateContent"&&typeof s=="function"?En(s.bind(t),n):o==="generateContentStream"&&typeof s=="function"?Pn(s.bind(t),n):o==="startChat"&&typeof s=="function"?An(s.bind(t),n):s}})}function En(e,n){return async function(o){let r=Date.now(),s=Ee(o);try{let a=await e(o),u=Date.now()-r,c=Pe(a.response),i=f({provider:S,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Ae(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function Pn(e,n){return async function(o){let r=Date.now(),s=Ee(o);try{let a=await e(o),u=Me(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}async function*Me(e,n,t,o){let r={candidates:[{content:{parts:[]}}]},s=null,a,u=false;try{for await(let c of e){try{let i=c.text();if(i){u||(u=!0,a=Date.now()-o);let d=r.candidates[0].content?.parts||[],l=d[d.length-1];l?.text!==void 0?l.text+=i:d.push({text:i});}}catch{}if(c.candidates?.[0]?.content?.parts)for(let i of c.candidates[0].content.parts)i.functionCall&&r.candidates[0].content?.parts?.push(i);c.usageMetadata&&(r.usageMetadata=c.usageMetadata),c.candidates?.[0]?.finishReason&&(r.candidates[0].finishReason=c.candidates[0].finishReason),yield c;}}catch(c){throw s=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-o;if(s)m({provider:S,model:n,input:t,error:s,durationMs:c,streaming:true});else {let i=f({provider:S,model:n,input:t,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:a});if(i){let d=Gn(r.candidates);d.length>0&&k(d,i);}}}}function An(e,n){return function(o){let r=e(o);return Dn(r,n)}}function Dn(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="sendMessage"&&typeof s=="function"?On(s.bind(t),n):o==="sendMessageStream"&&typeof s=="function"?Bn(s.bind(t),n):s}})}function On(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Date.now()-r,c=Pe(a.response),i=f({provider:S,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Ae(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function Bn(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Me(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}function Ee(e){return typeof e=="string"?e:e.contents?e.contents:e}function Pe(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function Ae(e){let n=[],t=e.candidates?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}function Gn(e){let n=[],t=e?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}var Un="openrouter.ai",q="openrouter";function De(e){if(!e||typeof e!="object")return false;let n=e;return n.chat?.completions?.create?(n.baseURL||"").includes(Un):false}function Oe(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?qn(s):s}})}function qn(e){return e&&new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Nn(r):r}})}function Nn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?$n(r.bind(n)):r}})}function $n(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&Ln(a))return Kn(a,r,o);let u=Date.now()-o,c=a;return f({provider:q,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:q,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Ln(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Kn(e,n,t){let o={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false;try{for await(let u of e){let c=u;!o.id&&c.id&&(o.id=c.id);let i=c.choices?.[0]?.delta?.content;i&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=i);let d=c.choices?.[0]?.finish_reason;d&&(o.choices[0].finish_reason=d),c.usage&&(o.usage=c.usage),yield u;}}catch(u){throw r=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-t;r?m({provider:q,model:n.model||"unknown",input:n.messages,error:r,durationMs:u,streaming:true}):f({provider:q,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:s});}}function Be(e,n){return n&&de(n),ie().disabled?(w("Tracing disabled, returning unwrapped client"),e):De(e)?(_("openrouter"),Oe(e)):me(e)?(_("openai"),Fn(e)):be(e)?(_("anthropic"),Xn(e)):Ie(e)?(_("bedrock"),Se(e)):xe(e)?(_("gemini"),_e(e)):(B("Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini"),e)}function Fn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?zn(s):o==="responses"&&s&&typeof s=="object"?Hn(s):o==="completions"&&s&&typeof s=="object"?Wn(s):o==="embeddings"&&s&&typeof s=="object"?Yn(s):s}})}function zn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Vn(r):r}})}function Vn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?fe(r.bind(n)):r}})}function Hn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?we(r.bind(n)):r}})}function Wn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ke(r.bind(n)):r}})}function Yn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ye(r.bind(n)):r}})}function Xn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="messages"&&s&&typeof s=="object"?Qn(s):s}})}function Qn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?Ce(r.bind(n)):t==="stream"&&typeof r=="function"?ve(r.bind(n)):r}})}function Zn(e){return function(t,o){return Be(t,{...e,...o})}}
3
- exports.captureSpan=z;exports.createObserve=Zn;exports.flush=Qe;exports.getTraceContext=C;exports.init=Ye;exports.isEnabled=Xe;exports.observe=Be;exports.span=ln;exports.trace=un;//# sourceMappingURL=index.js.map
2
+ var Ue=Object.defineProperty;var qe=(e,n,t)=>n in e?Ue(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var X=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ne=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var P=(e,n,t)=>qe(e,typeof n!="symbol"?n+"":n,t);var se=Ne((dt,Fe)=>{Fe.exports={name:"@lelemondev/sdk",version:"0.9.6",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var Q=false;function Z(e){Q=e;}function S(){return Q?true:$e("LELEMON_DEBUG")==="true"}var b="[Lelemon]";function w(e,n){S()&&K("debug",e,n);}function $(e,n){S()&&K("info",e,n);}function B(e,n){K("warn",e,n);}function L(e,n,t,o){S()&&console.log(`${b} Captured trace: provider=${e} model=${n} duration=${t}ms status=${o}`);}function G(e,n){console.error(`${b} Failed to capture trace: provider=${e} error=${n.message}`);}function _(e){S()&&console.log(`${b} Wrapped client: provider=${e}`);}function ee(e,n){S()&&console.log(`${b} Sending batch: count=${e} endpoint=${n}`);}function ne(e,n){S()&&console.log(`${b} Batch sent successfully: count=${e} duration=${n}ms`);}function te(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${b} Batch send failed: count=${e} error=${t}`);}function re(e,n,t){S()&&console.log(`${b} Request: ${e} ${n} (${t} bytes)`);}function oe(e,n){S()&&console.log(`${b} Response: status=${e} duration=${n}ms`);}function K(e,n,t){let o=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?o(`${b} ${n}`,t):o(`${b} ${n}`);}function $e(e){if(typeof process<"u"&&process.env)return process.env[e]}var Le=10,Ke=1e3,Je=1e4,j=class{constructor(n){P(this,"config");P(this,"queue",[]);P(this,"flushPromise",null);P(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??Le,flushIntervalMs:n.flushIntervalMs??Ke,requestTimeoutMs:n.requestTimeoutMs??Je};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),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 n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).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(n){if(n.length===0)return;let t=Date.now();ee(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),ne(n.length,Date.now()-t);}catch(o){te(n.length,o);}}async request(n,t,o){let r=`${this.config.endpoint}${t}`,s=new AbortController,a=o?JSON.stringify(o):void 0;re(n,r,a?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let i=await fetch(r,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:s.signal});if(clearTimeout(u),oe(i.status,Date.now()-c),!i.ok){let l=await i.text().catch(()=>"Unknown error");throw new Error(`HTTP ${i.status}: ${l}`)}let d=await i.text();return d?JSON.parse(d):{}}catch(i){throw clearTimeout(u),i instanceof Error&&i.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):i}}};var ze="@lelemondev/sdk",Ve="nodejs";function He(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function We(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Ye(){try{if(typeof X<"u")return se().version??"unknown"}catch{}return "unknown"}var E=null;function ie(e){if(!E){let t=He(),o=We();E={"telemetry.sdk.name":ze,"telemetry.sdk.version":Ye(),"telemetry.sdk.language":Ve},t&&(E["process.runtime.name"]=t.name,E["process.runtime.version"]=t.version),o&&(E["os.type"]=o);}let n={...E};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var F={},R=null,J=null,ue="https://api.lelemon.dev";function Qe(e={}){F=e,e.debug&&Z(true),J=ie(e.service),$("Initializing SDK",{endpoint:e.endpoint??ue,debug:e.debug??false,disabled:e.disabled??false,telemetry:J}),R=le(e),R.isEnabled()?$("SDK initialized - tracing enabled"):w("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ce(){return F}function U(){return J}function Ze(){return T().isEnabled()}function T(){return R||(R=le(F)),R}async function en(){R&&await R.flush();}function le(e){let n=e.apiKey??nn("LELEMON_API_KEY");return !n&&!e.disabled&&B("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new j({apiKey:n??"",endpoint:e.endpoint??ue,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function nn(e){if(typeof process<"u"&&process.env)return process.env[e]}var z=Symbol.for("@lelemondev/sdk:globalContext");function pe(){let e=globalThis;return e[z]||(e[z]={context:{}}),e[z]}function me(e){pe().context=e,w("Global context updated",e);}function D(){return pe().context}function f(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping trace capture");return}let t=D(),o=C(),r=M(),s=U(),a={provider:e.provider,model:e.model,input:H(e.input),rawResponse:e.rawResponse?A(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:r,parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return L(e.provider,e.model,e.durationMs,e.status),n.enqueue(a),r}catch(n){G(e.provider,n instanceof Error?n:new Error(String(n)));return}}function m(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping error capture");return}let t=D(),o=C(),r=U(),s={provider:e.provider,model:e.model,input:H(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:M(),parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...r?{_telemetry:r}:{}},tags:t.tags};L(e.provider,e.model,e.durationMs,"error"),w("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){G(e.provider,n instanceof Error?n:new Error(String(n)));}}function V(e){try{let n=T();if(!n.isEnabled()){w("Transport disabled, skipping span capture");return}let t=D(),o=C(),r=e.metadata?._traceId,s=e.metadata?._parentSpanId,a=U(),u={...t.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:H(e.input),output:A(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:r??o?.traceId,spanId:M(),parentSpanId:s??o?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:t.tags};w(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){G("unknown",n instanceof Error?n:new Error(String(n)));}}var de=1e5,tn=["api_key","apikey","password","secret","authorization"],rn=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],on=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function sn(e){let n=e.toLowerCase();return on.includes(n)?false:!!(tn.some(t=>n.includes(t))||rn.some(t=>n.includes(t)))}function H(e){return A(e,0)}function A(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>de?e.slice(0,de)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>A(t,n+1));if(typeof e=="object"){let t={};for(let[o,r]of Object.entries(e))sn(o)?t[o]="[REDACTED]":t[o]=A(r,n+1);return t}return String(e)}var W=Symbol.for("@lelemondev/sdk:traceStorage");function un(){let e=globalThis;return e[W]||(e[W]=new async_hooks.AsyncLocalStorage),e[W]}var fe=un();function M(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function C(){return fe.getStore()}function k(e,n){let t=C();if(t)for(let o of e)t.pendingToolCalls.set(o,n),w(`Registered tool call ${o} \u2192 LLM span ${n}`);}function cn(e){let n=C();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function ln(e){let n=C();n&&n.pendingToolCalls.delete(e);}async function dn(e,n){let t=typeof e=="string"?{name:e}:e,o=C(),r=o?.traceId??M(),s=M(),a={traceId:r,rootSpanId:s,currentSpanId:s,parentSpanId:o?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return fe.run(a,async()=>{let u,c;try{return u=await n(),u}catch(i){throw c=i instanceof Error?i:new Error(String(i)),i}finally{pn(a,c?void 0:u,c);}})}function pn(e,n,t){let o=T();if(!o.isEnabled()){w("Transport disabled, skipping root span");return}let r=D(),s=Date.now()-e.startTime,a=t?null:n,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:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:r.sessionId,userId:r.userId,metadata:{...r.metadata,...e.metadata},tags:e.tags??r.tags};w(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),o.enqueue(u);}function mn(e){let n=C();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=cn(e.toolCallId);V({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:n.traceId,_parentSpanId:t}}),e.toolCallId&&ln(e.toolCallId);}var h="openai";function ge(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function we(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&ke(a))return fn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:h,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i){let d=Ce(c);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function ke(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*fn(e,n,t){let o={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false,u=new Map;try{for await(let c of e){let i=c,d=i?.choices?.[0]?.delta?.content;d&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=d);let l=i?.choices?.[0]?.delta?.tool_calls;if(l)for(let g of l){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let N=u.get(g.index);g.id&&(N.id=g.id),g.function?.name&&(N.function.name=g.function.name),g.function?.arguments&&(N.function.arguments+=g.function.arguments);}let p=i?.choices?.[0]?.finish_reason;p&&(o.choices[0].finish_reason=p),i?.usage&&(o.usage=i.usage),yield c;}}catch(c){throw r=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(o.choices[0].message.tool_calls=Array.from(u.entries()).sort((i,d)=>i[0]-d[0]).map(([,i])=>i)),r)m({provider:h,model:n.model||"unknown",input:n.messages,error:r,durationMs:c,streaming:true});else {let i=f({provider:h,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(i){let d=Ce(o);d.length>0&&k(d,i);}}}}function ye(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&ke(a))return gn(a,r,o);let u=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}async function*gn(e,n,t){let o=[],r=null,s=null;try{for await(let a of e){o.push(a);let u=a;u.type==="response.done"&&u.response&&(r=u.response),yield a;}}catch(a){throw s=a instanceof Error?a:new Error(String(a)),a}finally{let a=Date.now()-t;s?m({provider:h,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:a,streaming:true}):f({provider:h,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:r||{streamEvents:o},durationMs:a,status:"success",streaming:true});}}function he(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:r.prompt,rawResponse:s,durationMs:a,status:"success",streaming:!1}),s}catch(s){let a=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function be(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:h,model:r.model||"unknown",input:r.input,rawResponse:s,durationMs:a,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let a=Date.now()-o;throw m({provider:h,model:r.model||"unknown",input:r.input,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function Ce(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let o of t)o.id&&n.push(o.id);return n}var x="anthropic";function ve(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let t=e;return !!(t.messages&&typeof t.messages=="object")}function Se(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&kn(a))return hn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:x,model:r.model||c.model||"unknown",input:{system:r.system,messages:r.messages},rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i&&c.content){let d=Y(c.content);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:x,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Ie(e){return function(...t){let o=Date.now(),r=t[0]||{};try{let s=e(...t);return s&&typeof s=="object"?yn(s,r,o):s}catch(s){let a=Date.now()-o;throw m({provider:x,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:true}),s}}}function kn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function yn(e,n,t){let o=e;if(!o[Symbol.asyncIterator])return e;let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=false,a,u=false,c=null,i=[],d=async function*(){try{for await(let l of o){if(l.type==="message_start"&&l.message&&(r.model=l.message.model,r.id=l.message.id,r.role=l.message.role,l.message.usage&&(r.usage={...l.message.usage})),l.type==="content_block_start"&&l.content_block&&(c=l.index??i.length,i[c]={...l.content_block},l.content_block.type==="text"&&(i[c].text=""),l.content_block.type==="thinking"&&(i[c].thinking="")),l.type==="content_block_delta"&&l.delta&&c!==null){let p=i[c];p&&(l.delta.text&&(u||(u=!0,a=Date.now()-t),p.type==="thinking"?p.thinking=(p.thinking||"")+l.delta.text:p.type==="text"&&(p.text=(p.text||"")+l.delta.text)),l.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+l.delta.partial_json));}if(l.type==="content_block_stop"&&c!==null){let p=i[c];if(p&&p.type==="tool_use"){let g=p._inputJson;if(g){try{p.input=JSON.parse(g);}catch{}delete p._inputJson;}}c=null;}l.type==="message_delta"&&(l.usage?.output_tokens&&(r.usage.output_tokens=l.usage.output_tokens),l.delta?.stop_reason&&(r.stop_reason=l.delta.stop_reason)),yield l;}}catch(l){if(!s){s=true;let p=Date.now()-t;m({provider:x,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:l instanceof Error?l:new Error(String(l)),durationMs:p,streaming:true});}throw l}finally{if(!s){s=true;let l=Date.now()-t;r.content=i.filter(Boolean);let p=f({provider:x,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:r,durationMs:l,status:"success",streaming:true,firstTokenMs:a});if(p&&r.content){let g=Y(r.content);g.length>0&&k(g,p);}}}};return new Proxy(e,{get(l,p,g){return p===Symbol.asyncIterator?()=>d()[Symbol.asyncIterator]():Reflect.get(l,p,g)}})}async function*hn(e,n,t){let o={content:[],usage:{input_tokens:0,output_tokens:0}},r=null,s,a=false,u=null,c=[];try{for await(let i of e){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(u=i.index??c.length,c[u]={...i.content_block},i.content_block.type==="text"&&(c[u].text=""),i.content_block.type==="thinking"&&(c[u].thinking="")),i.type==="content_block_delta"&&i.delta&&u!==null){let d=c[u];d&&(i.delta.text&&(a||(a=!0,s=Date.now()-t),d.type==="thinking"?d.thinking=(d.thinking||"")+i.delta.text:d.type==="text"&&(d.text=(d.text||"")+i.delta.text)),i.delta.partial_json&&d.type==="tool_use"&&(d._inputJson=(d._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&u!==null){let d=c[u];if(d&&d.type==="tool_use"){let l=d._inputJson;if(l){try{d.input=JSON.parse(l);}catch{}delete d._inputJson;}}u=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;if(o.content=c.filter(Boolean),r)m({provider:x,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let d=f({provider:x,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(d&&o.content){let l=Y(o.content);l.length>0&&k(l,d);}}}}function Y(e){let n=[];for(let t of e)t.type==="tool_use"&&t.id&&n.push(t.id);return n}var v="bedrock";function Re(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let t=e;return typeof t.send!="function"||!t.config||typeof t.config!="object"?false:"region"in t.config}function Te(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="send"&&typeof s=="function"?Cn(s.bind(t)):s}})}function Cn(e){return async function(t){switch(t.constructor?.name||""){case "ConverseCommand":return vn(e,t);case "ConverseStreamCommand":return Sn(e,t);case "InvokeModelCommand":return Rn(e,t);case "InvokeModelWithResponseStreamCommand":return Tn(e,t);default:return e(t)}}}async function vn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=f({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},rawResponse:xe(r),durationMs:s,status:"success",streaming:!1});if(a){let u=_e(r);u.length>0&&k(u,a);}return r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function Sn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.stream?{...r,stream:In(r.stream,o,t)}:r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*In(e,n,t){let o={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},r=null,s,a=false,u=new Map,c=new Map;try{for await(let i of e){if(i.contentBlockStart){let d=i.contentBlockStart.contentBlockIndex;if(i.contentBlockStart.start?.toolUse){let l=i.contentBlockStart.start.toolUse;u.set(d,{toolUse:{toolUseId:l.toolUseId,name:l.name,input:{}}}),c.set(d,"");}else u.set(d,{text:""});}if(i.contentBlockDelta){let d=i.contentBlockDelta.contentBlockIndex,l=u.get(d);if(l&&i.contentBlockDelta.delta?.text&&(a||(a=!0,s=Date.now()-t),l.text=(l.text||"")+i.contentBlockDelta.delta.text),l?.toolUse&&i.contentBlockDelta.delta?.toolUse?.input){let p=c.get(d)||"";c.set(d,p+i.contentBlockDelta.delta.toolUse.input);}}if(i.contentBlockStop){let d=i.contentBlockStop.contentBlockIndex,l=u.get(d),p=c.get(d);if(l?.toolUse&&p)try{l.toolUse.input=JSON.parse(p);}catch{}}i.messageStop?.stopReason&&(o.stopReason=i.messageStop.stopReason),i.metadata?.usage&&(o.usage={inputTokens:i.metadata.usage.inputTokens||0,outputTokens:i.metadata.usage.outputTokens||0}),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t,d=Array.from(u.entries()).sort((l,p)=>l[0]-p[0]).map(([,l])=>l);if(o.output.message.content=d,r)m({provider:v,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let l=f({provider:v,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},rawResponse:xe(o),durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(l){let p=_e(o);p.length>0&&k(p,l);}}}}async function Rn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=_n(r.body);return f({provider:v,model:o.modelId||"unknown",input:O(o.body),rawResponse:a,durationMs:s,status:"success",streaming:!1}),r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:O(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function Tn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.body?{...r,body:xn(r.body,o,t)}:r}catch(r){throw m({provider:v,model:o.modelId||"unknown",input:O(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*xn(e,n,t){let o=[],r=null;try{for await(let s of e){if(s.chunk?.bytes){let a=En(s.chunk.bytes);a&&o.push(a);}yield s;}}catch(s){throw r=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-t;r?m({provider:v,model:n.modelId||"unknown",input:O(n.body),error:r,durationMs:s,streaming:true}):f({provider:v,model:n.modelId||"unknown",input:O(n.body),rawResponse:{streamEvents:o},durationMs:s,status:"success",streaming:true});}}function xe(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function _e(e){let n=[],t=e.output?.message?.content;if(Array.isArray(t))for(let o of t)o.toolUse?.toolUseId&&n.push(o.toolUse.toolUseId);return n}function O(e){try{let n=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(n)}catch{return e}}function _n(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}function En(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}var I="gemini";function Ee(e){if(!e||typeof e!="object")return false;let n=e.constructor?.name;if(n==="GoogleGenerativeAI"||n==="GoogleGenAI")return true;let t=e;return !!(typeof t.getGenerativeModel=="function"||t.models&&typeof t.models.generate=="function")}function Me(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="getGenerativeModel"&&typeof s=="function"?Pn(s.bind(t)):s}})}function Pn(e){return function(t){let o=e(t);return An(o,t.model)}}function An(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="generateContent"&&typeof s=="function"?Dn(s.bind(t),n):o==="generateContentStream"&&typeof s=="function"?On(s.bind(t),n):o==="startChat"&&typeof s=="function"?Bn(s.bind(t),n):s}})}function Dn(e,n){return async function(o){let r=Date.now(),s=Ae(o);try{let a=await e(o),u=Date.now()-r,c=De(a.response),i=f({provider:I,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Oe(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function On(e,n){return async function(o){let r=Date.now(),s=Ae(o);try{let a=await e(o),u=Pe(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}async function*Pe(e,n,t,o){let r={candidates:[{content:{parts:[]}}]},s=null,a,u=false;try{for await(let c of e){try{let i=c.text();if(i){u||(u=!0,a=Date.now()-o);let d=r.candidates[0].content?.parts||[],l=d[d.length-1];l?.text!==void 0?l.text+=i:d.push({text:i});}}catch{}if(c.candidates?.[0]?.content?.parts)for(let i of c.candidates[0].content.parts)i.functionCall&&r.candidates[0].content?.parts?.push(i);c.usageMetadata&&(r.usageMetadata=c.usageMetadata),c.candidates?.[0]?.finishReason&&(r.candidates[0].finishReason=c.candidates[0].finishReason),yield c;}}catch(c){throw s=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-o;if(s)m({provider:I,model:n,input:t,error:s,durationMs:c,streaming:true});else {let i=f({provider:I,model:n,input:t,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:a});if(i){let d=qn(r.candidates);d.length>0&&k(d,i);}}}}function Bn(e,n){return function(o){let r=e(o);return Gn(r,n)}}function Gn(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="sendMessage"&&typeof s=="function"?jn(s.bind(t),n):o==="sendMessageStream"&&typeof s=="function"?Un(s.bind(t),n):s}})}function jn(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Date.now()-r,c=De(a.response),i=f({provider:I,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Oe(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function Un(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Pe(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}function Ae(e){return typeof e=="string"?e:e.contents?e.contents:e}function De(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function Oe(e){let n=[],t=e.candidates?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}function qn(e){let n=[],t=e?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}var $n="openrouter.ai",q="openrouter";function Be(e){if(!e||typeof e!="object")return false;let n=e;return n.chat?.completions?.create?(n.baseURL||"").includes($n):false}function Ge(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?Ln(s):s}})}function Ln(e){return e&&new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Kn(r):r}})}function Kn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?Jn(r.bind(n)):r}})}function Jn(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&Fn(a))return zn(a,r,o);let u=Date.now()-o,c=a;return f({provider:q,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:q,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Fn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*zn(e,n,t){let o={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false;try{for await(let u of e){let c=u;!o.id&&c.id&&(o.id=c.id);let i=c.choices?.[0]?.delta?.content;i&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=i);let d=c.choices?.[0]?.finish_reason;d&&(o.choices[0].finish_reason=d),c.usage&&(o.usage=c.usage),yield u;}}catch(u){throw r=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-t;r?m({provider:q,model:n.model||"unknown",input:n.messages,error:r,durationMs:u,streaming:true}):f({provider:q,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:s});}}function je(e,n){return n&&me(n),ce().disabled?(w("Tracing disabled, returning unwrapped client"),e):Be(e)?(_("openrouter"),Ge(e)):ge(e)?(_("openai"),Hn(e)):ve(e)?(_("anthropic"),et(e)):Re(e)?(_("bedrock"),Te(e)):Ee(e)?(_("gemini"),Me(e)):(B("Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini"),e)}function Hn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?Wn(s):o==="responses"&&s&&typeof s=="object"?Xn(s):o==="completions"&&s&&typeof s=="object"?Qn(s):o==="embeddings"&&s&&typeof s=="object"?Zn(s):s}})}function Wn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Yn(r):r}})}function Yn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?we(r.bind(n)):r}})}function Xn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ye(r.bind(n)):r}})}function Qn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?he(r.bind(n)):r}})}function Zn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?be(r.bind(n)):r}})}function et(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="messages"&&s&&typeof s=="object"?nt(s):s}})}function nt(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?Se(r.bind(n)):t==="stream"&&typeof r=="function"?Ie(r.bind(n)):r}})}function tt(e){return function(t,o){return je(t,{...e,...o})}}
3
+ exports.captureSpan=V;exports.createObserve=tt;exports.flush=en;exports.getTraceContext=C;exports.init=Qe;exports.isEnabled=Ze;exports.observe=je;exports.span=mn;exports.trace=dn;//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
2
- var Be=Object.defineProperty;var Ge=(e,n,t)=>n in e?Be(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var H=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var je=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var E=(e,n,t)=>Ge(e,typeof n!="symbol"?n+"":n,t);var te=je((st,Le)=>{Le.exports={name:"@lelemondev/sdk",version:"0.9.5",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 W=false;function Y(e){W=e;}function v(){return W?true:Ue("LELEMON_DEBUG")==="true"}var h="[Lelemon]";function w(e,n){v()&&L("debug",e,n);}function N(e,n){v()&&L("info",e,n);}function O(e,n){L("warn",e,n);}function $(e,n,t,o){v()&&console.log(`${h} Captured trace: provider=${e} model=${n} duration=${t}ms status=${o}`);}function B(e,n){console.error(`${h} Failed to capture trace: provider=${e} error=${n.message}`);}function x(e){v()&&console.log(`${h} Wrapped client: provider=${e}`);}function X(e,n){v()&&console.log(`${h} Sending batch: count=${e} endpoint=${n}`);}function Q(e,n){v()&&console.log(`${h} Batch sent successfully: count=${e} duration=${n}ms`);}function Z(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${h} Batch send failed: count=${e} error=${t}`);}function ee(e,n,t){v()&&console.log(`${h} Request: ${e} ${n} (${t} bytes)`);}function ne(e,n){v()&&console.log(`${h} Response: status=${e} duration=${n}ms`);}function L(e,n,t){let o=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?o(`${h} ${n}`,t):o(`${h} ${n}`);}function Ue(e){if(typeof process<"u"&&process.env)return process.env[e]}var qe=10,Ne=1e3,$e=1e4,G=class{constructor(n){E(this,"config");E(this,"queue",[]);E(this,"flushPromise",null);E(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??qe,flushIntervalMs:n.flushIntervalMs??Ne,requestTimeoutMs:n.requestTimeoutMs??$e};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),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 n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).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(n){if(n.length===0)return;let t=Date.now();X(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),Q(n.length,Date.now()-t);}catch(o){Z(n.length,o);}}async request(n,t,o){let r=`${this.config.endpoint}${t}`,s=new AbortController,a=o?JSON.stringify(o):void 0;ee(n,r,a?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let i=await fetch(r,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:s.signal});if(clearTimeout(u),ne(i.status,Date.now()-c),!i.ok){let l=await i.text().catch(()=>"Unknown error");throw new Error(`HTTP ${i.status}: ${l}`)}let d=await i.text();return d?JSON.parse(d):{}}catch(i){throw clearTimeout(u),i instanceof Error&&i.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):i}}};var Ke="@lelemondev/sdk",Je="nodejs";function Fe(){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 ze(){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 H<"u")return te().version??"unknown"}catch{}return "unknown"}var _=null;function oe(e){if(!_){let t=Fe(),o=ze();_={"telemetry.sdk.name":Ke,"telemetry.sdk.version":Ve(),"telemetry.sdk.language":Je},t&&(_["process.runtime.name"]=t.name,_["process.runtime.version"]=t.version),o&&(_["os.type"]=o);}let n={..._};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var J={},S=null,K=null,se="https://api.lelemon.dev";function We(e={}){J=e,e.debug&&Y(true),K=oe(e.service),N("Initializing SDK",{endpoint:e.endpoint??se,debug:e.debug??false,disabled:e.disabled??false,telemetry:K}),S=ie(e),S.isEnabled()?N("SDK initialized - tracing enabled"):w("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ae(){return J}function j(){return K}function Ye(){return R().isEnabled()}function R(){return S||(S=ie(J)),S}async function Xe(){S&&await S.flush();}function ie(e){let n=e.apiKey??Qe("LELEMON_API_KEY");return !n&&!e.disabled&&O("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new G({apiKey:n??"",endpoint:e.endpoint??se,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Qe(e){if(typeof process<"u"&&process.env)return process.env[e]}var ce={};function le(e){ce=e,w("Global context updated",e);}function A(){return ce}function f(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping trace capture");return}let t=A(),o=b(),r=M(),s=j(),a={provider:e.provider,model:e.model,input:z(e.input),rawResponse:e.rawResponse?P(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:r,parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),n.enqueue(a),r}catch(n){B(e.provider,n instanceof Error?n:new Error(String(n)));return}}function m(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping error capture");return}let t=A(),o=b(),r=j(),s={provider:e.provider,model:e.model,input:z(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:M(),parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...r?{_telemetry:r}:{}},tags:t.tags};$(e.provider,e.model,e.durationMs,"error"),w("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){B(e.provider,n instanceof Error?n:new Error(String(n)));}}function F(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping span capture");return}let t=A(),o=b(),r=e.metadata?._traceId,s=e.metadata?._parentSpanId,a=j(),u={...t.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:z(e.input),output:P(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:r??o?.traceId,spanId:M(),parentSpanId:s??o?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:t.tags};w(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){B("unknown",n instanceof Error?n:new Error(String(n)));}}var ue=1e5,Ze=["api_key","apikey","password","secret","authorization"],en=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],nn=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function tn(e){let n=e.toLowerCase();return nn.includes(n)?false:!!(Ze.some(t=>n.includes(t))||en.some(t=>n.includes(t)))}function z(e){return P(e,0)}function P(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ue?e.slice(0,ue)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>P(t,n+1));if(typeof e=="object"){let t={};for(let[o,r]of Object.entries(e))tn(o)?t[o]="[REDACTED]":t[o]=P(r,n+1);return t}return String(e)}var de=new AsyncLocalStorage;function M(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function b(){return de.getStore()}function k(e,n){let t=b();if(t)for(let o of e)t.pendingToolCalls.set(o,n),w(`Registered tool call ${o} \u2192 LLM span ${n}`);}function on(e){let n=b();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function sn(e){let n=b();n&&n.pendingToolCalls.delete(e);}async function an(e,n){let t=typeof e=="string"?{name:e}:e,o=b(),r=o?.traceId??M(),s=M(),a={traceId:r,rootSpanId:s,currentSpanId:s,parentSpanId:o?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return de.run(a,async()=>{let u,c;try{return u=await n(),u}catch(i){throw c=i instanceof Error?i:new Error(String(i)),i}finally{un(a,c?void 0:u,c);}})}function un(e,n,t){let o=R();if(!o.isEnabled()){w("Transport disabled, skipping root span");return}let r=A(),s=Date.now()-e.startTime,a=t?null:n,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:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:r.sessionId,userId:r.userId,metadata:{...r.metadata,...e.metadata},tags:e.tags??r.tags};w(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),o.enqueue(u);}function cn(e){let n=b();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=on(e.toolCallId);F({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:n.traceId,_parentSpanId:t}}),e.toolCallId&&sn(e.toolCallId);}var y="openai";function pe(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function me(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&fe(a))return ln(a,r,o);let u=Date.now()-o,c=a,i=f({provider:y,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i){let d=ye(c);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function fe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*ln(e,n,t){let o={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false,u=new Map;try{for await(let c of e){let i=c,d=i?.choices?.[0]?.delta?.content;d&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=d);let l=i?.choices?.[0]?.delta?.tool_calls;if(l)for(let g of l){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let q=u.get(g.index);g.id&&(q.id=g.id),g.function?.name&&(q.function.name=g.function.name),g.function?.arguments&&(q.function.arguments+=g.function.arguments);}let p=i?.choices?.[0]?.finish_reason;p&&(o.choices[0].finish_reason=p),i?.usage&&(o.usage=i.usage),yield c;}}catch(c){throw r=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(o.choices[0].message.tool_calls=Array.from(u.entries()).sort((i,d)=>i[0]-d[0]).map(([,i])=>i)),r)m({provider:y,model:n.model||"unknown",input:n.messages,error:r,durationMs:c,streaming:true});else {let i=f({provider:y,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(i){let d=ye(o);d.length>0&&k(d,i);}}}}function ge(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&fe(a))return dn(a,r,o);let u=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}async function*dn(e,n,t){let o=[],r=null,s=null;try{for await(let a of e){o.push(a);let u=a;u.type==="response.done"&&u.response&&(r=u.response),yield a;}}catch(a){throw s=a instanceof Error?a:new Error(String(a)),a}finally{let a=Date.now()-t;s?m({provider:y,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:a,streaming:true}):f({provider:y,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:r||{streamEvents:o},durationMs:a,status:"success",streaming:true});}}function we(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:r.prompt,rawResponse:s,durationMs:a,status:"success",streaming:!1}),s}catch(s){let a=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function ke(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:r.input,rawResponse:s,durationMs:a,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let a=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.input,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function ye(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let o of t)o.id&&n.push(o.id);return n}var T="anthropic";function he(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let t=e;return !!(t.messages&&typeof t.messages=="object")}function be(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&mn(a))return gn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:T,model:r.model||c.model||"unknown",input:{system:r.system,messages:r.messages},rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i&&c.content){let d=V(c.content);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:T,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Ce(e){return function(...t){let o=Date.now(),r=t[0]||{};try{let s=e(...t);return s&&typeof s=="object"?fn(s,r,o):s}catch(s){let a=Date.now()-o;throw m({provider:T,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:true}),s}}}function mn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function fn(e,n,t){let o=e;if(!o[Symbol.asyncIterator])return e;let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=false,a,u=false,c=null,i=[],d=async function*(){try{for await(let l of o){if(l.type==="message_start"&&l.message&&(r.model=l.message.model,r.id=l.message.id,r.role=l.message.role,l.message.usage&&(r.usage={...l.message.usage})),l.type==="content_block_start"&&l.content_block&&(c=l.index??i.length,i[c]={...l.content_block},l.content_block.type==="text"&&(i[c].text=""),l.content_block.type==="thinking"&&(i[c].thinking="")),l.type==="content_block_delta"&&l.delta&&c!==null){let p=i[c];p&&(l.delta.text&&(u||(u=!0,a=Date.now()-t),p.type==="thinking"?p.thinking=(p.thinking||"")+l.delta.text:p.type==="text"&&(p.text=(p.text||"")+l.delta.text)),l.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+l.delta.partial_json));}if(l.type==="content_block_stop"&&c!==null){let p=i[c];if(p&&p.type==="tool_use"){let g=p._inputJson;if(g){try{p.input=JSON.parse(g);}catch{}delete p._inputJson;}}c=null;}l.type==="message_delta"&&(l.usage?.output_tokens&&(r.usage.output_tokens=l.usage.output_tokens),l.delta?.stop_reason&&(r.stop_reason=l.delta.stop_reason)),yield l;}}catch(l){if(!s){s=true;let p=Date.now()-t;m({provider:T,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:l instanceof Error?l:new Error(String(l)),durationMs:p,streaming:true});}throw l}finally{if(!s){s=true;let l=Date.now()-t;r.content=i.filter(Boolean);let p=f({provider:T,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:r,durationMs:l,status:"success",streaming:true,firstTokenMs:a});if(p&&r.content){let g=V(r.content);g.length>0&&k(g,p);}}}};return new Proxy(e,{get(l,p,g){return p===Symbol.asyncIterator?()=>d()[Symbol.asyncIterator]():Reflect.get(l,p,g)}})}async function*gn(e,n,t){let o={content:[],usage:{input_tokens:0,output_tokens:0}},r=null,s,a=false,u=null,c=[];try{for await(let i of e){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(u=i.index??c.length,c[u]={...i.content_block},i.content_block.type==="text"&&(c[u].text=""),i.content_block.type==="thinking"&&(c[u].thinking="")),i.type==="content_block_delta"&&i.delta&&u!==null){let d=c[u];d&&(i.delta.text&&(a||(a=!0,s=Date.now()-t),d.type==="thinking"?d.thinking=(d.thinking||"")+i.delta.text:d.type==="text"&&(d.text=(d.text||"")+i.delta.text)),i.delta.partial_json&&d.type==="tool_use"&&(d._inputJson=(d._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&u!==null){let d=c[u];if(d&&d.type==="tool_use"){let l=d._inputJson;if(l){try{d.input=JSON.parse(l);}catch{}delete d._inputJson;}}u=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;if(o.content=c.filter(Boolean),r)m({provider:T,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let d=f({provider:T,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(d&&o.content){let l=V(o.content);l.length>0&&k(l,d);}}}}function V(e){let n=[];for(let t of e)t.type==="tool_use"&&t.id&&n.push(t.id);return n}var C="bedrock";function ve(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let t=e;return typeof t.send!="function"||!t.config||typeof t.config!="object"?false:"region"in t.config}function Ie(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="send"&&typeof s=="function"?kn(s.bind(t)):s}})}function kn(e){return async function(t){switch(t.constructor?.name||""){case "ConverseCommand":return yn(e,t);case "ConverseStreamCommand":return hn(e,t);case "InvokeModelCommand":return Cn(e,t);case "InvokeModelWithResponseStreamCommand":return vn(e,t);default:return e(t)}}}async function yn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=f({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},rawResponse:Se(r),durationMs:s,status:"success",streaming:!1});if(a){let u=Re(r);u.length>0&&k(u,a);}return r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function hn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.stream?{...r,stream:bn(r.stream,o,t)}:r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*bn(e,n,t){let o={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},r=null,s,a=false,u=new Map,c=new Map;try{for await(let i of e){if(i.contentBlockStart){let d=i.contentBlockStart.contentBlockIndex;if(i.contentBlockStart.start?.toolUse){let l=i.contentBlockStart.start.toolUse;u.set(d,{toolUse:{toolUseId:l.toolUseId,name:l.name,input:{}}}),c.set(d,"");}else u.set(d,{text:""});}if(i.contentBlockDelta){let d=i.contentBlockDelta.contentBlockIndex,l=u.get(d);if(l&&i.contentBlockDelta.delta?.text&&(a||(a=!0,s=Date.now()-t),l.text=(l.text||"")+i.contentBlockDelta.delta.text),l?.toolUse&&i.contentBlockDelta.delta?.toolUse?.input){let p=c.get(d)||"";c.set(d,p+i.contentBlockDelta.delta.toolUse.input);}}if(i.contentBlockStop){let d=i.contentBlockStop.contentBlockIndex,l=u.get(d),p=c.get(d);if(l?.toolUse&&p)try{l.toolUse.input=JSON.parse(p);}catch{}}i.messageStop?.stopReason&&(o.stopReason=i.messageStop.stopReason),i.metadata?.usage&&(o.usage={inputTokens:i.metadata.usage.inputTokens||0,outputTokens:i.metadata.usage.outputTokens||0}),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t,d=Array.from(u.entries()).sort((l,p)=>l[0]-p[0]).map(([,l])=>l);if(o.output.message.content=d,r)m({provider:C,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let l=f({provider:C,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},rawResponse:Se(o),durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(l){let p=Re(o);p.length>0&&k(p,l);}}}}async function Cn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=Sn(r.body);return f({provider:C,model:o.modelId||"unknown",input:D(o.body),rawResponse:a,durationMs:s,status:"success",streaming:!1}),r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:D(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function vn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.body?{...r,body:In(r.body,o,t)}:r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:D(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*In(e,n,t){let o=[],r=null;try{for await(let s of e){if(s.chunk?.bytes){let a=Rn(s.chunk.bytes);a&&o.push(a);}yield s;}}catch(s){throw r=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-t;r?m({provider:C,model:n.modelId||"unknown",input:D(n.body),error:r,durationMs:s,streaming:true}):f({provider:C,model:n.modelId||"unknown",input:D(n.body),rawResponse:{streamEvents:o},durationMs:s,status:"success",streaming:true});}}function Se(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Re(e){let n=[],t=e.output?.message?.content;if(Array.isArray(t))for(let o of t)o.toolUse?.toolUseId&&n.push(o.toolUse.toolUseId);return n}function D(e){try{let n=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(n)}catch{return e}}function Sn(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}function Rn(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}var I="gemini";function Te(e){if(!e||typeof e!="object")return false;let n=e.constructor?.name;if(n==="GoogleGenerativeAI"||n==="GoogleGenAI")return true;let t=e;return !!(typeof t.getGenerativeModel=="function"||t.models&&typeof t.models.generate=="function")}function xe(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="getGenerativeModel"&&typeof s=="function"?xn(s.bind(t)):s}})}function xn(e){return function(t){let o=e(t);return _n(o,t.model)}}function _n(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="generateContent"&&typeof s=="function"?Mn(s.bind(t),n):o==="generateContentStream"&&typeof s=="function"?En(s.bind(t),n):o==="startChat"&&typeof s=="function"?Pn(s.bind(t),n):s}})}function Mn(e,n){return async function(o){let r=Date.now(),s=Me(o);try{let a=await e(o),u=Date.now()-r,c=Ee(a.response),i=f({provider:I,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Pe(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function En(e,n){return async function(o){let r=Date.now(),s=Me(o);try{let a=await e(o),u=_e(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}async function*_e(e,n,t,o){let r={candidates:[{content:{parts:[]}}]},s=null,a,u=false;try{for await(let c of e){try{let i=c.text();if(i){u||(u=!0,a=Date.now()-o);let d=r.candidates[0].content?.parts||[],l=d[d.length-1];l?.text!==void 0?l.text+=i:d.push({text:i});}}catch{}if(c.candidates?.[0]?.content?.parts)for(let i of c.candidates[0].content.parts)i.functionCall&&r.candidates[0].content?.parts?.push(i);c.usageMetadata&&(r.usageMetadata=c.usageMetadata),c.candidates?.[0]?.finishReason&&(r.candidates[0].finishReason=c.candidates[0].finishReason),yield c;}}catch(c){throw s=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-o;if(s)m({provider:I,model:n,input:t,error:s,durationMs:c,streaming:true});else {let i=f({provider:I,model:n,input:t,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:a});if(i){let d=Bn(r.candidates);d.length>0&&k(d,i);}}}}function Pn(e,n){return function(o){let r=e(o);return An(r,n)}}function An(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="sendMessage"&&typeof s=="function"?Dn(s.bind(t),n):o==="sendMessageStream"&&typeof s=="function"?On(s.bind(t),n):s}})}function Dn(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Date.now()-r,c=Ee(a.response),i=f({provider:I,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=Pe(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function On(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=_e(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:I,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}function Me(e){return typeof e=="string"?e:e.contents?e.contents:e}function Ee(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function Pe(e){let n=[],t=e.candidates?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}function Bn(e){let n=[],t=e?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}var jn="openrouter.ai",U="openrouter";function Ae(e){if(!e||typeof e!="object")return false;let n=e;return n.chat?.completions?.create?(n.baseURL||"").includes(jn):false}function De(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?Un(s):s}})}function Un(e){return e&&new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?qn(r):r}})}function qn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?Nn(r.bind(n)):r}})}function Nn(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&$n(a))return Ln(a,r,o);let u=Date.now()-o,c=a;return f({provider:U,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:U,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function $n(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Ln(e,n,t){let o={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false;try{for await(let u of e){let c=u;!o.id&&c.id&&(o.id=c.id);let i=c.choices?.[0]?.delta?.content;i&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=i);let d=c.choices?.[0]?.finish_reason;d&&(o.choices[0].finish_reason=d),c.usage&&(o.usage=c.usage),yield u;}}catch(u){throw r=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-t;r?m({provider:U,model:n.model||"unknown",input:n.messages,error:r,durationMs:u,streaming:true}):f({provider:U,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:s});}}function Oe(e,n){return n&&le(n),ae().disabled?(w("Tracing disabled, returning unwrapped client"),e):Ae(e)?(x("openrouter"),De(e)):pe(e)?(x("openai"),Jn(e)):he(e)?(x("anthropic"),Yn(e)):ve(e)?(x("bedrock"),Ie(e)):Te(e)?(x("gemini"),xe(e)):(O("Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini"),e)}function Jn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?Fn(s):o==="responses"&&s&&typeof s=="object"?Vn(s):o==="completions"&&s&&typeof s=="object"?Hn(s):o==="embeddings"&&s&&typeof s=="object"?Wn(s):s}})}function Fn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?zn(r):r}})}function zn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?me(r.bind(n)):r}})}function Vn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ge(r.bind(n)):r}})}function Hn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?we(r.bind(n)):r}})}function Wn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ke(r.bind(n)):r}})}function Yn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="messages"&&s&&typeof s=="object"?Xn(s):s}})}function Xn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?be(r.bind(n)):t==="stream"&&typeof r=="function"?Ce(r.bind(n)):r}})}function Qn(e){return function(t,o){return Oe(t,{...e,...o})}}
3
- export{F as captureSpan,Qn as createObserve,Xe as flush,b as getTraceContext,We as init,Ye as isEnabled,Oe as observe,cn as span,an as trace};//# sourceMappingURL=index.mjs.map
2
+ var je=Object.defineProperty;var Ue=(e,n,t)=>n in e?je(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var Y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var qe=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var M=(e,n,t)=>Ue(e,typeof n!="symbol"?n+"":n,t);var oe=qe((ut,Je)=>{Je.exports={name:"@lelemondev/sdk",version:"0.9.6",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var X=false;function Q(e){X=e;}function v(){return X?true:Ne("LELEMON_DEBUG")==="true"}var h="[Lelemon]";function w(e,n){v()&&L("debug",e,n);}function N(e,n){v()&&L("info",e,n);}function O(e,n){L("warn",e,n);}function $(e,n,t,o){v()&&console.log(`${h} Captured trace: provider=${e} model=${n} duration=${t}ms status=${o}`);}function B(e,n){console.error(`${h} Failed to capture trace: provider=${e} error=${n.message}`);}function x(e){v()&&console.log(`${h} Wrapped client: provider=${e}`);}function Z(e,n){v()&&console.log(`${h} Sending batch: count=${e} endpoint=${n}`);}function ee(e,n){v()&&console.log(`${h} Batch sent successfully: count=${e} duration=${n}ms`);}function ne(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${h} Batch send failed: count=${e} error=${t}`);}function te(e,n,t){v()&&console.log(`${h} Request: ${e} ${n} (${t} bytes)`);}function re(e,n){v()&&console.log(`${h} Response: status=${e} duration=${n}ms`);}function L(e,n,t){let o=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?o(`${h} ${n}`,t):o(`${h} ${n}`);}function Ne(e){if(typeof process<"u"&&process.env)return process.env[e]}var $e=10,Le=1e3,Ke=1e4,G=class{constructor(n){M(this,"config");M(this,"queue",[]);M(this,"flushPromise",null);M(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??$e,flushIntervalMs:n.flushIntervalMs??Le,requestTimeoutMs:n.requestTimeoutMs??Ke};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),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 n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).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(n){if(n.length===0)return;let t=Date.now();Z(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),ee(n.length,Date.now()-t);}catch(o){ne(n.length,o);}}async request(n,t,o){let r=`${this.config.endpoint}${t}`,s=new AbortController,a=o?JSON.stringify(o):void 0;te(n,r,a?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let i=await fetch(r,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:s.signal});if(clearTimeout(u),re(i.status,Date.now()-c),!i.ok){let l=await i.text().catch(()=>"Unknown error");throw new Error(`HTTP ${i.status}: ${l}`)}let d=await i.text();return d?JSON.parse(d):{}}catch(i){throw clearTimeout(u),i instanceof Error&&i.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):i}}};var Fe="@lelemondev/sdk",ze="nodejs";function Ve(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function 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 We(){try{if(typeof Y<"u")return oe().version??"unknown"}catch{}return "unknown"}var _=null;function ae(e){if(!_){let t=Ve(),o=He();_={"telemetry.sdk.name":Fe,"telemetry.sdk.version":We(),"telemetry.sdk.language":ze},t&&(_["process.runtime.name"]=t.name,_["process.runtime.version"]=t.version),o&&(_["os.type"]=o);}let n={..._};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var J={},I=null,K=null,ie="https://api.lelemon.dev";function Xe(e={}){J=e,e.debug&&Q(true),K=ae(e.service),N("Initializing SDK",{endpoint:e.endpoint??ie,debug:e.debug??false,disabled:e.disabled??false,telemetry:K}),I=ce(e),I.isEnabled()?N("SDK initialized - tracing enabled"):w("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ue(){return J}function j(){return K}function Qe(){return R().isEnabled()}function R(){return I||(I=ce(J)),I}async function Ze(){I&&await I.flush();}function ce(e){let n=e.apiKey??en("LELEMON_API_KEY");return !n&&!e.disabled&&O("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new G({apiKey:n??"",endpoint:e.endpoint??ie,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function en(e){if(typeof process<"u"&&process.env)return process.env[e]}var F=Symbol.for("@lelemondev/sdk:globalContext");function de(){let e=globalThis;return e[F]||(e[F]={context:{}}),e[F]}function pe(e){de().context=e,w("Global context updated",e);}function A(){return de().context}function f(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping trace capture");return}let t=A(),o=b(),r=E(),s=j(),a={provider:e.provider,model:e.model,input:V(e.input),rawResponse:e.rawResponse?P(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:r,parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),n.enqueue(a),r}catch(n){B(e.provider,n instanceof Error?n:new Error(String(n)));return}}function m(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping error capture");return}let t=A(),o=b(),r=j(),s={provider:e.provider,model:e.model,input:V(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:o?.traceId,spanId:E(),parentSpanId:o?.currentSpanId,metadata:{...t.metadata,...e.metadata,...o?{_traceName:o.name}:{},...r?{_telemetry:r}:{}},tags:t.tags};$(e.provider,e.model,e.durationMs,"error"),w("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){B(e.provider,n instanceof Error?n:new Error(String(n)));}}function z(e){try{let n=R();if(!n.isEnabled()){w("Transport disabled, skipping span capture");return}let t=A(),o=b(),r=e.metadata?._traceId,s=e.metadata?._parentSpanId,a=j(),u={...t.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete u._traceId,delete u._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:V(e.input),output:P(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:r??o?.traceId,spanId:E(),parentSpanId:s??o?.currentSpanId,toolCallId:e.toolCallId,metadata:u,tags:t.tags};w(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){B("unknown",n instanceof Error?n:new Error(String(n)));}}var le=1e5,nn=["api_key","apikey","password","secret","authorization"],tn=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],rn=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function on(e){let n=e.toLowerCase();return rn.includes(n)?false:!!(nn.some(t=>n.includes(t))||tn.some(t=>n.includes(t)))}function V(e){return P(e,0)}function P(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>le?e.slice(0,le)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>P(t,n+1));if(typeof e=="object"){let t={};for(let[o,r]of Object.entries(e))on(o)?t[o]="[REDACTED]":t[o]=P(r,n+1);return t}return String(e)}var H=Symbol.for("@lelemondev/sdk:traceStorage");function an(){let e=globalThis;return e[H]||(e[H]=new AsyncLocalStorage),e[H]}var me=an();function E(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function b(){return me.getStore()}function k(e,n){let t=b();if(t)for(let o of e)t.pendingToolCalls.set(o,n),w(`Registered tool call ${o} \u2192 LLM span ${n}`);}function un(e){let n=b();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function cn(e){let n=b();n&&n.pendingToolCalls.delete(e);}async function ln(e,n){let t=typeof e=="string"?{name:e}:e,o=b(),r=o?.traceId??E(),s=E(),a={traceId:r,rootSpanId:s,currentSpanId:s,parentSpanId:o?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return me.run(a,async()=>{let u,c;try{return u=await n(),u}catch(i){throw c=i instanceof Error?i:new Error(String(i)),i}finally{dn(a,c?void 0:u,c);}})}function dn(e,n,t){let o=R();if(!o.isEnabled()){w("Transport disabled, skipping root span");return}let r=A(),s=Date.now()-e.startTime,a=t?null:n,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:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:r.sessionId,userId:r.userId,metadata:{...r.metadata,...e.metadata},tags:e.tags??r.tags};w(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),o.enqueue(u);}function pn(e){let n=b();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=un(e.toolCallId);z({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:n.traceId,_parentSpanId:t}}),e.toolCallId&&cn(e.toolCallId);}var y="openai";function fe(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function ge(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&we(a))return mn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:y,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i){let d=be(c);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function we(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*mn(e,n,t){let o={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false,u=new Map;try{for await(let c of e){let i=c,d=i?.choices?.[0]?.delta?.content;d&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=d);let l=i?.choices?.[0]?.delta?.tool_calls;if(l)for(let g of l){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let q=u.get(g.index);g.id&&(q.id=g.id),g.function?.name&&(q.function.name=g.function.name),g.function?.arguments&&(q.function.arguments+=g.function.arguments);}let p=i?.choices?.[0]?.finish_reason;p&&(o.choices[0].finish_reason=p),i?.usage&&(o.usage=i.usage),yield c;}}catch(c){throw r=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(o.choices[0].message.tool_calls=Array.from(u.entries()).sort((i,d)=>i[0]-d[0]).map(([,i])=>i)),r)m({provider:y,model:n.model||"unknown",input:n.messages,error:r,durationMs:c,streaming:true});else {let i=f({provider:y,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(i){let d=be(o);d.length>0&&k(d,i);}}}}function ke(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&we(a))return fn(a,r,o);let u=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:{instructions:r.instructions,input:r.input},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}async function*fn(e,n,t){let o=[],r=null,s=null;try{for await(let a of e){o.push(a);let u=a;u.type==="response.done"&&u.response&&(r=u.response),yield a;}}catch(a){throw s=a instanceof Error?a:new Error(String(a)),a}finally{let a=Date.now()-t;s?m({provider:y,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:a,streaming:true}):f({provider:y,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:r||{streamEvents:o},durationMs:a,status:"success",streaming:true});}}function ye(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:r.prompt,rawResponse:s,durationMs:a,status:"success",streaming:!1}),s}catch(s){let a=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function he(e){return async function(...t){let o=Date.now(),r=t[0]||{};try{let s=await e(...t),a=Date.now()-o;return f({provider:y,model:r.model||"unknown",input:r.input,rawResponse:s,durationMs:a,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let a=Date.now()-o;throw m({provider:y,model:r.model||"unknown",input:r.input,error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:false}),s}}}function be(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let o of t)o.id&&n.push(o.id);return n}var T="anthropic";function Ce(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let t=e;return !!(t.messages&&typeof t.messages=="object")}function ve(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&wn(a))return yn(a,r,o);let u=Date.now()-o,c=a,i=f({provider:T,model:r.model||c.model||"unknown",input:{system:r.system,messages:r.messages},rawResponse:a,durationMs:u,status:"success",streaming:!1});if(i&&c.content){let d=W(c.content);d.length>0&&k(d,i);}return a}catch(a){let u=Date.now()-o;throw m({provider:T,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Se(e){return function(...t){let o=Date.now(),r=t[0]||{};try{let s=e(...t);return s&&typeof s=="object"?kn(s,r,o):s}catch(s){let a=Date.now()-o;throw m({provider:T,model:r.model||"unknown",input:{system:r.system,messages:r.messages},error:s instanceof Error?s:new Error(String(s)),durationMs:a,streaming:true}),s}}}function wn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function kn(e,n,t){let o=e;if(!o[Symbol.asyncIterator])return e;let r={content:[],usage:{input_tokens:0,output_tokens:0}},s=false,a,u=false,c=null,i=[],d=async function*(){try{for await(let l of o){if(l.type==="message_start"&&l.message&&(r.model=l.message.model,r.id=l.message.id,r.role=l.message.role,l.message.usage&&(r.usage={...l.message.usage})),l.type==="content_block_start"&&l.content_block&&(c=l.index??i.length,i[c]={...l.content_block},l.content_block.type==="text"&&(i[c].text=""),l.content_block.type==="thinking"&&(i[c].thinking="")),l.type==="content_block_delta"&&l.delta&&c!==null){let p=i[c];p&&(l.delta.text&&(u||(u=!0,a=Date.now()-t),p.type==="thinking"?p.thinking=(p.thinking||"")+l.delta.text:p.type==="text"&&(p.text=(p.text||"")+l.delta.text)),l.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+l.delta.partial_json));}if(l.type==="content_block_stop"&&c!==null){let p=i[c];if(p&&p.type==="tool_use"){let g=p._inputJson;if(g){try{p.input=JSON.parse(g);}catch{}delete p._inputJson;}}c=null;}l.type==="message_delta"&&(l.usage?.output_tokens&&(r.usage.output_tokens=l.usage.output_tokens),l.delta?.stop_reason&&(r.stop_reason=l.delta.stop_reason)),yield l;}}catch(l){if(!s){s=true;let p=Date.now()-t;m({provider:T,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:l instanceof Error?l:new Error(String(l)),durationMs:p,streaming:true});}throw l}finally{if(!s){s=true;let l=Date.now()-t;r.content=i.filter(Boolean);let p=f({provider:T,model:r.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:r,durationMs:l,status:"success",streaming:true,firstTokenMs:a});if(p&&r.content){let g=W(r.content);g.length>0&&k(g,p);}}}};return new Proxy(e,{get(l,p,g){return p===Symbol.asyncIterator?()=>d()[Symbol.asyncIterator]():Reflect.get(l,p,g)}})}async function*yn(e,n,t){let o={content:[],usage:{input_tokens:0,output_tokens:0}},r=null,s,a=false,u=null,c=[];try{for await(let i of e){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(u=i.index??c.length,c[u]={...i.content_block},i.content_block.type==="text"&&(c[u].text=""),i.content_block.type==="thinking"&&(c[u].thinking="")),i.type==="content_block_delta"&&i.delta&&u!==null){let d=c[u];d&&(i.delta.text&&(a||(a=!0,s=Date.now()-t),d.type==="thinking"?d.thinking=(d.thinking||"")+i.delta.text:d.type==="text"&&(d.text=(d.text||"")+i.delta.text)),i.delta.partial_json&&d.type==="tool_use"&&(d._inputJson=(d._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&u!==null){let d=c[u];if(d&&d.type==="tool_use"){let l=d._inputJson;if(l){try{d.input=JSON.parse(l);}catch{}delete d._inputJson;}}u=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;if(o.content=c.filter(Boolean),r)m({provider:T,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let d=f({provider:T,model:o.model||n.model||"unknown",input:{system:n.system,messages:n.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(d&&o.content){let l=W(o.content);l.length>0&&k(l,d);}}}}function W(e){let n=[];for(let t of e)t.type==="tool_use"&&t.id&&n.push(t.id);return n}var C="bedrock";function Ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="BedrockRuntimeClient")return true;let t=e;return typeof t.send!="function"||!t.config||typeof t.config!="object"?false:"region"in t.config}function Re(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="send"&&typeof s=="function"?bn(s.bind(t)):s}})}function bn(e){return async function(t){switch(t.constructor?.name||""){case "ConverseCommand":return Cn(e,t);case "ConverseStreamCommand":return vn(e,t);case "InvokeModelCommand":return In(e,t);case "InvokeModelWithResponseStreamCommand":return Rn(e,t);default:return e(t)}}}async function Cn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=f({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},rawResponse:Te(r),durationMs:s,status:"success",streaming:!1});if(a){let u=xe(r);u.length>0&&k(u,a);}return r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function vn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.stream?{...r,stream:Sn(r.stream,o,t)}:r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:{system:o.system,messages:o.messages},error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*Sn(e,n,t){let o={output:{message:{role:"assistant",content:[]}},usage:{inputTokens:0,outputTokens:0}},r=null,s,a=false,u=new Map,c=new Map;try{for await(let i of e){if(i.contentBlockStart){let d=i.contentBlockStart.contentBlockIndex;if(i.contentBlockStart.start?.toolUse){let l=i.contentBlockStart.start.toolUse;u.set(d,{toolUse:{toolUseId:l.toolUseId,name:l.name,input:{}}}),c.set(d,"");}else u.set(d,{text:""});}if(i.contentBlockDelta){let d=i.contentBlockDelta.contentBlockIndex,l=u.get(d);if(l&&i.contentBlockDelta.delta?.text&&(a||(a=!0,s=Date.now()-t),l.text=(l.text||"")+i.contentBlockDelta.delta.text),l?.toolUse&&i.contentBlockDelta.delta?.toolUse?.input){let p=c.get(d)||"";c.set(d,p+i.contentBlockDelta.delta.toolUse.input);}}if(i.contentBlockStop){let d=i.contentBlockStop.contentBlockIndex,l=u.get(d),p=c.get(d);if(l?.toolUse&&p)try{l.toolUse.input=JSON.parse(p);}catch{}}i.messageStop?.stopReason&&(o.stopReason=i.messageStop.stopReason),i.metadata?.usage&&(o.usage={inputTokens:i.metadata.usage.inputTokens||0,outputTokens:i.metadata.usage.outputTokens||0}),yield i;}}catch(i){throw r=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t,d=Array.from(u.entries()).sort((l,p)=>l[0]-p[0]).map(([,l])=>l);if(o.output.message.content=d,r)m({provider:C,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},error:r,durationMs:i,streaming:true});else {let l=f({provider:C,model:n.modelId||"unknown",input:{system:n.system,messages:n.messages},rawResponse:Te(o),durationMs:i,status:"success",streaming:true,firstTokenMs:s});if(l){let p=xe(o);p.length>0&&k(p,l);}}}}async function In(e,n){let t=Date.now(),o=n.input;try{let r=await e(n),s=Date.now()-t,a=xn(r.body);return f({provider:C,model:o.modelId||"unknown",input:D(o.body),rawResponse:a,durationMs:s,status:"success",streaming:!1}),r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:D(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:false}),r}}async function Rn(e,n){let t=Date.now(),o=n.input;try{let r=await e(n);return r.body?{...r,body:Tn(r.body,o,t)}:r}catch(r){throw m({provider:C,model:o.modelId||"unknown",input:D(o.body),error:r instanceof Error?r:new Error(String(r)),durationMs:Date.now()-t,streaming:true}),r}}async function*Tn(e,n,t){let o=[],r=null;try{for await(let s of e){if(s.chunk?.bytes){let a=_n(s.chunk.bytes);a&&o.push(a);}yield s;}}catch(s){throw r=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-t;r?m({provider:C,model:n.modelId||"unknown",input:D(n.body),error:r,durationMs:s,streaming:true}):f({provider:C,model:n.modelId||"unknown",input:D(n.body),rawResponse:{streamEvents:o},durationMs:s,status:"success",streaming:true});}}function Te(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function xe(e){let n=[],t=e.output?.message?.content;if(Array.isArray(t))for(let o of t)o.toolUse?.toolUseId&&n.push(o.toolUse.toolUseId);return n}function D(e){try{let n=typeof e=="string"?e:new TextDecoder().decode(e);return JSON.parse(n)}catch{return e}}function xn(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}function _n(e){try{let n=new TextDecoder().decode(e);return JSON.parse(n)}catch{return null}}var S="gemini";function _e(e){if(!e||typeof e!="object")return false;let n=e.constructor?.name;if(n==="GoogleGenerativeAI"||n==="GoogleGenAI")return true;let t=e;return !!(typeof t.getGenerativeModel=="function"||t.models&&typeof t.models.generate=="function")}function Ee(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="getGenerativeModel"&&typeof s=="function"?Mn(s.bind(t)):s}})}function Mn(e){return function(t){let o=e(t);return Pn(o,t.model)}}function Pn(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="generateContent"&&typeof s=="function"?An(s.bind(t),n):o==="generateContentStream"&&typeof s=="function"?Dn(s.bind(t),n):o==="startChat"&&typeof s=="function"?On(s.bind(t),n):s}})}function An(e,n){return async function(o){let r=Date.now(),s=Pe(o);try{let a=await e(o),u=Date.now()-r,c=Ae(a.response),i=f({provider:S,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=De(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function Dn(e,n){return async function(o){let r=Date.now(),s=Pe(o);try{let a=await e(o),u=Me(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}async function*Me(e,n,t,o){let r={candidates:[{content:{parts:[]}}]},s=null,a,u=false;try{for await(let c of e){try{let i=c.text();if(i){u||(u=!0,a=Date.now()-o);let d=r.candidates[0].content?.parts||[],l=d[d.length-1];l?.text!==void 0?l.text+=i:d.push({text:i});}}catch{}if(c.candidates?.[0]?.content?.parts)for(let i of c.candidates[0].content.parts)i.functionCall&&r.candidates[0].content?.parts?.push(i);c.usageMetadata&&(r.usageMetadata=c.usageMetadata),c.candidates?.[0]?.finishReason&&(r.candidates[0].finishReason=c.candidates[0].finishReason),yield c;}}catch(c){throw s=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-o;if(s)m({provider:S,model:n,input:t,error:s,durationMs:c,streaming:true});else {let i=f({provider:S,model:n,input:t,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:a});if(i){let d=Un(r.candidates);d.length>0&&k(d,i);}}}}function On(e,n){return function(o){let r=e(o);return Bn(r,n)}}function Bn(e,n){return new Proxy(e,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="sendMessage"&&typeof s=="function"?Gn(s.bind(t),n):o==="sendMessageStream"&&typeof s=="function"?jn(s.bind(t),n):s}})}function Gn(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Date.now()-r,c=Ae(a.response),i=f({provider:S,model:n,input:s,rawResponse:c,durationMs:u,status:"success",streaming:!1});if(i){let d=De(a.response);d.length>0&&k(d,i);}return a}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:false}),a}}}function jn(e,n){return async function(o){let r=Date.now(),s=o;try{let a=await e(o),u=Me(a.stream,n,s,r);return {...a,stream:u}}catch(a){throw m({provider:S,model:n,input:s,error:a instanceof Error?a:new Error(String(a)),durationMs:Date.now()-r,streaming:true}),a}}}function Pe(e){return typeof e=="string"?e:e.contents?e.contents:e}function Ae(e){return {candidates:e.candidates,usageMetadata:e.usageMetadata}}function De(e){let n=[],t=e.candidates?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}function Un(e){let n=[],t=e?.[0]?.content?.parts;return t&&t.forEach((o,r)=>{o.functionCall?.name&&n.push(`gemini-fc-${o.functionCall.name}-${r}`);}),n}var Nn="openrouter.ai",U="openrouter";function Oe(e){if(!e||typeof e!="object")return false;let n=e;return n.chat?.completions?.create?(n.baseURL||"").includes(Nn):false}function Be(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?$n(s):s}})}function $n(e){return e&&new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Ln(r):r}})}function Ln(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?Kn(r.bind(n)):r}})}function Kn(e){return async function(...t){let o=Date.now(),r=t[0]||{},s=r.stream===true;try{let a=await e(...t);if(s&&Jn(a))return Fn(a,r,o);let u=Date.now()-o,c=a;return f({provider:U,model:r.model||c.model||"unknown",input:r.messages,rawResponse:a,durationMs:u,status:"success",streaming:!1}),a}catch(a){let u=Date.now()-o;throw m({provider:U,model:r.model||"unknown",input:r.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:s}),a}}}function Jn(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Fn(e,n,t){let o={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},r=null,s,a=false;try{for await(let u of e){let c=u;!o.id&&c.id&&(o.id=c.id);let i=c.choices?.[0]?.delta?.content;i&&(a||(a=!0,s=Date.now()-t),o.choices[0].message.content+=i);let d=c.choices?.[0]?.finish_reason;d&&(o.choices[0].finish_reason=d),c.usage&&(o.usage=c.usage),yield u;}}catch(u){throw r=u instanceof Error?u:new Error(String(u)),u}finally{let u=Date.now()-t;r?m({provider:U,model:n.model||"unknown",input:n.messages,error:r,durationMs:u,streaming:true}):f({provider:U,model:n.model||"unknown",input:n.messages,rawResponse:o,durationMs:u,status:"success",streaming:true,firstTokenMs:s});}}function Ge(e,n){return n&&pe(n),ue().disabled?(w("Tracing disabled, returning unwrapped client"),e):Oe(e)?(x("openrouter"),Be(e)):fe(e)?(x("openai"),Vn(e)):Ce(e)?(x("anthropic"),Zn(e)):Ie(e)?(x("bedrock"),Re(e)):_e(e)?(x("gemini"),Ee(e)):(O("Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini"),e)}function Vn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="chat"&&s&&typeof s=="object"?Hn(s):o==="responses"&&s&&typeof s=="object"?Yn(s):o==="completions"&&s&&typeof s=="object"?Xn(s):o==="embeddings"&&s&&typeof s=="object"?Qn(s):s}})}function Hn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="completions"&&r&&typeof r=="object"?Wn(r):r}})}function Wn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ge(r.bind(n)):r}})}function Yn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ke(r.bind(n)):r}})}function Xn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ye(r.bind(n)):r}})}function Qn(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?he(r.bind(n)):r}})}function Zn(e){let n=e;return new Proxy(n,{get(t,o,r){let s=Reflect.get(t,o,r);return o==="messages"&&s&&typeof s=="object"?et(s):s}})}function et(e){return new Proxy(e,{get(n,t,o){let r=Reflect.get(n,t,o);return t==="create"&&typeof r=="function"?ve(r.bind(n)):t==="stream"&&typeof r=="function"?Se(r.bind(n)):r}})}function nt(e){return function(t,o){return Ge(t,{...e,...o})}}
3
+ export{z as captureSpan,nt as createObserve,Ze as flush,b as getTraceContext,Xe as init,Qe as isEnabled,Ge as observe,pn as span,ln as trace};//# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map