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