@lelemondev/sdk 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/anthropic.d.mts +2 -2
- package/dist/anthropic.d.ts +2 -2
- package/dist/anthropic.js +2 -2
- package/dist/anthropic.mjs +2 -2
- package/dist/bedrock.d.mts +2 -2
- package/dist/bedrock.d.ts +2 -2
- package/dist/bedrock.js +1 -1
- package/dist/bedrock.mjs +1 -1
- package/dist/{capture-CC0517bj.d.mts → capture-CiUL-4hv.d.mts} +14 -0
- package/dist/{capture-CC0517bj.d.ts → capture-CiUL-4hv.d.ts} +14 -0
- package/dist/gemini.d.mts +2 -2
- package/dist/gemini.d.ts +2 -2
- package/dist/gemini.js +2 -2
- package/dist/gemini.mjs +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/openai.d.mts +2 -2
- package/dist/openai.d.ts +2 -2
- package/dist/openai.js +1 -1
- package/dist/openai.mjs +1 -1
- package/dist/openrouter.d.mts +2 -2
- package/dist/openrouter.d.ts +2 -2
- package/dist/openrouter.js +2 -2
- package/dist/openrouter.mjs +2 -2
- package/package.json +1 -1
package/dist/openrouter.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var ue=Object.defineProperty;var de=(e,t,n)=>t in e?ue(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 ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var W=ce((Qe,ge)=>{ge.exports={name:"@lelemondev/sdk",version:"0.9.7",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var N=false;function U(e){N=e;}function f(){return N?true:le("LELEMON_DEBUG")==="true"}var l="[Lelemon]";function c(e,t){f()&&M("debug",e,t);}function R(e,t){f()&&M("info",e,t);}function v(e,t){M("warn",e,t);}function _(e,t,n,r){f()&&console.log(`${l} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function S(e,t){console.error(`${l} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){f()&&console.log(`${l} Wrapped client: provider=${e}`);}function F(e,t){f()&&console.log(`${l} Sending batch: count=${e} endpoint=${t}`);}function B(e,t){f()&&console.log(`${l} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${l} Batch send failed: count=${e} error=${n}`);}function V(e,t,n){f()&&console.log(`${l} Request: ${e} ${t} (${n} bytes)`);}function H(e,t){f()&&console.log(`${l} Response: status=${e} duration=${t}ms`);}function M(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${l} ${t}`,n):r(`${l} ${t}`);}function le(e){if(typeof process<"u"&&process.env)return process.env[e]}var pe=10,fe=1e3,me=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??pe,flushIntervalMs:t.flushIntervalMs??fe,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();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),B(t.length,Date.now()-n);}catch(r){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;V(t,o,a?.length??0);let s=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),d=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(s),H(u.status,Date.now()-d),!u.ok){let ae=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${ae}`)}let h=await u.text();return h?JSON.parse(h):{}}catch(u){throw clearTimeout(s),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var be="@lelemondev/sdk",ye="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 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 we(){try{if(typeof K<"u")return W().version??"unknown"}catch{}return "unknown"}var b=null;function X(e){if(!b){let n=he(),r=Te();b={"telemetry.sdk.name":be,"telemetry.sdk.version":we(),"telemetry.sdk.language":ye},n&&(b["process.runtime.name"]=n.name,b["process.runtime.version"]=n.version),r&&(b["os.type"]=r);}let t={...b};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var D={},m=null,O=null,Z="https://api.lelemon.dev";function ve(e={}){D=e,e.debug&&U(true),O=X(e.service),R("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),m=J(e),m.isEnabled()?R("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function C(){return D}function I(){return O}function Se(){return g().isEnabled()}function g(){return m||(m=J(D)),m}async function xe(){m&&await m.flush();}function J(e){let t=e.apiKey??Ce("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??Z,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 q=Symbol.for("@lelemondev/sdk:globalContext");function te(){let e=globalThis;return e[q]||(e[q]={context:{}}),e[q]}function ne(e){te().context=e,c("Global context updated",e);}function k(){return te().context}function A(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping trace capture");return}let n=k(),r=p(),o=y(),i=I(),a={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?w(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 _(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){S(e.provider,t instanceof Error?t:new Error(String(t)));return}}function P(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping error capture");return}let n=k(),r=p(),o=I(),i={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:y(),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"),c("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){S(e.provider,t instanceof Error?t:new Error(String(t)));}}function $(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=k(),r=p(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=I(),s={...n.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete s._traceId,delete s._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:j(e.input),output:w(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:y(),parentSpanId:i??r?.currentSpanId,toolCallId:e.toolCallId,metadata:s,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){S("unknown",t instanceof Error?t:new Error(String(t)));}}var Q=1e5,Ie=["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"],ee={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function re(){return C().redaction??{}}function _e(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ie.some(r=>t.includes(r))||Ee.some(r=>t.includes(r))||(re().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Me(e){let t=re(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(ee.emails,"[EMAIL]")),t.phones&&(n=n.replace(ee.phones,"[PHONE]")),n}function j(e){return w(e,0)}function w(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=Me(e);return n.length>Q&&(n=n.slice(0,Q)+"...[truncated]"),n}if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>w(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))_e(r)?n[r]="[REDACTED]":n[r]=w(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function De(){let e=globalThis;return e[L]||(e[L]=new AsyncLocalStorage),e[L]}var oe=De();function y(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function p(){return oe.getStore()}function qe(e){let t=p();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ae(e){let t=p();t&&t.pendingToolCalls.delete(e);}async function Pe(e,t){let n=typeof e=="string"?{name:e}:e,r=p(),o=r?.traceId??y(),i=y(),a={traceId:o,rootSpanId:i,currentSpanId:i,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,outputKey:n.outputKey,outputTransform:n.outputTransform,pendingToolCalls:new Map};return oe.run(a,async()=>{let s,d;try{return s=await t(),s}catch(u){throw d=u instanceof Error?u:new Error(String(u)),u}finally{Le(a,d?void 0:s,d);}})}var $e=["text","content","message","output","response","result","answer"];function je(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let o=e;return t in o?o[t]:e}if(e==null||typeof e!="object"||Array.isArray(e))return e;let r=e;for(let o of $e)if(o in r&&typeof r[o]=="string")return r[o];return e}function Le(e,t,n){let r=g();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let o=k(),i=Date.now()-e.startTime,a=n?null:je(t,e.outputKey,e.outputTransform),s={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:i,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};c(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(s);}function Ke(e){let t=p();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);$({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&Ae(e.toolCallId);}var Ne="openrouter.ai",E="openrouter";function se(e){if(!e||typeof e!="object")return false;let t=e;return t.chat?.completions?.create?(t.baseURL||"").includes(Ne):false}function ie(e){let t=e;return new Proxy(t,{get(n,r,o){let i=Reflect.get(n,r,o);return r==="chat"&&i&&typeof i=="object"?Ue(i):i}})}function Ue(e){return e&&new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="completions"&&o&&typeof o=="object"?ze(o):o}})}function ze(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?Fe(o.bind(t)):o}})}function Fe(e){return async function(...n){let r=Date.now(),o=n[0]||{},i=o.stream===true;try{let a=await e(...n);if(i&&Be(a))return Ge(a,o,r);let s=Date.now()-r,d=a;return A({provider:E,model:o.model||d.model||"unknown",input:o.messages,rawResponse:a,durationMs:s,status:"success",streaming:!1}),a}catch(a){let s=Date.now()-r;throw P({provider:E,model:o.model||"unknown",input:o.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:s,streaming:i}),a}}}function Be(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Ge(e,t,n){let r={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,i,a=false;try{for await(let s of e){let d=s;!r.id&&d.id&&(r.id=d.id);let u=d.choices?.[0]?.delta?.content;u&&(a||(a=!0,i=Date.now()-n),r.choices[0].message.content+=u);let h=d.choices?.[0]?.finish_reason;h&&(r.choices[0].finish_reason=h),d.usage&&(r.usage=d.usage),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;o?P({provider:E,model:t.model||"unknown",input:t.messages,error:o,durationMs:s,streaming:true}):A({provider:E,model:t.model||"unknown",input:t.messages,rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:i});}}function wt(e,t){return t&&ne(t),C().disabled?(c("Tracing disabled, returning unwrapped client"),e):se(e)?(z("openrouter"),ie(e)):(v("Client is not configured for OpenRouter. Ensure baseURL is set to openrouter.ai."),e)}
|
|
3
|
-
export{$ as captureSpan,
|
|
2
|
+
var ue=Object.defineProperty;var de=(e,t,n)=>t in e?ue(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 ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var W=ce((Qe,ge)=>{ge.exports={name:"@lelemondev/sdk",version:"0.9.9",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var N=false;function U(e){N=e;}function f(){return N?true:le("LELEMON_DEBUG")==="true"}var l="[Lelemon]";function c(e,t){f()&&M("debug",e,t);}function R(e,t){f()&&M("info",e,t);}function v(e,t){M("warn",e,t);}function _(e,t,n,r){f()&&console.log(`${l} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function I(e,t){console.error(`${l} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){f()&&console.log(`${l} Wrapped client: provider=${e}`);}function F(e,t){f()&&console.log(`${l} Sending batch: count=${e} endpoint=${t}`);}function B(e,t){f()&&console.log(`${l} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${l} Batch send failed: count=${e} error=${n}`);}function V(e,t,n){f()&&console.log(`${l} Request: ${e} ${t} (${n} bytes)`);}function H(e,t){f()&&console.log(`${l} Response: status=${e} duration=${t}ms`);}function M(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${l} ${t}`,n):r(`${l} ${t}`);}function le(e){if(typeof process<"u"&&process.env)return process.env[e]}var pe=10,fe=1e3,me=1e4,S=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??pe,flushIntervalMs:t.flushIntervalMs??fe,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();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),B(t.length,Date.now()-n);}catch(r){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;V(t,o,a?.length??0);let s=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),d=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(s),H(u.status,Date.now()-d),!u.ok){let ae=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${ae}`)}let h=await u.text();return h?JSON.parse(h):{}}catch(u){throw clearTimeout(s),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var be="@lelemondev/sdk",ye="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 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 we(){try{if(typeof K<"u")return W().version??"unknown"}catch{}return "unknown"}var b=null;function X(e){if(!b){let n=he(),r=Te();b={"telemetry.sdk.name":be,"telemetry.sdk.version":we(),"telemetry.sdk.language":ye},n&&(b["process.runtime.name"]=n.name,b["process.runtime.version"]=n.version),r&&(b["os.type"]=r);}let t={...b};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var D={},m=null,O=null,Z="https://api.lelemon.dev";function ve(e={}){D=e,e.debug&&U(true),O=X(e.service),R("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),m=J(e),m.isEnabled()?R("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function x(){return D}function C(){return O}function Ie(){return g().isEnabled()}function g(){return m||(m=J(D)),m}async function Se(){m&&await m.flush();}function J(e){let t=e.apiKey??xe("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 S({apiKey:t??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function xe(e){if(typeof process<"u"&&process.env)return process.env[e]}var q=Symbol.for("@lelemondev/sdk:globalContext");function te(){let e=globalThis;return e[q]||(e[q]={context:{}}),e[q]}function ne(e){te().context=e,c("Global context updated",e);}function k(){return te().context}function A(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping trace capture");return}let n=k(),r=p(),o=y(),i=C(),a={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?w(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...i?{_telemetry:i}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return _(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){I(e.provider,t instanceof Error?t:new Error(String(t)));return}}function P(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping error capture");return}let n=k(),r=p(),o=C(),i={provider:e.provider,model:e.model,input:j(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:r?.traceId,spanId:y(),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"),c("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){I(e.provider,t instanceof Error?t:new Error(String(t)));}}function $(e){try{let t=g();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=k(),r=p(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=C(),s={...n.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete s._traceId,delete s._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:j(e.input),output:w(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:r?.sessionId??n.sessionId,userId:r?.userId??n.userId,traceId:o??r?.traceId,spanId:y(),parentSpanId:i??r?.currentSpanId,toolCallId:e.toolCallId,metadata:s,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){I("unknown",t instanceof Error?t:new Error(String(t)));}}var Q=1e5,Ce=["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"],ee={emails:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,phones:/\b\d{9,}\b/g};function re(){return x().redaction??{}}function _e(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ce.some(r=>t.includes(r))||Ee.some(r=>t.includes(r))||(re().keys??[]).some(r=>t.includes(r.toLowerCase())))}function Me(e){let t=re(),n=e;for(let r of t.patterns??[])r.lastIndex=0,n=n.replace(r,"[REDACTED]");return t.emails&&(n=n.replace(ee.emails,"[EMAIL]")),t.phones&&(n=n.replace(ee.phones,"[PHONE]")),n}function j(e){return w(e,0)}function w(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string"){let n=Me(e);return n.length>Q&&(n=n.slice(0,Q)+"...[truncated]"),n}if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>w(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))_e(r)?n[r]="[REDACTED]":n[r]=w(o,t+1);return n}return String(e)}var L=Symbol.for("@lelemondev/sdk:traceStorage");function De(){let e=globalThis;return e[L]||(e[L]=new AsyncLocalStorage),e[L]}var oe=De();function y(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function p(){return oe.getStore()}function qe(e){let t=p();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Ae(e){let t=p();t&&t.pendingToolCalls.delete(e);}async function Pe(e,t){let n=typeof e=="string"?{name:e}:e,r=p(),o=r?.traceId??y(),i=y(),a={traceId:o,rootSpanId:i,currentSpanId:i,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,outputKey:n.outputKey,outputTransform:n.outputTransform,sessionId:n.sessionId,userId:n.userId,pendingToolCalls:new Map};return oe.run(a,async()=>{let s,d;try{return s=await t(),s}catch(u){throw d=u instanceof Error?u:new Error(String(u)),u}finally{Le(a,d?void 0:s,d);}})}var $e=["text","content","message","output","response","result","answer"];function je(e,t,n){if(n)try{return n(e)}catch{return e}if(t===false)return e;if(typeof t=="string"&&e&&typeof e=="object"){let o=e;return t in o?o[t]:e}if(e==null||typeof e!="object"||Array.isArray(e))return e;let r=e;for(let o of $e)if(o in r&&typeof r[o]=="string")return r[o];return e}function Le(e,t,n){let r=g();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let o=k(),i=Date.now()-e.startTime,a=n?null:je(t,e.outputKey,e.outputTransform),s={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:i,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:e.sessionId??o.sessionId,userId:e.userId??o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};c(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(s);}function Ke(e){let t=p();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);$({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&Ae(e.toolCallId);}var Ne="openrouter.ai",E="openrouter";function se(e){if(!e||typeof e!="object")return false;let t=e;return t.chat?.completions?.create?(t.baseURL||"").includes(Ne):false}function ie(e){let t=e;return new Proxy(t,{get(n,r,o){let i=Reflect.get(n,r,o);return r==="chat"&&i&&typeof i=="object"?Ue(i):i}})}function Ue(e){return e&&new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="completions"&&o&&typeof o=="object"?ze(o):o}})}function ze(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?Fe(o.bind(t)):o}})}function Fe(e){return async function(...n){let r=Date.now(),o=n[0]||{},i=o.stream===true;try{let a=await e(...n);if(i&&Be(a))return Ge(a,o,r);let s=Date.now()-r,d=a;return A({provider:E,model:o.model||d.model||"unknown",input:o.messages,rawResponse:a,durationMs:s,status:"success",streaming:!1}),a}catch(a){let s=Date.now()-r;throw P({provider:E,model:o.model||"unknown",input:o.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:s,streaming:i}),a}}}function Be(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Ge(e,t,n){let r={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,i,a=false;try{for await(let s of e){let d=s;!r.id&&d.id&&(r.id=d.id);let u=d.choices?.[0]?.delta?.content;u&&(a||(a=!0,i=Date.now()-n),r.choices[0].message.content+=u);let h=d.choices?.[0]?.finish_reason;h&&(r.choices[0].finish_reason=h),d.usage&&(r.usage=d.usage),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;o?P({provider:E,model:t.model||"unknown",input:t.messages,error:o,durationMs:s,streaming:true}):A({provider:E,model:t.model||"unknown",input:t.messages,rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:i});}}function wt(e,t){return t&&ne(t),x().disabled?(c("Tracing disabled, returning unwrapped client"),e):se(e)?(z("openrouter"),ie(e)):(v("Client is not configured for OpenRouter. Ensure baseURL is set to openrouter.ai."),e)}
|
|
3
|
+
export{$ as captureSpan,Se as flush,p as getTraceContext,ve as init,Ie as isEnabled,wt as observe,Ke as span,Pe as trace};//# sourceMappingURL=openrouter.mjs.map
|
|
4
4
|
//# sourceMappingURL=openrouter.mjs.map
|