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