@lelemondev/sdk 0.9.0 → 0.9.2
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.js.map +1 -1
- package/dist/anthropic.mjs +2 -2
- package/dist/anthropic.mjs.map +1 -1
- package/dist/bedrock.js +2 -2
- package/dist/bedrock.js.map +1 -1
- package/dist/bedrock.mjs +2 -2
- package/dist/bedrock.mjs.map +1 -1
- package/dist/express.js +1 -1
- package/dist/express.js.map +1 -1
- package/dist/express.mjs +1 -1
- package/dist/express.mjs.map +1 -1
- package/dist/gemini.js +2 -2
- package/dist/gemini.js.map +1 -1
- package/dist/gemini.mjs +2 -2
- package/dist/gemini.mjs.map +1 -1
- package/dist/hono.js +1 -1
- package/dist/hono.js.map +1 -1
- package/dist/hono.mjs +1 -1
- package/dist/hono.mjs.map +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.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.js +1 -1
- package/dist/integrations.js.map +1 -1
- package/dist/integrations.mjs +1 -1
- package/dist/integrations.mjs.map +1 -1
- package/dist/lambda.js.map +1 -1
- package/dist/lambda.mjs +1 -1
- package/dist/lambda.mjs.map +1 -1
- package/dist/next.js +1 -1
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +1 -1
- package/dist/next.mjs.map +1 -1
- package/dist/openai.js +2 -2
- package/dist/openai.js.map +1 -1
- package/dist/openai.mjs +2 -2
- package/dist/openai.mjs.map +1 -1
- package/dist/openrouter.js +2 -2
- package/dist/openrouter.js.map +1 -1
- package/dist/openrouter.mjs +2 -2
- package/dist/openrouter.mjs.map +1 -1
- package/package.json +1 -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 oe=Object.defineProperty;var se=(e,t,n)=>t in e?oe(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var x=(e,t,n)=>se(e,typeof t!="symbol"?t+"":t,n);var J=false;function U(e){J=e;}function b(){return J?true:ae("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function g(e,t){b()&&D("debug",e,t);}function P(e,t){b()&&D("info",e,t);}function C(e,t){D("warn",e,t);}function A(e,t,n,r){b()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function v(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function B(e){b()&&console.log(`${f} Wrapped client: provider=${e}`);}function z(e,t){b()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function K(e,t){b()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function j(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function F(e,t,n){b()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function G(e,t){b()&&console.log(`${f} 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(`${f} ${t}`,n):r(`${f} ${t}`);}function ae(e){if(typeof process<"u"&&process.env)return process.env[e]}var ie=10,ue=1e3,ce=1e4,E=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??ie,flushIntervalMs:t.flushIntervalMs??ue,requestTimeoutMs:t.requestTimeoutMs??ce};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();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 d=await o.text();return d?JSON.parse(d):{}}catch(o){throw clearTimeout(c),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var q={},k=null,W="https://www.lelemon.dev";function de(e={}){q=e,e.debug&&U(true),P("Initializing SDK",{endpoint:e.endpoint??W,debug:e.debug??false,disabled:e.disabled??false}),k=V(e),k.isEnabled()?P("SDK initialized - tracing enabled"):g("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function H(){return q}function pe(){return y().isEnabled()}function y(){return k||(k=V(q)),k}async function ge(){k&&await k.flush();}function V(e){let t=e.apiKey??fe("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??W,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,g("Global context updated",e);}function S(){return X}function R(e){try{let t=y();if(!t.isEnabled()){g("Transport disabled, skipping trace capture");return}let n=S(),r=m(),s=I(),i={provider:e.provider,model:e.model,input:N(e.input),output:Z(e.output),inputTokens:e.inputTokens,outputTokens:e.outputTokens,durationMs:e.durationMs,status:e.status,streaming:e.streaming,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,stopReason:e.stopReason,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,reasoningTokens:e.reasoningTokens,firstTokenMs:e.firstTokenMs,thinking:e.thinking};return A(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=y();if(!t.isEnabled()){g("Transport disabled, skipping error capture");return}let n=S(),r=m(),s={provider:e.provider,model:e.model,input:N(e.input),output:null,inputTokens:0,outputTokens:0,durationMs:e.durationMs,status:"error",errorMessage:e.error.message,errorStack:e.error.stack,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"),g("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 O(e){try{let t=y();if(!t.isEnabled()){g("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:N(e.input),output:Z(e.output),inputTokens:0,outputTokens: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};g(`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 Y=1e5,me=["api_key","apikey","password","secret","token","authorization"];function N(e){return M(e,0)}function Z(e){return M(e,0)}function M(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=>M(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))me.some(i=>r.toLowerCase().includes(i))?n[r]="[REDACTED]":n[r]=M(s,t+1);return n}return String(e)}var ee=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 ee.getStore()}function $(e,t){let n=m();if(n)for(let r of e)n.pendingToolCalls.set(r,t),g(`Registered tool call ${r} \u2192 LLM span ${t}`);}function he(e){let t=m();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function ke(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??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 ee.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=y();if(!r.isEnabled()){g("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};g(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(c);}function Te(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=he(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&&ke(e.toolCallId);}var w="anthropic";function te(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 ne(e){return async function(...n){let r=Date.now(),s=n[0]||{},i=s.stream===true;try{let u=await e(...n);if(i&&Ie(u))return Se(u,s,r);let c=Date.now()-r,l=u,o=R({provider:w,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 d=L(l.content);d.length>0&&$(d,o);}return u}catch(u){let c=Date.now()-r;throw _({provider:w,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 re(e){return function(...n){let r=Date.now(),s=n[0]||{};try{let i=e(...n);return i&&typeof i=="object"?xe(i,s,r):i}catch(i){let u=Date.now()-r;throw _({provider:w,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 Ie(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function xe(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=[],d=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 p=o[l];p&&(a.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+a.delta.text:p.type==="text"&&(p.text=(p.text||"")+a.delta.text)),a.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+a.delta.partial_json));}if(a.type==="content_block_stop"&&l!==null){let p=o[l];if(p&&p.type==="tool_use"){let h=p._inputJson;if(h){try{p.input=JSON.parse(h);}catch{}delete p._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 p=Date.now()-n;_({provider:w,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:p,streaming:true});}throw a}finally{if(!i){i=true;let a=Date.now()-n;s.content=o.filter(Boolean);let p=R({provider:w,model:s.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:s,durationMs:a,status:"success",streaming:true,firstTokenMs:u});if(p&&s.content){let h=L(s.content);h.length>0&&$(h,p);}}}};return new Proxy(e,{get(a,p,h){return p===Symbol.asyncIterator?()=>d()[Symbol.asyncIterator]():Reflect.get(a,p,h)}})}async function*Se(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 d=l[c];d&&(o.delta.text&&(u||(u=!0,i=Date.now()-n),d.type==="thinking"?d.thinking=(d.thinking||"")+o.delta.text:d.type==="text"&&(d.text=(d.text||"")+o.delta.text)),o.delta.partial_json&&d.type==="tool_use"&&(d._inputJson=(d._inputJson||"")+o.delta.partial_json));}if(o.type==="content_block_stop"&&c!==null){let d=l[c];if(d&&d.type==="tool_use"){let a=d._inputJson;if(a){try{d.input=JSON.parse(a);}catch{}delete d._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:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:s,durationMs:o,streaming:true});else {let d=R({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:o,status:"success",streaming:true,firstTokenMs:i});if(d&&r.content){let a=L(r.content);a.length>0&&$(a,d);}}}}function L(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function ot(e,t){return t&&Q(t),H().disabled?(g("Tracing disabled, returning unwrapped client"),e):te(e)?(B("anthropic"),Ce(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Ce(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"?ve(i):i}})}function ve(e){return new Proxy(e,{get(t,n,r){let s=Reflect.get(t,n,r);return n==="create"&&typeof s=="function"?ne(s.bind(t)):n==="stream"&&typeof s=="function"?re(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.2",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","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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts","../src/core/transport.ts","../src/core/config.ts","../src/core/capture.ts","../src/core/context.ts","../src/providers/anthropic.ts","../src/anthropic.ts"],"names":["debugEnabled","setDebug","enabled","isDebugEnabled","getEnvVar","PREFIX","debug","message","data","logWithPrefix","info","warn","traceCapture","provider","model","durationMs","status","traceCaptureError","err","clientWrapped","batchSend","count","endpoint","batchSuccess","batchError","requestDetails","method","url","bodySize","responseDetails","level","logFn","name","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL_MS","DEFAULT_REQUEST_TIMEOUT_MS","Transport","config","__publicField","trace","items","startTime","error","path","body","controller","bodyStr","timeoutId","response","errorText","text","globalConfig","globalTransport","DEFAULT_ENDPOINT","init","createTransport","getConfig","isEnabled","getTransport","flush","apiKey","globalContext","setGlobalContext","options","getGlobalContext","captureTrace","params","transport","traceContext","getTraceContext","spanId","generateId","request","sanitizeInput","sanitizeOutput","captureError","captureSpan","metadataTraceId","metadataParentSpanId","cleanMetadata","MAX_STRING_LENGTH","SENSITIVE_KEYS","input","sanitize","output","value","depth","item","sanitized","key","val","k","traceStorage","AsyncLocalStorage","registerToolCalls","toolCallIds","llmSpanId","ctx","id","getToolParentSpanId","toolCallId","clearToolCall","nameOrOptions","fn","parentContext","traceId","rootSpanId","context","result","e","sendRootSpan","rootSpan","span","parentSpanId","PROVIDER_NAME","canHandle","client","c","wrapMessagesCreate","originalFn","args","isStreaming","isAsyncIterable","wrapStreamResponse","messageResponse","toolUseIds","extractToolUseIds","wrapMessagesStream","stream","wrapAnthropicStream","originalStream","finalResponse","captured","firstTokenMs","firstTokenReceived","currentBlockIndex","contentBlocks","wrappedIterator","event","block","inputJson","target","prop","receiver","content","ids","observe","wrapAnthropic","typed","wrapAnthropicMessages","messages"],"mappings":"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","file":"anthropic.js","sourcesContent":["/**\n * Centralized Logger\n *\n * Provides consistent debug logging across the SDK.\n * Enable via: init({ debug: true }) or LELEMON_DEBUG=true\n */\n\n// ─────────────────────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────────────────────\n\nlet debugEnabled = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Enable or disable debug mode\n */\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugEnabled(): boolean {\n // Config takes precedence, then check env var\n if (debugEnabled) return true;\n return getEnvVar('LELEMON_DEBUG') === 'true';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Logging Functions\n// ─────────────────────────────────────────────────────────────\n\nconst PREFIX = '[Lelemon]';\n\n/**\n * Log debug message (only when debug enabled)\n */\nexport function debug(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('debug', message, data);\n}\n\n/**\n * Log info message (only when debug enabled)\n */\nexport function info(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('info', message, data);\n}\n\n/**\n * Log warning message (always shown)\n */\nexport function warn(message: string, data?: unknown): void {\n logWithPrefix('warn', message, data);\n}\n\n/**\n * Log error message (always shown)\n */\nexport function error(message: string, data?: unknown): void {\n logWithPrefix('error', message, data);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Trace-specific logging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Log when a trace is captured\n */\nexport function traceCapture(provider: string, model: string, durationMs: number, status: string): void {\n if (!isDebugEnabled()) return;\n console.log(\n `${PREFIX} Captured trace: provider=${provider} model=${model} duration=${durationMs}ms status=${status}`\n );\n}\n\n/**\n * Log when a trace capture fails (always visible)\n */\nexport function traceCaptureError(provider: string, err: Error): void {\n console.error(`${PREFIX} Failed to capture trace: provider=${provider} error=${err.message}`);\n}\n\n/**\n * Log when a client is wrapped\n */\nexport function clientWrapped(provider: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Wrapped client: provider=${provider}`);\n}\n\n/**\n * Log transport events\n */\nexport function transportEvent(event: string, details?: Record<string, unknown>): void {\n if (!isDebugEnabled()) return;\n if (details) {\n console.log(`${PREFIX} Transport: ${event}`, details);\n } else {\n console.log(`${PREFIX} Transport: ${event}`);\n }\n}\n\n/**\n * Log batch send details\n */\nexport function batchSend(count: number, endpoint: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Sending batch: count=${count} endpoint=${endpoint}`);\n}\n\n/**\n * Log batch send success\n */\nexport function batchSuccess(count: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Batch sent successfully: count=${count} duration=${durationMs}ms`);\n}\n\n/**\n * Log batch send failure (always visible - errors should never be silent)\n */\nexport function batchError(count: number, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${PREFIX} Batch send failed: count=${count} error=${message}`);\n}\n\n/**\n * Log request details (for deep debugging)\n */\nexport function requestDetails(method: string, url: string, bodySize: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Request: ${method} ${url} (${bodySize} bytes)`);\n}\n\n/**\n * Log response details\n */\nexport function responseDetails(status: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Response: status=${status} duration=${durationMs}ms`);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction logWithPrefix(level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: unknown): void {\n const logFn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n\n if (data !== undefined) {\n logFn(`${PREFIX} ${message}`, data);\n } else {\n logFn(`${PREFIX} ${message}`);\n }\n}\n\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Transport Layer\n *\n * Handles batched HTTP requests to the Lelemon API.\n * Features:\n * - Queue-based batching\n * - Auto-flush on batch size or interval\n * - Request timeout protection\n * - Graceful error handling\n */\n\nimport type { CreateTraceRequest } from './types';\nimport { batchSend, batchSuccess, batchError, requestDetails, responseDetails, transportEvent } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\ninterface TransportConfig {\n apiKey: string;\n endpoint: string;\n debug: boolean;\n disabled: boolean;\n batchSize?: number;\n flushIntervalMs?: number;\n requestTimeoutMs?: number;\n}\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\n// ─────────────────────────────────────────────────────────────\n// Transport Class\n// ─────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: CreateTraceRequest[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n debug: config.debug,\n disabled: config.disabled,\n batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n requestTimeoutMs: config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n };\n }\n\n /**\n * Check if transport is enabled\n */\n isEnabled(): boolean {\n return !this.config.disabled && !!this.config.apiKey;\n }\n\n /**\n * Enqueue a trace for sending\n * Fire-and-forget - never blocks\n */\n enqueue(trace: CreateTraceRequest): void {\n if (this.config.disabled) return;\n\n this.queue.push(trace);\n\n if (this.queue.length >= this.config.batchSize) {\n this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n /**\n * Flush all pending traces\n * Safe to call multiple times\n */\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n this.cancelScheduledFlush();\n\n const items = this.queue;\n this.queue = [];\n\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending count (for debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private async sendBatch(items: CreateTraceRequest[]): Promise<void> {\n if (items.length === 0) return;\n\n const startTime = Date.now();\n batchSend(items.length, `${this.config.endpoint}/api/v1/ingest`);\n\n try {\n await this.request('POST', '/api/v1/ingest', { events: items });\n batchSuccess(items.length, Date.now() - startTime);\n } catch (error) {\n batchError(items.length, error);\n // Don't rethrow - observability should never crash the app\n }\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n const bodyStr = body ? JSON.stringify(body) : undefined;\n\n requestDetails(method, url, bodyStr?.length ?? 0);\n\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.requestTimeoutMs);\n\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: bodyStr,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n responseDetails(response.status, Date.now() - startTime);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : {};\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Global Configuration\n *\n * Manages SDK configuration and transport instance.\n */\n\nimport type { LelemonConfig } from './types';\nimport { Transport } from './transport';\nimport { setDebug, info, warn, debug } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Global State\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_ENDPOINT = 'https://www.lelemon.dev';\n\n/**\n * Initialize the SDK\n * Call once at app startup\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n\n // Configure debug mode\n if (config.debug) {\n setDebug(true);\n }\n\n info('Initializing SDK', {\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? false,\n });\n\n globalTransport = createTransport(config);\n initialized = true;\n\n // Log status after transport is created\n if (globalTransport.isEnabled()) {\n info('SDK initialized - tracing enabled');\n } else {\n debug('SDK initialized - tracing disabled (no API key or explicitly disabled)');\n }\n}\n\n/**\n * Get current config\n */\nexport function getConfig(): LelemonConfig {\n return globalConfig;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Transport\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get or create transport instance\n */\nexport function getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\n/**\n * Flush all pending traces\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Create transport instance\n */\nfunction createTransport(config: LelemonConfig): Transport {\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\n\n if (!apiKey && !config.disabled) {\n warn('No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled.');\n }\n\n return new Transport({\n apiKey: apiKey ?? '',\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? !apiKey,\n batchSize: config.batchSize,\n flushIntervalMs: config.flushIntervalMs,\n requestTimeoutMs: config.requestTimeoutMs,\n });\n}\n\n/**\n * Get environment variable (works in Node and edge)\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Capture Module\n *\n * Handles trace capture and batching.\n * Called by providers to record LLM calls.\n */\n\nimport type { ProviderName, CreateTraceRequest, ObserveOptions, CaptureSpanOptions, SpanType } from './types';\nimport { getTransport } from './config';\nimport { traceCapture, traceCaptureError, debug } from './logger';\nimport { getTraceContext, generateId } from './context';\n\n// ─────────────────────────────────────────────────────────────\n// Global context (set via observe options)\n// ─────────────────────────────────────────────────────────────\n\nlet globalContext: ObserveOptions = {};\n\nexport function setGlobalContext(options: ObserveOptions): void {\n globalContext = options;\n debug('Global context updated', options);\n}\n\nexport function getGlobalContext(): ObserveOptions {\n return globalContext;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Capture Functions\n// ─────────────────────────────────────────────────────────────\n\nexport interface CaptureTraceParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n status: 'success' | 'error';\n streaming: boolean;\n metadata?: Record<string, unknown>;\n // Extended fields (Phase 7.1)\n stopReason?: string;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n firstTokenMs?: number;\n thinking?: string;\n}\n\nexport interface CaptureErrorParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n error: Error;\n durationMs: number;\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture a successful trace (LLM call)\n * Fire-and-forget - never throws\n * @returns The span ID, for linking tool calls to this LLM span\n */\nexport function captureTrace(params: CaptureTraceParams): string | undefined {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping trace capture');\n return undefined;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n const spanId = generateId();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: sanitizeOutput(params.output),\n inputTokens: params.inputTokens,\n outputTokens: params.outputTokens,\n durationMs: params.durationMs,\n status: params.status,\n streaming: params.streaming,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n // Hierarchy fields (Phase 7.2) - use trace context if available\n traceId: traceContext?.traceId,\n spanId,\n parentSpanId: traceContext?.currentSpanId,\n metadata: {\n ...globalContext.metadata,\n ...params.metadata,\n // Include trace name for debugging\n ...(traceContext ? { _traceName: traceContext.name } : {}),\n },\n tags: globalContext.tags,\n // Extended fields (Phase 7.1)\n stopReason: params.stopReason,\n cacheReadTokens: params.cacheReadTokens,\n cacheWriteTokens: params.cacheWriteTokens,\n reasoningTokens: params.reasoningTokens,\n firstTokenMs: params.firstTokenMs,\n thinking: params.thinking,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, params.status);\n transport.enqueue(request);\n\n return spanId;\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n return undefined;\n }\n}\n\n/**\n * Capture an error trace\n * Fire-and-forget - never throws\n */\nexport function captureError(params: CaptureErrorParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping error capture');\n return;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: null,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: params.durationMs,\n status: 'error',\n errorMessage: params.error.message,\n errorStack: params.error.stack,\n streaming: params.streaming,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n // Hierarchy fields (Phase 7.2)\n traceId: traceContext?.traceId,\n spanId: generateId(),\n parentSpanId: traceContext?.currentSpanId,\n metadata: {\n ...globalContext.metadata,\n ...params.metadata,\n ...(traceContext ? { _traceName: traceContext.name } : {}),\n },\n tags: globalContext.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, 'error');\n debug('Error details', { message: params.error.message, stack: params.error.stack });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Manual Span Capture\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Manually capture a span (tool call, retrieval, custom)\n * Use this when auto-detection doesn't cover your use case\n *\n * @example\n * // Capture a tool call\n * captureSpan({\n * type: 'tool',\n * name: 'get_weather',\n * input: { location: 'San Francisco' },\n * output: { temperature: 72, conditions: 'sunny' },\n * durationMs: 150,\n * });\n *\n * @example\n * // Capture a retrieval/RAG operation\n * captureSpan({\n * type: 'retrieval',\n * name: 'vector_search',\n * input: { query: 'user question', k: 5 },\n * output: { documents: [...] },\n * durationMs: 50,\n * });\n */\nexport function captureSpan(options: CaptureSpanOptions): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping span capture');\n return;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n\n // Extract trace context from metadata if passed from span() in context.ts\n const metadataTraceId = (options.metadata as Record<string, unknown>)?._traceId as string | undefined;\n const metadataParentSpanId = (options.metadata as Record<string, unknown>)?._parentSpanId as string | undefined;\n\n // Clean up internal metadata keys\n const cleanMetadata = { ...globalContext.metadata, ...options.metadata };\n delete (cleanMetadata as Record<string, unknown>)._traceId;\n delete (cleanMetadata as Record<string, unknown>)._parentSpanId;\n\n const request: CreateTraceRequest = {\n spanType: options.type,\n name: options.name,\n provider: 'unknown', // Manual spans don't have a provider\n model: options.name, // Use name as model for compatibility\n input: sanitizeInput(options.input),\n output: sanitizeOutput(options.output),\n inputTokens: 0,\n outputTokens: 0,\n durationMs: options.durationMs,\n status: options.status || 'success',\n errorMessage: options.errorMessage,\n streaming: false,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n // Hierarchy fields (Phase 7.2)\n traceId: metadataTraceId ?? traceContext?.traceId,\n spanId: generateId(),\n parentSpanId: metadataParentSpanId ?? traceContext?.currentSpanId,\n toolCallId: options.toolCallId,\n metadata: cleanMetadata,\n tags: globalContext.tags,\n };\n\n debug(`Span captured: ${options.type}/${options.name}`, { durationMs: options.durationMs });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError('unknown', err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sanitization (security)\n// ─────────────────────────────────────────────────────────────\n\nconst MAX_STRING_LENGTH = 100_000; // 100KB per field\nconst SENSITIVE_KEYS = ['api_key', 'apikey', 'password', 'secret', 'token', 'authorization'];\n\n/**\n * Sanitize input before sending\n * - Truncates large strings\n * - Removes sensitive data\n */\nfunction sanitizeInput(input: unknown): unknown {\n return sanitize(input, 0);\n}\n\n/**\n * Sanitize output before sending\n */\nfunction sanitizeOutput(output: unknown): unknown {\n return sanitize(output, 0);\n}\n\nfunction sanitize(value: unknown, depth: number): unknown {\n // Prevent infinite recursion\n if (depth > 10) return '[max depth exceeded]';\n\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitize(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n // Redact sensitive keys\n if (SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitize(val, depth + 1);\n }\n }\n\n return sanitized;\n }\n\n // Functions, symbols, etc.\n return String(value);\n}\n","/**\n * Trace Context Module\n *\n * Provides AsyncLocalStorage-based context for grouping spans under a parent trace.\n * Supports hierarchical tracing where:\n * - trace() creates a root \"agent\" span\n * - LLM calls become children of the root\n * - Tool calls become children of the LLM that triggered them (via toolCallId linking)\n *\n * @example\n * ```typescript\n * import { trace, span } from '@lelemondev/sdk';\n *\n * await trace({ name: 'sales-agent', input: userMessage }, async () => {\n * const response = await client.send(new ConverseCommand({...}));\n * // Tools automatically linked to their parent LLM via toolCallId\n * return response;\n * });\n * ```\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { getTransport } from './config';\nimport { getGlobalContext } from './capture';\nimport { debug } from './logger';\nimport type { CreateTraceRequest, SpanType } from './types';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\nexport interface TraceContext {\n /** Unique trace ID (shared by all spans in this trace) */\n traceId: string;\n /** Root span ID (the agent/workflow span) */\n rootSpanId: string;\n /** Current span ID (for nesting - LLM calls become children of this) */\n currentSpanId: string;\n /** Parent span ID (for nested trace() calls) */\n parentSpanId?: string;\n /** Trace name */\n name: string;\n /** Start time in ms */\n startTime: number;\n /** Input data */\n input?: unknown;\n /** Trace metadata */\n metadata?: Record<string, unknown>;\n /** Trace tags */\n tags?: string[];\n /** Map of toolCallId → llmSpanId for linking tool spans to their parent LLM */\n pendingToolCalls: Map<string, string>;\n}\n\nexport interface TraceOptions {\n /** Name for the trace (e.g., 'sales-agent', 'rag-query') */\n name: string;\n /** Input data for the trace */\n input?: unknown;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Tags for filtering */\n tags?: string[];\n}\n\nexport interface SpanOptions {\n /** Span type */\n type: 'retrieval' | 'embedding' | 'tool' | 'guardrail' | 'rerank' | 'custom';\n /** Span name (e.g., 'pinecone-search', 'cohere-rerank') */\n name: string;\n /** Input data */\n input?: unknown;\n /** Output data */\n output?: unknown;\n /** Duration in milliseconds (optional, will be set automatically if not provided) */\n durationMs?: number;\n /** Status */\n status?: 'success' | 'error';\n /** Error message if status is 'error' */\n errorMessage?: string;\n /** Tool call ID (links this tool span to the LLM that requested it) */\n toolCallId?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// AsyncLocalStorage for trace context\n// ─────────────────────────────────────────────────────────────\n\nconst traceStorage = new AsyncLocalStorage<TraceContext>();\n\n// ─────────────────────────────────────────────────────────────\n// ID Generation\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Generate a unique trace/span ID\n * Uses crypto.randomUUID if available, falls back to timestamp-based ID\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older Node.js versions\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Context API\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get the current trace context, if any\n */\nexport function getTraceContext(): TraceContext | undefined {\n return traceStorage.getStore();\n}\n\n/**\n * Check if we're inside a trace() block\n */\nexport function hasTraceContext(): boolean {\n return traceStorage.getStore() !== undefined;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Tool Call Linking\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Register tool calls from an LLM response.\n * When the LLM returns with tool_use, call this to link subsequent tool spans.\n * @param toolCallIds - Array of tool call IDs from the LLM response\n * @param llmSpanId - The span ID of the LLM call that requested these tools\n */\nexport function registerToolCalls(toolCallIds: string[], llmSpanId: string): void {\n const ctx = getTraceContext();\n if (!ctx) return;\n\n for (const id of toolCallIds) {\n ctx.pendingToolCalls.set(id, llmSpanId);\n debug(`Registered tool call ${id} → LLM span ${llmSpanId}`);\n }\n}\n\n/**\n * Get the correct parent span ID for a tool span.\n * If toolCallId matches a pending tool call, returns the LLM span that requested it.\n * Otherwise falls back to the current span ID.\n */\nexport function getToolParentSpanId(toolCallId?: string): string | undefined {\n const ctx = getTraceContext();\n if (!ctx) return undefined;\n\n if (toolCallId && ctx.pendingToolCalls.has(toolCallId)) {\n return ctx.pendingToolCalls.get(toolCallId);\n }\n\n return ctx.currentSpanId;\n}\n\n/**\n * Clear a tool call from the pending map after it's been processed.\n */\nexport function clearToolCall(toolCallId: string): void {\n const ctx = getTraceContext();\n if (ctx) {\n ctx.pendingToolCalls.delete(toolCallId);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// trace() - Main API for grouping spans\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Execute a function within a trace context.\n * Creates a root \"agent\" span that contains all LLM calls and tool executions.\n * The result of the function becomes the output of the root span.\n *\n * @example Simple usage (just name)\n * ```typescript\n * await trace('sales-agent', async () => {\n * await client.send(new ConverseCommand({...}));\n * return finalResponse;\n * });\n * ```\n *\n * @example With options\n * ```typescript\n * await trace({ name: 'rag-query', input: question, tags: ['production'] }, async () => {\n * const docs = await search(question);\n * span({ type: 'retrieval', name: 'pinecone', output: { count: docs.length } });\n * return client.send(new ConverseCommand({...}));\n * });\n * ```\n */\nexport async function trace<T>(\n nameOrOptions: string | TraceOptions,\n fn: () => Promise<T>\n): Promise<T> {\n // Normalize options\n const options: TraceOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n\n const parentContext = getTraceContext();\n const traceId = parentContext?.traceId ?? generateId();\n const rootSpanId = generateId();\n\n const context: TraceContext = {\n traceId,\n rootSpanId,\n currentSpanId: rootSpanId,\n parentSpanId: parentContext?.currentSpanId,\n name: options.name,\n startTime: Date.now(),\n input: options.input,\n metadata: options.metadata,\n tags: options.tags,\n pendingToolCalls: new Map(),\n };\n\n // Run the function within the trace context\n return traceStorage.run(context, async () => {\n let result: T | undefined;\n let error: Error | undefined;\n\n try {\n result = await fn();\n return result;\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n throw e;\n } finally {\n // Send the root span with the final result\n sendRootSpan(context, error ? undefined : result, error);\n }\n });\n}\n\n/**\n * Send the root \"agent\" span when the trace completes.\n * This span represents the entire agent execution with input/output.\n */\nfunction sendRootSpan(context: TraceContext, result?: unknown, error?: Error): void {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping root span');\n return;\n }\n\n const globalContext = getGlobalContext();\n const durationMs = Date.now() - context.startTime;\n\n // Sanitize result if it's a string (common case for agent responses)\n const output = error ? null : result;\n\n const rootSpan: CreateTraceRequest = {\n spanType: 'agent' as SpanType,\n name: context.name,\n provider: 'agent',\n model: context.name,\n traceId: context.traceId,\n spanId: context.rootSpanId,\n parentSpanId: context.parentSpanId,\n input: context.input,\n output,\n inputTokens: 0, // Will be aggregated from children\n outputTokens: 0,\n durationMs,\n status: error ? 'error' : 'success',\n errorMessage: error?.message,\n streaming: false,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n metadata: {\n ...globalContext.metadata,\n ...context.metadata,\n },\n tags: context.tags ?? globalContext.tags,\n };\n\n debug(`Sending root span: ${context.name}`, { durationMs, hasError: !!error });\n transport.enqueue(rootSpan);\n}\n\n// ─────────────────────────────────────────────────────────────\n// span() - Manual span capture for non-LLM operations\n// ─────────────────────────────────────────────────────────────\n\n// Import directly - circular dependency is handled by module system\nimport { captureSpan as captureSpanImport } from './capture';\n\n/**\n * Manually capture a span for non-LLM operations (retrieval, embedding, tool, etc.)\n * Must be called within a trace() block.\n *\n * @example Tool with toolCallId (links to parent LLM)\n * ```typescript\n * span({\n * type: 'tool',\n * name: 'query_database',\n * toolCallId: 'tooluse_abc123', // Links to LLM that requested this\n * input: { sql: 'SELECT ...' },\n * output: { rows: [...] },\n * durationMs: 15,\n * });\n * ```\n *\n * @example Retrieval without toolCallId\n * ```typescript\n * span({\n * type: 'retrieval',\n * name: 'pinecone-search',\n * input: { topK: 5 },\n * output: { count: 10 },\n * durationMs: 50,\n * });\n * ```\n */\nexport function span(options: SpanOptions): void {\n const context = getTraceContext();\n\n if (!context) {\n // Warn but don't throw - fire-and-forget principle\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Lelemon] span() called outside of trace() - span will not be captured');\n }\n return;\n }\n\n // Determine parent: if toolCallId provided and registered, use the LLM span\n const parentSpanId = getToolParentSpanId(options.toolCallId);\n\n captureSpanImport({\n type: options.type,\n name: options.name,\n input: options.input,\n output: options.output,\n durationMs: options.durationMs ?? 0,\n status: options.status ?? 'success',\n errorMessage: options.errorMessage,\n toolCallId: options.toolCallId,\n metadata: {\n ...options.metadata,\n _traceId: context.traceId,\n _parentSpanId: parentSpanId,\n },\n });\n\n // Clear the tool call after processing\n if (options.toolCallId) {\n clearToolCall(options.toolCallId);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Internal helpers (exported for capture.ts)\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run a function with a specific trace context (for internal use)\n */\nexport function runWithContext<T>(context: TraceContext, fn: () => T): T {\n return traceStorage.run(context, fn);\n}\n","/**\n * Anthropic Provider Wrapper\n *\n * Wraps the Anthropic SDK to automatically capture LLM calls.\n * SDK thin: only captures timing and raw response.\n * Server smart: extracts tokens, output, tools, etc.\n */\n\nimport type { ProviderName } from '../core/types';\nimport { captureTrace, captureError } from '../core/capture';\nimport { registerToolCalls } from '../core/context';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicClient {\n messages?: {\n create: (...args: unknown[]) => Promise<unknown>;\n stream?: (...args: unknown[]) => unknown;\n };\n}\n\ninterface MessageRequest {\n model?: string;\n messages?: unknown[];\n system?: string;\n stream?: boolean;\n [key: string]: unknown;\n}\n\ninterface ContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\ninterface UsageInfo {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface MessageResponse {\n id?: string;\n type?: string;\n role?: string;\n content?: ContentBlock[];\n model?: string;\n stop_reason?: string;\n usage?: UsageInfo;\n}\n\ninterface StreamEvent {\n type: string;\n message?: MessageResponse;\n index?: number;\n content_block?: ContentBlock;\n delta?: { type: string; text?: string; partial_json?: string; stop_reason?: string };\n usage?: UsageInfo;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'anthropic';\n\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n const constructorName = client.constructor?.name;\n if (constructorName === 'Anthropic') return true;\n const c = client as Record<string, unknown>;\n return !!(c.messages && typeof c.messages === 'object');\n}\n\nexport function wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicClient;\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapMessagesNamespace(value as AnthropicClient['messages']);\n }\n return value;\n },\n });\n}\n\nfunction wrapMessagesNamespace(messages: AnthropicClient['messages']) {\n if (!messages) return messages;\n return new Proxy(messages, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (prop === 'create' && typeof value === 'function') {\n return wrapMessagesCreate(value.bind(target));\n }\n if (prop === 'stream' && typeof value === 'function') {\n return wrapMessagesStream(value.bind(target));\n }\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Non-Streaming\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedMessagesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStreamResponse(response, request, startTime);\n }\n\n // Non-streaming: send raw response to server\n const durationMs = Date.now() - startTime;\n const messageResponse = response as MessageResponse;\n\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || messageResponse.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: response, // Server extracts everything\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n // Register tool calls for hierarchy (extract IDs only)\n if (spanId && messageResponse.content) {\n const toolUseIds = extractToolUseIds(messageResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesStream(originalFn: (...args: unknown[]) => unknown) {\n return function wrappedMessagesStream(...args: unknown[]): unknown {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n\n try {\n const stream = originalFn(...args);\n if (stream && typeof stream === 'object') {\n return wrapAnthropicStream(stream, request, startTime);\n }\n return stream;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\n// Reconstructs final response from stream events for rawResponse\nfunction wrapAnthropicStream(\n stream: unknown,\n request: MessageRequest,\n startTime: number\n): unknown {\n const originalStream = stream as {\n [Symbol.asyncIterator]?: () => AsyncIterator<StreamEvent>;\n };\n\n if (!originalStream[Symbol.asyncIterator]) {\n return stream;\n }\n\n // Accumulate to reconstruct final response\n const finalResponse: MessageResponse = {\n content: [],\n usage: { input_tokens: 0, output_tokens: 0 },\n };\n let captured = false;\n let firstTokenMs: number | undefined;\n let firstTokenReceived = false;\n\n // Track current content block being built\n let currentBlockIndex: number | null = null;\n const contentBlocks: ContentBlock[] = [];\n\n const wrappedIterator = async function* () {\n try {\n for await (const event of originalStream as AsyncIterable<StreamEvent>) {\n // message_start: get model and initial usage\n if (event.type === 'message_start' && event.message) {\n finalResponse.model = event.message.model;\n finalResponse.id = event.message.id;\n finalResponse.role = event.message.role;\n if (event.message.usage) {\n finalResponse.usage = { ...event.message.usage };\n }\n }\n\n // content_block_start: initialize new block\n if (event.type === 'content_block_start' && event.content_block) {\n currentBlockIndex = event.index ?? contentBlocks.length;\n contentBlocks[currentBlockIndex] = { ...event.content_block };\n if (event.content_block.type === 'text') {\n contentBlocks[currentBlockIndex].text = '';\n }\n if (event.content_block.type === 'thinking') {\n contentBlocks[currentBlockIndex].thinking = '';\n }\n }\n\n // content_block_delta: accumulate text/json\n if (event.type === 'content_block_delta' && event.delta && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block) {\n if (event.delta.text) {\n if (!firstTokenReceived) {\n firstTokenReceived = true;\n firstTokenMs = Date.now() - startTime;\n }\n if (block.type === 'thinking') {\n block.thinking = (block.thinking || '') + event.delta.text;\n } else if (block.type === 'text') {\n block.text = (block.text || '') + event.delta.text;\n }\n }\n if (event.delta.partial_json && block.type === 'tool_use') {\n // Accumulate JSON for tool input\n (block as { _inputJson?: string })._inputJson =\n ((block as { _inputJson?: string })._inputJson || '') + event.delta.partial_json;\n }\n }\n }\n\n // content_block_stop: finalize block\n if (event.type === 'content_block_stop' && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block && block.type === 'tool_use') {\n const inputJson = (block as { _inputJson?: string })._inputJson;\n if (inputJson) {\n try {\n block.input = JSON.parse(inputJson);\n } catch {\n // Keep existing\n }\n delete (block as { _inputJson?: string })._inputJson;\n }\n }\n currentBlockIndex = null;\n }\n\n // message_delta: get stop_reason and final usage\n if (event.type === 'message_delta') {\n if (event.usage?.output_tokens) {\n finalResponse.usage!.output_tokens = event.usage.output_tokens;\n }\n if (event.delta?.stop_reason) {\n finalResponse.stop_reason = event.delta.stop_reason;\n }\n }\n\n yield event;\n }\n } catch (error) {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n }\n throw error;\n } finally {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n // Build final response object\n finalResponse.content = contentBlocks.filter(Boolean);\n\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: finalResponse, // Reconstructed response\n durationMs,\n status: 'success',\n streaming: true,\n firstTokenMs,\n });\n\n // Register tool calls\n if (spanId && finalResponse.content) {\n const toolUseIds = extractToolUseIds(finalResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n }\n }\n };\n\n return new Proxy(stream as object, {\n get(target, prop, receiver) {\n if (prop === Symbol.asyncIterator) {\n return () => wrappedIterator()[Symbol.asyncIterator]();\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nasync function* wrapStreamResponse(\n stream: AsyncIterable<unknown>,\n request: MessageRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const finalResponse: MessageResponse = {\n content: [],\n usage: { input_tokens: 0, output_tokens: 0 },\n };\n let error: Error | null = null;\n let firstTokenMs: number | undefined;\n let firstTokenReceived = false;\n let currentBlockIndex: number | null = null;\n const contentBlocks: ContentBlock[] = [];\n\n try {\n for await (const event of stream as AsyncIterable<StreamEvent>) {\n if (event.type === 'message_start' && event.message) {\n finalResponse.model = event.message.model;\n finalResponse.id = event.message.id;\n finalResponse.role = event.message.role;\n if (event.message.usage) {\n finalResponse.usage = { ...event.message.usage };\n }\n }\n\n if (event.type === 'content_block_start' && event.content_block) {\n currentBlockIndex = event.index ?? contentBlocks.length;\n contentBlocks[currentBlockIndex] = { ...event.content_block };\n if (event.content_block.type === 'text') {\n contentBlocks[currentBlockIndex].text = '';\n }\n if (event.content_block.type === 'thinking') {\n contentBlocks[currentBlockIndex].thinking = '';\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block) {\n if (event.delta.text) {\n if (!firstTokenReceived) {\n firstTokenReceived = true;\n firstTokenMs = Date.now() - startTime;\n }\n if (block.type === 'thinking') {\n block.thinking = (block.thinking || '') + event.delta.text;\n } else if (block.type === 'text') {\n block.text = (block.text || '') + event.delta.text;\n }\n }\n if (event.delta.partial_json && block.type === 'tool_use') {\n (block as { _inputJson?: string })._inputJson =\n ((block as { _inputJson?: string })._inputJson || '') + event.delta.partial_json;\n }\n }\n }\n\n if (event.type === 'content_block_stop' && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block && block.type === 'tool_use') {\n const inputJson = (block as { _inputJson?: string })._inputJson;\n if (inputJson) {\n try {\n block.input = JSON.parse(inputJson);\n } catch {\n // Keep existing\n }\n delete (block as { _inputJson?: string })._inputJson;\n }\n }\n currentBlockIndex = null;\n }\n\n if (event.type === 'message_delta') {\n if (event.usage?.output_tokens) {\n finalResponse.usage!.output_tokens = event.usage.output_tokens;\n }\n if (event.delta?.stop_reason) {\n finalResponse.stop_reason = event.delta.stop_reason;\n }\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n finalResponse.content = contentBlocks.filter(Boolean);\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: finalResponse,\n durationMs,\n status: 'success',\n streaming: true,\n firstTokenMs,\n });\n\n if (spanId && finalResponse.content) {\n const toolUseIds = extractToolUseIds(finalResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractToolUseIds(content: ContentBlock[]): string[] {\n const ids: string[] = [];\n for (const block of content) {\n if (block.type === 'tool_use' && block.id) {\n ids.push(block.id);\n }\n }\n return ids;\n}\n","/**\n * Anthropic Provider Entry Point\n *\n * @example\n * ```typescript\n * import { init, observe, flush } from '@lelemondev/sdk/anthropic';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * init({ apiKey: process.env.LELEMON_API_KEY });\n * const client = observe(new Anthropic());\n *\n * await client.messages.create({...});\n * await flush();\n * ```\n */\n\n// Re-export core\nexport { init, flush, isEnabled } from './core/config';\nexport { trace, span, getTraceContext } from './core/context';\nexport { captureSpan } from './core/capture';\n\n// Re-export types\nexport type {\n LelemonConfig,\n ObserveOptions,\n SpanType,\n CaptureSpanOptions,\n} from './core/types';\nexport type { TraceContext, TraceOptions, SpanOptions } from './core/context';\n\n// Provider-specific observe\nimport * as anthropic from './providers/anthropic';\nimport { setGlobalContext } from './core/capture';\nimport { getConfig } from './core/config';\nimport type { ObserveOptions } from './core/types';\nimport { clientWrapped, warn, debug } from './core/logger';\n\n/**\n * Wrap an Anthropic client with automatic tracing\n */\nexport function observe<T>(client: T, options?: ObserveOptions): T {\n if (options) {\n setGlobalContext(options);\n }\n\n const config = getConfig();\n if (config.disabled) {\n debug('Tracing disabled, returning unwrapped client');\n return client;\n }\n\n if (!anthropic.canHandle(client)) {\n warn('Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK.');\n return client;\n }\n\n clientWrapped('anthropic');\n return wrapAnthropic(client) as T;\n}\n\n// Anthropic wrapper implementation\ninterface AnthropicShape {\n messages?: {\n create: CallableFunction;\n stream?: CallableFunction;\n };\n}\n\nfunction wrapAnthropic(client: unknown): unknown {\n const typed = client as AnthropicShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapAnthropicMessages(value as AnthropicShape['messages']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapAnthropicMessages(messages: AnthropicShape['messages']) {\n return new Proxy(messages!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return anthropic.wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return anthropic.wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/core/logger.ts","../src/core/transport.ts","../src/core/telemetry.ts","../src/core/config.ts","../src/core/capture.ts","../src/core/context.ts","../src/providers/anthropic.ts","../src/anthropic.ts"],"names":["require_package","__commonJSMin","exports","module","debugEnabled","setDebug","enabled","isDebugEnabled","getEnvVar","PREFIX","debug","message","data","logWithPrefix","info","warn","traceCapture","provider","model","durationMs","status","traceCaptureError","err","clientWrapped","batchSend","count","endpoint","batchSuccess","batchError","requestDetails","method","url","bodySize","responseDetails","level","logFn","name","DEFAULT_BATCH_SIZE","DEFAULT_FLUSH_INTERVAL_MS","DEFAULT_REQUEST_TIMEOUT_MS","Transport","config","__publicField","trace","items","startTime","error","path","body","controller","bodyStr","timeoutId","response","errorText","text","SDK_NAME","SDK_LANGUAGE","detectRuntime","detectOS","platform","ua","getSDKVersion","__require","cachedTelemetry","buildTelemetry","service","runtime","os","telemetry","globalConfig","globalTransport","globalTelemetry","DEFAULT_ENDPOINT","init","createTransport","getConfig","getTelemetry","isEnabled","getTransport","flush","apiKey","globalContext","setGlobalContext","options","getGlobalContext","captureTrace","params","transport","traceContext","getTraceContext","spanId","generateId","request","sanitizeInput","sanitize","captureError","captureSpan","metadataTraceId","metadataParentSpanId","cleanMetadata","MAX_STRING_LENGTH","SENSITIVE_KEYS","SENSITIVE_TOKEN_PATTERNS","SAFE_TOKEN_KEYS","isSensitiveKey","key","lowerKey","k","input","value","depth","item","sanitized","val","traceStorage","AsyncLocalStorage","registerToolCalls","toolCallIds","llmSpanId","ctx","id","getToolParentSpanId","toolCallId","clearToolCall","nameOrOptions","fn","parentContext","traceId","rootSpanId","context","result","e","sendRootSpan","output","rootSpan","span","parentSpanId","PROVIDER_NAME","canHandle","client","c","wrapMessagesCreate","originalFn","args","isStreaming","isAsyncIterable","wrapStreamResponse","messageResponse","toolUseIds","extractToolUseIds","wrapMessagesStream","stream","wrapAnthropicStream","originalStream","finalResponse","captured","firstTokenMs","firstTokenReceived","currentBlockIndex","contentBlocks","wrappedIterator","event","block","inputJson","target","prop","receiver","content","ids","observe","wrapAnthropic","typed","wrapAnthropicMessages","messages"],"mappings":"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","file":"anthropic.js","sourcesContent":["{\n \"name\": \"@lelemondev/sdk\",\n \"version\": \"0.9.2\",\n \"description\": \"Automatic LLM observability. Wrap your client, everything is traced.\",\n \"author\": \"Lelemon <info@lelemon.dev>\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/lelemondev/lelemondev-sdk.git\"\n },\n \"homepage\": \"https://lelemon.dev\",\n \"bugs\": {\n \"url\": \"https://github.com/lelemondev/lelemondev-sdk/issues\"\n },\n \"keywords\": [\n \"llm\",\n \"observability\",\n \"tracing\",\n \"openai\",\n \"anthropic\",\n \"nextjs\",\n \"lambda\",\n \"express\",\n \"hono\",\n \"claude\",\n \"gpt\",\n \"ai\",\n \"monitoring\",\n \"serverless\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./openai\": {\n \"types\": \"./dist/openai.d.ts\",\n \"import\": \"./dist/openai.mjs\",\n \"require\": \"./dist/openai.js\"\n },\n \"./anthropic\": {\n \"types\": \"./dist/anthropic.d.ts\",\n \"import\": \"./dist/anthropic.mjs\",\n \"require\": \"./dist/anthropic.js\"\n },\n \"./bedrock\": {\n \"types\": \"./dist/bedrock.d.ts\",\n \"import\": \"./dist/bedrock.mjs\",\n \"require\": \"./dist/bedrock.js\"\n },\n \"./gemini\": {\n \"types\": \"./dist/gemini.d.ts\",\n \"import\": \"./dist/gemini.mjs\",\n \"require\": \"./dist/gemini.js\"\n },\n \"./openrouter\": {\n \"types\": \"./dist/openrouter.d.ts\",\n \"import\": \"./dist/openrouter.mjs\",\n \"require\": \"./dist/openrouter.js\"\n },\n \"./next\": {\n \"types\": \"./dist/next.d.ts\",\n \"import\": \"./dist/next.mjs\",\n \"require\": \"./dist/next.js\"\n },\n \"./lambda\": {\n \"types\": \"./dist/lambda.d.ts\",\n \"import\": \"./dist/lambda.mjs\",\n \"require\": \"./dist/lambda.js\"\n },\n \"./express\": {\n \"types\": \"./dist/express.d.ts\",\n \"import\": \"./dist/express.mjs\",\n \"require\": \"./dist/express.js\"\n },\n \"./hono\": {\n \"types\": \"./dist/hono.d.ts\",\n \"import\": \"./dist/hono.mjs\",\n \"require\": \"./dist/hono.js\"\n },\n \"./integrations\": {\n \"types\": \"./dist/integrations.d.ts\",\n \"import\": \"./dist/integrations.mjs\",\n \"require\": \"./dist/integrations.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"typesVersions\": {\n \"*\": {\n \"openai\": [\n \"./dist/openai.d.ts\"\n ],\n \"anthropic\": [\n \"./dist/anthropic.d.ts\"\n ],\n \"bedrock\": [\n \"./dist/bedrock.d.ts\"\n ],\n \"gemini\": [\n \"./dist/gemini.d.ts\"\n ],\n \"openrouter\": [\n \"./dist/openrouter.d.ts\"\n ],\n \"next\": [\n \"./dist/next.d.ts\"\n ],\n \"lambda\": [\n \"./dist/lambda.d.ts\"\n ],\n \"express\": [\n \"./dist/express.d.ts\"\n ],\n \"hono\": [\n \"./dist/hono.d.ts\"\n ],\n \"integrations\": [\n \"./dist/integrations.d.ts\"\n ],\n \"*\": [\n \"./dist/index.d.ts\"\n ]\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"docs\": \"typedoc && node scripts/generate-llms-txt.mjs\",\n \"prepublishOnly\": \"npm run build\",\n \"lint\": \"eslint src/\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:e2e\": \"vitest run tests/e2e\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@aws-sdk/client-bedrock-runtime\": \"^3.962.0\",\n \"@google/generative-ai\": \"^0.24.1\",\n \"@types/node\": \"^20.0.0\",\n \"@vitest/coverage-v8\": \"^2.0.0\",\n \"dotenv\": \"^17.2.3\",\n \"openai\": \"^6.15.0\",\n \"tsup\": \"^8.5.1\",\n \"typedoc\": \"^0.28.15\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","/**\n * Centralized Logger\n *\n * Provides consistent debug logging across the SDK.\n * Enable via: init({ debug: true }) or LELEMON_DEBUG=true\n */\n\n// ─────────────────────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────────────────────\n\nlet debugEnabled = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Enable or disable debug mode\n */\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugEnabled(): boolean {\n // Config takes precedence, then check env var\n if (debugEnabled) return true;\n return getEnvVar('LELEMON_DEBUG') === 'true';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Logging Functions\n// ─────────────────────────────────────────────────────────────\n\nconst PREFIX = '[Lelemon]';\n\n/**\n * Log debug message (only when debug enabled)\n */\nexport function debug(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('debug', message, data);\n}\n\n/**\n * Log info message (only when debug enabled)\n */\nexport function info(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('info', message, data);\n}\n\n/**\n * Log warning message (always shown)\n */\nexport function warn(message: string, data?: unknown): void {\n logWithPrefix('warn', message, data);\n}\n\n/**\n * Log error message (always shown)\n */\nexport function error(message: string, data?: unknown): void {\n logWithPrefix('error', message, data);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Trace-specific logging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Log when a trace is captured\n */\nexport function traceCapture(provider: string, model: string, durationMs: number, status: string): void {\n if (!isDebugEnabled()) return;\n console.log(\n `${PREFIX} Captured trace: provider=${provider} model=${model} duration=${durationMs}ms status=${status}`\n );\n}\n\n/**\n * Log when a trace capture fails (always visible)\n */\nexport function traceCaptureError(provider: string, err: Error): void {\n console.error(`${PREFIX} Failed to capture trace: provider=${provider} error=${err.message}`);\n}\n\n/**\n * Log when a client is wrapped\n */\nexport function clientWrapped(provider: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Wrapped client: provider=${provider}`);\n}\n\n/**\n * Log transport events\n */\nexport function transportEvent(event: string, details?: Record<string, unknown>): void {\n if (!isDebugEnabled()) return;\n if (details) {\n console.log(`${PREFIX} Transport: ${event}`, details);\n } else {\n console.log(`${PREFIX} Transport: ${event}`);\n }\n}\n\n/**\n * Log batch send details\n */\nexport function batchSend(count: number, endpoint: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Sending batch: count=${count} endpoint=${endpoint}`);\n}\n\n/**\n * Log batch send success\n */\nexport function batchSuccess(count: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Batch sent successfully: count=${count} duration=${durationMs}ms`);\n}\n\n/**\n * Log batch send failure (always visible - errors should never be silent)\n */\nexport function batchError(count: number, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${PREFIX} Batch send failed: count=${count} error=${message}`);\n}\n\n/**\n * Log request details (for deep debugging)\n */\nexport function requestDetails(method: string, url: string, bodySize: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Request: ${method} ${url} (${bodySize} bytes)`);\n}\n\n/**\n * Log response details\n */\nexport function responseDetails(status: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Response: status=${status} duration=${durationMs}ms`);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction logWithPrefix(level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: unknown): void {\n const logFn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n\n if (data !== undefined) {\n logFn(`${PREFIX} ${message}`, data);\n } else {\n logFn(`${PREFIX} ${message}`);\n }\n}\n\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Transport Layer\n *\n * Handles batched HTTP requests to the Lelemon API.\n * Features:\n * - Queue-based batching\n * - Auto-flush on batch size or interval\n * - Request timeout protection\n * - Graceful error handling\n */\n\nimport type { CreateTraceRequest } from './types';\nimport { batchSend, batchSuccess, batchError, requestDetails, responseDetails, transportEvent } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\ninterface TransportConfig {\n apiKey: string;\n endpoint: string;\n debug: boolean;\n disabled: boolean;\n batchSize?: number;\n flushIntervalMs?: number;\n requestTimeoutMs?: number;\n}\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\n// ─────────────────────────────────────────────────────────────\n// Transport Class\n// ─────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: CreateTraceRequest[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n debug: config.debug,\n disabled: config.disabled,\n batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n requestTimeoutMs: config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n };\n }\n\n /**\n * Check if transport is enabled\n */\n isEnabled(): boolean {\n return !this.config.disabled && !!this.config.apiKey;\n }\n\n /**\n * Enqueue a trace for sending\n * Fire-and-forget - never blocks\n */\n enqueue(trace: CreateTraceRequest): void {\n if (this.config.disabled) return;\n\n this.queue.push(trace);\n\n if (this.queue.length >= this.config.batchSize) {\n this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n /**\n * Flush all pending traces\n * Safe to call multiple times\n */\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n this.cancelScheduledFlush();\n\n const items = this.queue;\n this.queue = [];\n\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending count (for debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private async sendBatch(items: CreateTraceRequest[]): Promise<void> {\n if (items.length === 0) return;\n\n const startTime = Date.now();\n batchSend(items.length, `${this.config.endpoint}/api/v1/ingest`);\n\n try {\n await this.request('POST', '/api/v1/ingest', { events: items });\n batchSuccess(items.length, Date.now() - startTime);\n } catch (error) {\n batchError(items.length, error);\n // Don't rethrow - observability should never crash the app\n }\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n const bodyStr = body ? JSON.stringify(body) : undefined;\n\n requestDetails(method, url, bodyStr?.length ?? 0);\n\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.requestTimeoutMs);\n\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: bodyStr,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n responseDetails(response.status, Date.now() - startTime);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : {};\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`);\n }\n\n throw error;\n }\n }\n}\n","/**\n * SDK Telemetry\n *\n * Auto-detects runtime environment and SDK metadata.\n * Follows OpenTelemetry semantic conventions.\n */\n\nimport type { SDKTelemetry, ServiceConfig } from './types';\n\n// SDK metadata (injected at build time or from package.json)\nconst SDK_NAME = '@lelemondev/sdk';\nconst SDK_VERSION = '__SDK_VERSION__'; // Replaced by build script or fallback\nconst SDK_LANGUAGE = 'nodejs';\n\n// ─────────────────────────────────────────────────────────────\n// Runtime Detection\n// ─────────────────────────────────────────────────────────────\n\ninterface RuntimeInfo {\n name: string;\n version: string;\n}\n\nfunction detectRuntime(): RuntimeInfo | null {\n // Node.js\n if (typeof process !== 'undefined' && process.versions?.node) {\n return {\n name: 'nodejs',\n version: process.versions.node,\n };\n }\n\n // Deno\n if (typeof Deno !== 'undefined') {\n return {\n name: 'deno',\n version: (Deno as { version?: { deno?: string } }).version?.deno ?? 'unknown',\n };\n }\n\n // Bun\n if (typeof Bun !== 'undefined') {\n return {\n name: 'bun',\n version: (Bun as { version?: string }).version ?? 'unknown',\n };\n }\n\n // Browser\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n return {\n name: 'browser',\n version: navigator.userAgent,\n };\n }\n\n return null;\n}\n\nfunction detectOS(): string | null {\n // Node.js\n if (typeof process !== 'undefined' && process.platform) {\n const platform = process.platform;\n switch (platform) {\n case 'darwin':\n return 'darwin';\n case 'win32':\n return 'windows';\n case 'linux':\n return 'linux';\n default:\n return platform;\n }\n }\n\n // Browser - try to detect from userAgent\n if (typeof navigator !== 'undefined') {\n const ua = navigator.userAgent.toLowerCase();\n if (ua.includes('mac')) return 'darwin';\n if (ua.includes('win')) return 'windows';\n if (ua.includes('linux')) return 'linux';\n }\n\n return null;\n}\n\nfunction getSDKVersion(): string {\n // If version was injected at build time\n if (SDK_VERSION !== '__SDK_VERSION__') {\n return SDK_VERSION;\n }\n\n // Try to read from package.json in Node.js\n try {\n // Dynamic import to avoid bundler issues\n if (typeof require !== 'undefined') {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkg = require('../../package.json');\n return pkg.version ?? 'unknown';\n }\n } catch {\n // Ignore - package.json not available\n }\n\n return 'unknown';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Telemetry Builder\n// ─────────────────────────────────────────────────────────────\n\nlet cachedTelemetry: SDKTelemetry | null = null;\n\n/**\n * Build SDK telemetry object with auto-detected values\n */\nexport function buildTelemetry(service?: ServiceConfig): SDKTelemetry {\n // Cache the auto-detected values\n if (!cachedTelemetry) {\n const runtime = detectRuntime();\n const os = detectOS();\n\n cachedTelemetry = {\n 'telemetry.sdk.name': SDK_NAME,\n 'telemetry.sdk.version': getSDKVersion(),\n 'telemetry.sdk.language': SDK_LANGUAGE,\n };\n\n if (runtime) {\n cachedTelemetry['process.runtime.name'] = runtime.name;\n cachedTelemetry['process.runtime.version'] = runtime.version;\n }\n\n if (os) {\n cachedTelemetry['os.type'] = os;\n }\n }\n\n // Merge with service config\n const telemetry: SDKTelemetry = { ...cachedTelemetry };\n\n if (service?.name) {\n telemetry['service.name'] = service.name;\n }\n if (service?.version) {\n telemetry['service.version'] = service.version;\n }\n if (service?.environment) {\n telemetry['deployment.environment'] = service.environment;\n }\n\n return telemetry;\n}\n\n/**\n * Reset cached telemetry (for testing)\n */\nexport function resetTelemetryCache(): void {\n cachedTelemetry = null;\n}\n\n// Type declarations for runtime detection\ndeclare const Deno: unknown;\ndeclare const Bun: unknown;\ndeclare const window: unknown;\ndeclare const navigator: { userAgent: string } | undefined;\n","/**\n * Global Configuration\n *\n * Manages SDK configuration and transport instance.\n */\n\nimport type { LelemonConfig, SDKTelemetry } from './types';\nimport { Transport } from './transport';\nimport { setDebug, info, warn, debug } from './logger';\nimport { buildTelemetry } from './telemetry';\n\n// ─────────────────────────────────────────────────────────────\n// Global State\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet globalTelemetry: SDKTelemetry | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_ENDPOINT = 'https://www.lelemon.dev';\n\n/**\n * Initialize the SDK\n * Call once at app startup\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n\n // Configure debug mode\n if (config.debug) {\n setDebug(true);\n }\n\n // Build telemetry with service config\n globalTelemetry = buildTelemetry(config.service);\n\n info('Initializing SDK', {\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? false,\n telemetry: globalTelemetry,\n });\n\n globalTransport = createTransport(config);\n initialized = true;\n\n // Log status after transport is created\n if (globalTransport.isEnabled()) {\n info('SDK initialized - tracing enabled');\n } else {\n debug('SDK initialized - tracing disabled (no API key or explicitly disabled)');\n }\n}\n\n/**\n * Get current config\n */\nexport function getConfig(): LelemonConfig {\n return globalConfig;\n}\n\n/**\n * Get SDK telemetry\n */\nexport function getTelemetry(): SDKTelemetry | null {\n return globalTelemetry;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Transport\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get or create transport instance\n */\nexport function getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\n/**\n * Flush all pending traces\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Create transport instance\n */\nfunction createTransport(config: LelemonConfig): Transport {\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\n\n if (!apiKey && !config.disabled) {\n warn('No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled.');\n }\n\n return new Transport({\n apiKey: apiKey ?? '',\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? !apiKey,\n batchSize: config.batchSize,\n flushIntervalMs: config.flushIntervalMs,\n requestTimeoutMs: config.requestTimeoutMs,\n });\n}\n\n/**\n * Get environment variable (works in Node and edge)\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Capture Module\n *\n * Handles trace capture and batching.\n * Called by providers to record LLM calls.\n */\n\nimport type { ProviderName, CreateTraceRequest, ObserveOptions, CaptureSpanOptions, SpanType } from './types';\nimport { getTransport, getTelemetry } from './config';\nimport { traceCapture, traceCaptureError, debug } from './logger';\nimport { getTraceContext, generateId } from './context';\n\n// ─────────────────────────────────────────────────────────────\n// Global context (set via observe options)\n// ─────────────────────────────────────────────────────────────\n\nlet globalContext: ObserveOptions = {};\n\nexport function setGlobalContext(options: ObserveOptions): void {\n globalContext = options;\n debug('Global context updated', options);\n}\n\nexport function getGlobalContext(): ObserveOptions {\n return globalContext;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Capture Functions\n// ─────────────────────────────────────────────────────────────\n\nexport interface CaptureTraceParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n durationMs: number;\n status: 'success' | 'error';\n streaming: boolean;\n metadata?: Record<string, unknown>;\n\n // Raw response (server extracts tokens, output, tools, etc.)\n rawResponse?: unknown;\n\n // Timing\n firstTokenMs?: number;\n\n // Manual span type\n spanType?: SpanType;\n name?: string;\n}\n\nexport interface CaptureErrorParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n error: Error;\n durationMs: number;\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture a successful trace (LLM call)\n * Fire-and-forget - never throws\n * @returns The span ID, for linking tool calls to this LLM span\n */\nexport function captureTrace(params: CaptureTraceParams): string | undefined {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping trace capture');\n return undefined;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n const spanId = generateId();\n\n // Include SDK telemetry in metadata\n const telemetry = getTelemetry();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n rawResponse: params.rawResponse ? sanitize(params.rawResponse, 0) : undefined,\n durationMs: params.durationMs,\n status: params.status,\n streaming: params.streaming,\n firstTokenMs: params.firstTokenMs,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n // Hierarchy fields\n traceId: traceContext?.traceId,\n spanId,\n parentSpanId: traceContext?.currentSpanId,\n metadata: {\n ...globalContext.metadata,\n ...params.metadata,\n ...(traceContext ? { _traceName: traceContext.name } : {}),\n ...(telemetry ? { _telemetry: telemetry } : {}),\n },\n tags: globalContext.tags,\n // Manual span fields\n spanType: params.spanType,\n name: params.name,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, params.status);\n transport.enqueue(request);\n\n return spanId;\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n return undefined;\n }\n}\n\n/**\n * Capture an error trace\n * Fire-and-forget - never throws\n */\nexport function captureError(params: CaptureErrorParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping error capture');\n return;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n\n // Include SDK telemetry in metadata\n const telemetry = getTelemetry();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n durationMs: params.durationMs,\n status: 'error',\n errorMessage: params.error.message,\n streaming: params.streaming,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n traceId: traceContext?.traceId,\n spanId: generateId(),\n parentSpanId: traceContext?.currentSpanId,\n metadata: {\n ...globalContext.metadata,\n ...params.metadata,\n ...(traceContext ? { _traceName: traceContext.name } : {}),\n ...(telemetry ? { _telemetry: telemetry } : {}),\n },\n tags: globalContext.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, 'error');\n debug('Error details', { message: params.error.message, stack: params.error.stack });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Manual Span Capture\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Manually capture a span (tool call, retrieval, custom)\n * Use this when auto-detection doesn't cover your use case\n *\n * @example\n * // Capture a tool call\n * captureSpan({\n * type: 'tool',\n * name: 'get_weather',\n * input: { location: 'San Francisco' },\n * output: { temperature: 72, conditions: 'sunny' },\n * durationMs: 150,\n * });\n *\n * @example\n * // Capture a retrieval/RAG operation\n * captureSpan({\n * type: 'retrieval',\n * name: 'vector_search',\n * input: { query: 'user question', k: 5 },\n * output: { documents: [...] },\n * durationMs: 50,\n * });\n */\nexport function captureSpan(options: CaptureSpanOptions): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping span capture');\n return;\n }\n\n const globalContext = getGlobalContext();\n const traceContext = getTraceContext();\n\n // Extract trace context from metadata if passed from span() in context.ts\n const metadataTraceId = (options.metadata as Record<string, unknown>)?._traceId as string | undefined;\n const metadataParentSpanId = (options.metadata as Record<string, unknown>)?._parentSpanId as string | undefined;\n\n // Include SDK telemetry in metadata\n const telemetry = getTelemetry();\n\n // Clean up internal metadata keys and add telemetry\n const cleanMetadata: Record<string, unknown> = {\n ...globalContext.metadata,\n ...options.metadata,\n ...(telemetry ? { _telemetry: telemetry } : {}),\n };\n delete cleanMetadata._traceId;\n delete cleanMetadata._parentSpanId;\n\n const request: CreateTraceRequest = {\n spanType: options.type,\n name: options.name,\n provider: 'unknown',\n model: options.name,\n input: sanitizeInput(options.input),\n // Manual spans use output directly (not rawResponse)\n output: sanitize(options.output, 0),\n durationMs: options.durationMs,\n status: options.status || 'success',\n errorMessage: options.errorMessage,\n streaming: false,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n traceId: metadataTraceId ?? traceContext?.traceId,\n spanId: generateId(),\n parentSpanId: metadataParentSpanId ?? traceContext?.currentSpanId,\n toolCallId: options.toolCallId,\n metadata: cleanMetadata,\n tags: globalContext.tags,\n };\n\n debug(`Span captured: ${options.type}/${options.name}`, { durationMs: options.durationMs });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError('unknown', err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sanitization (security)\n// ─────────────────────────────────────────────────────────────\n\nconst MAX_STRING_LENGTH = 100_000; // 100KB per field\n\n// Keys that should be redacted (authentication-related)\n// Note: We use specific patterns to avoid false positives with LLM token counts\nconst SENSITIVE_KEYS = ['api_key', 'apikey', 'password', 'secret', 'authorization'];\nconst SENSITIVE_TOKEN_PATTERNS = ['access_token', 'auth_token', 'bearer_token', 'refresh_token', 'id_token', 'session_token'];\n\n// Keys that contain \"token\" but are safe (LLM token counts)\nconst SAFE_TOKEN_KEYS = ['inputtokens', 'outputtokens', 'totaltokens', 'prompttokens', 'completiontokens', 'cachereadtokens', 'cachewritetokens', 'cachereadinputtokens', 'cachewriteinputtokens', 'reasoningtokens'];\n\n/**\n * Check if a key should be redacted\n */\nfunction isSensitiveKey(key: string): boolean {\n const lowerKey = key.toLowerCase();\n\n // Check if it's a safe token key (LLM token counts)\n if (SAFE_TOKEN_KEYS.includes(lowerKey)) {\n return false;\n }\n\n // Check sensitive patterns\n if (SENSITIVE_KEYS.some((k) => lowerKey.includes(k))) {\n return true;\n }\n\n // Check specific token patterns (auth tokens)\n if (SENSITIVE_TOKEN_PATTERNS.some((k) => lowerKey.includes(k))) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sanitize input before sending\n * - Truncates large strings\n * - Removes sensitive data\n */\nfunction sanitizeInput(input: unknown): unknown {\n return sanitize(input, 0);\n}\n\n/**\n * Sanitize output before sending\n */\nfunction sanitizeOutput(output: unknown): unknown {\n return sanitize(output, 0);\n}\n\nfunction sanitize(value: unknown, depth: number): unknown {\n // Prevent infinite recursion\n if (depth > 10) return '[max depth exceeded]';\n\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitize(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n // Redact sensitive keys\n if (isSensitiveKey(key)) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitize(val, depth + 1);\n }\n }\n\n return sanitized;\n }\n\n // Functions, symbols, etc.\n return String(value);\n}\n","/**\n * Trace Context Module\n *\n * Provides AsyncLocalStorage-based context for grouping spans under a parent trace.\n * Supports hierarchical tracing where:\n * - trace() creates a root \"agent\" span\n * - LLM calls become children of the root\n * - Tool calls become children of the LLM that triggered them (via toolCallId linking)\n *\n * @example\n * ```typescript\n * import { trace, span } from '@lelemondev/sdk';\n *\n * await trace({ name: 'sales-agent', input: userMessage }, async () => {\n * const response = await client.send(new ConverseCommand({...}));\n * // Tools automatically linked to their parent LLM via toolCallId\n * return response;\n * });\n * ```\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { getTransport } from './config';\nimport { getGlobalContext } from './capture';\nimport { debug } from './logger';\nimport type { CreateTraceRequest, SpanType } from './types';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\nexport interface TraceContext {\n /** Unique trace ID (shared by all spans in this trace) */\n traceId: string;\n /** Root span ID (the agent/workflow span) */\n rootSpanId: string;\n /** Current span ID (for nesting - LLM calls become children of this) */\n currentSpanId: string;\n /** Parent span ID (for nested trace() calls) */\n parentSpanId?: string;\n /** Trace name */\n name: string;\n /** Start time in ms */\n startTime: number;\n /** Input data */\n input?: unknown;\n /** Trace metadata */\n metadata?: Record<string, unknown>;\n /** Trace tags */\n tags?: string[];\n /** Map of toolCallId → llmSpanId for linking tool spans to their parent LLM */\n pendingToolCalls: Map<string, string>;\n}\n\nexport interface TraceOptions {\n /** Name for the trace (e.g., 'sales-agent', 'rag-query') */\n name: string;\n /** Input data for the trace */\n input?: unknown;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Tags for filtering */\n tags?: string[];\n}\n\nexport interface SpanOptions {\n /** Span type */\n type: 'retrieval' | 'embedding' | 'tool' | 'guardrail' | 'rerank' | 'custom';\n /** Span name (e.g., 'pinecone-search', 'cohere-rerank') */\n name: string;\n /** Input data */\n input?: unknown;\n /** Output data */\n output?: unknown;\n /** Duration in milliseconds (optional, will be set automatically if not provided) */\n durationMs?: number;\n /** Status */\n status?: 'success' | 'error';\n /** Error message if status is 'error' */\n errorMessage?: string;\n /** Tool call ID (links this tool span to the LLM that requested it) */\n toolCallId?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// AsyncLocalStorage for trace context\n// ─────────────────────────────────────────────────────────────\n\nconst traceStorage = new AsyncLocalStorage<TraceContext>();\n\n// ─────────────────────────────────────────────────────────────\n// ID Generation\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Generate a unique trace/span ID\n * Uses crypto.randomUUID if available, falls back to timestamp-based ID\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older Node.js versions\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Context API\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get the current trace context, if any\n */\nexport function getTraceContext(): TraceContext | undefined {\n return traceStorage.getStore();\n}\n\n/**\n * Check if we're inside a trace() block\n */\nexport function hasTraceContext(): boolean {\n return traceStorage.getStore() !== undefined;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Tool Call Linking\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Register tool calls from an LLM response.\n * When the LLM returns with tool_use, call this to link subsequent tool spans.\n * @param toolCallIds - Array of tool call IDs from the LLM response\n * @param llmSpanId - The span ID of the LLM call that requested these tools\n */\nexport function registerToolCalls(toolCallIds: string[], llmSpanId: string): void {\n const ctx = getTraceContext();\n if (!ctx) return;\n\n for (const id of toolCallIds) {\n ctx.pendingToolCalls.set(id, llmSpanId);\n debug(`Registered tool call ${id} → LLM span ${llmSpanId}`);\n }\n}\n\n/**\n * Get the correct parent span ID for a tool span.\n * If toolCallId matches a pending tool call, returns the LLM span that requested it.\n * Otherwise falls back to the current span ID.\n */\nexport function getToolParentSpanId(toolCallId?: string): string | undefined {\n const ctx = getTraceContext();\n if (!ctx) return undefined;\n\n if (toolCallId && ctx.pendingToolCalls.has(toolCallId)) {\n return ctx.pendingToolCalls.get(toolCallId);\n }\n\n return ctx.currentSpanId;\n}\n\n/**\n * Clear a tool call from the pending map after it's been processed.\n */\nexport function clearToolCall(toolCallId: string): void {\n const ctx = getTraceContext();\n if (ctx) {\n ctx.pendingToolCalls.delete(toolCallId);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// trace() - Main API for grouping spans\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Execute a function within a trace context.\n * Creates a root \"agent\" span that contains all LLM calls and tool executions.\n * The result of the function becomes the output of the root span.\n *\n * @example Simple usage (just name)\n * ```typescript\n * await trace('sales-agent', async () => {\n * await client.send(new ConverseCommand({...}));\n * return finalResponse;\n * });\n * ```\n *\n * @example With options\n * ```typescript\n * await trace({ name: 'rag-query', input: question, tags: ['production'] }, async () => {\n * const docs = await search(question);\n * span({ type: 'retrieval', name: 'pinecone', output: { count: docs.length } });\n * return client.send(new ConverseCommand({...}));\n * });\n * ```\n */\nexport async function trace<T>(\n nameOrOptions: string | TraceOptions,\n fn: () => Promise<T>\n): Promise<T> {\n // Normalize options\n const options: TraceOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n\n const parentContext = getTraceContext();\n const traceId = parentContext?.traceId ?? generateId();\n const rootSpanId = generateId();\n\n const context: TraceContext = {\n traceId,\n rootSpanId,\n currentSpanId: rootSpanId,\n parentSpanId: parentContext?.currentSpanId,\n name: options.name,\n startTime: Date.now(),\n input: options.input,\n metadata: options.metadata,\n tags: options.tags,\n pendingToolCalls: new Map(),\n };\n\n // Run the function within the trace context\n return traceStorage.run(context, async () => {\n let result: T | undefined;\n let error: Error | undefined;\n\n try {\n result = await fn();\n return result;\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n throw e;\n } finally {\n // Send the root span with the final result\n sendRootSpan(context, error ? undefined : result, error);\n }\n });\n}\n\n/**\n * Send the root \"agent\" span when the trace completes.\n * This span represents the entire agent execution with input/output.\n */\nfunction sendRootSpan(context: TraceContext, result?: unknown, error?: Error): void {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping root span');\n return;\n }\n\n const globalContext = getGlobalContext();\n const durationMs = Date.now() - context.startTime;\n\n // Sanitize result if it's a string (common case for agent responses)\n const output = error ? null : result;\n\n const rootSpan: CreateTraceRequest = {\n spanType: 'agent' as SpanType,\n name: context.name,\n provider: 'agent',\n model: context.name,\n traceId: context.traceId,\n spanId: context.rootSpanId,\n parentSpanId: context.parentSpanId,\n input: context.input,\n output,\n inputTokens: 0, // Will be aggregated from children\n outputTokens: 0,\n durationMs,\n status: error ? 'error' : 'success',\n errorMessage: error?.message,\n streaming: false,\n sessionId: globalContext.sessionId,\n userId: globalContext.userId,\n metadata: {\n ...globalContext.metadata,\n ...context.metadata,\n },\n tags: context.tags ?? globalContext.tags,\n };\n\n debug(`Sending root span: ${context.name}`, { durationMs, hasError: !!error });\n transport.enqueue(rootSpan);\n}\n\n// ─────────────────────────────────────────────────────────────\n// span() - Manual span capture for non-LLM operations\n// ─────────────────────────────────────────────────────────────\n\n// Import directly - circular dependency is handled by module system\nimport { captureSpan as captureSpanImport } from './capture';\n\n/**\n * Manually capture a span for non-LLM operations (retrieval, embedding, tool, etc.)\n * Must be called within a trace() block.\n *\n * @example Tool with toolCallId (links to parent LLM)\n * ```typescript\n * span({\n * type: 'tool',\n * name: 'query_database',\n * toolCallId: 'tooluse_abc123', // Links to LLM that requested this\n * input: { sql: 'SELECT ...' },\n * output: { rows: [...] },\n * durationMs: 15,\n * });\n * ```\n *\n * @example Retrieval without toolCallId\n * ```typescript\n * span({\n * type: 'retrieval',\n * name: 'pinecone-search',\n * input: { topK: 5 },\n * output: { count: 10 },\n * durationMs: 50,\n * });\n * ```\n */\nexport function span(options: SpanOptions): void {\n const context = getTraceContext();\n\n if (!context) {\n // Warn but don't throw - fire-and-forget principle\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Lelemon] span() called outside of trace() - span will not be captured');\n }\n return;\n }\n\n // Determine parent: if toolCallId provided and registered, use the LLM span\n const parentSpanId = getToolParentSpanId(options.toolCallId);\n\n captureSpanImport({\n type: options.type,\n name: options.name,\n input: options.input,\n output: options.output,\n durationMs: options.durationMs ?? 0,\n status: options.status ?? 'success',\n errorMessage: options.errorMessage,\n toolCallId: options.toolCallId,\n metadata: {\n ...options.metadata,\n _traceId: context.traceId,\n _parentSpanId: parentSpanId,\n },\n });\n\n // Clear the tool call after processing\n if (options.toolCallId) {\n clearToolCall(options.toolCallId);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Internal helpers (exported for capture.ts)\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run a function with a specific trace context (for internal use)\n */\nexport function runWithContext<T>(context: TraceContext, fn: () => T): T {\n return traceStorage.run(context, fn);\n}\n","/**\n * Anthropic Provider Wrapper\n *\n * Wraps the Anthropic SDK to automatically capture LLM calls.\n * SDK thin: only captures timing and raw response.\n * Server smart: extracts tokens, output, tools, etc.\n */\n\nimport type { ProviderName } from '../core/types';\nimport { captureTrace, captureError } from '../core/capture';\nimport { registerToolCalls } from '../core/context';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicClient {\n messages?: {\n create: (...args: unknown[]) => Promise<unknown>;\n stream?: (...args: unknown[]) => unknown;\n };\n}\n\ninterface MessageRequest {\n model?: string;\n messages?: unknown[];\n system?: string;\n stream?: boolean;\n [key: string]: unknown;\n}\n\ninterface ContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\ninterface UsageInfo {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface MessageResponse {\n id?: string;\n type?: string;\n role?: string;\n content?: ContentBlock[];\n model?: string;\n stop_reason?: string;\n usage?: UsageInfo;\n}\n\ninterface StreamEvent {\n type: string;\n message?: MessageResponse;\n index?: number;\n content_block?: ContentBlock;\n delta?: { type: string; text?: string; partial_json?: string; stop_reason?: string };\n usage?: UsageInfo;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'anthropic';\n\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n const constructorName = client.constructor?.name;\n if (constructorName === 'Anthropic') return true;\n const c = client as Record<string, unknown>;\n return !!(c.messages && typeof c.messages === 'object');\n}\n\nexport function wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicClient;\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapMessagesNamespace(value as AnthropicClient['messages']);\n }\n return value;\n },\n });\n}\n\nfunction wrapMessagesNamespace(messages: AnthropicClient['messages']) {\n if (!messages) return messages;\n return new Proxy(messages, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (prop === 'create' && typeof value === 'function') {\n return wrapMessagesCreate(value.bind(target));\n }\n if (prop === 'stream' && typeof value === 'function') {\n return wrapMessagesStream(value.bind(target));\n }\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Non-Streaming\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedMessagesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStreamResponse(response, request, startTime);\n }\n\n // Non-streaming: send raw response to server\n const durationMs = Date.now() - startTime;\n const messageResponse = response as MessageResponse;\n\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || messageResponse.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: response, // Server extracts everything\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n // Register tool calls for hierarchy (extract IDs only)\n if (spanId && messageResponse.content) {\n const toolUseIds = extractToolUseIds(messageResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesStream(originalFn: (...args: unknown[]) => unknown) {\n return function wrappedMessagesStream(...args: unknown[]): unknown {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n\n try {\n const stream = originalFn(...args);\n if (stream && typeof stream === 'object') {\n return wrapAnthropicStream(stream, request, startTime);\n }\n return stream;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\n// Reconstructs final response from stream events for rawResponse\nfunction wrapAnthropicStream(\n stream: unknown,\n request: MessageRequest,\n startTime: number\n): unknown {\n const originalStream = stream as {\n [Symbol.asyncIterator]?: () => AsyncIterator<StreamEvent>;\n };\n\n if (!originalStream[Symbol.asyncIterator]) {\n return stream;\n }\n\n // Accumulate to reconstruct final response\n const finalResponse: MessageResponse = {\n content: [],\n usage: { input_tokens: 0, output_tokens: 0 },\n };\n let captured = false;\n let firstTokenMs: number | undefined;\n let firstTokenReceived = false;\n\n // Track current content block being built\n let currentBlockIndex: number | null = null;\n const contentBlocks: ContentBlock[] = [];\n\n const wrappedIterator = async function* () {\n try {\n for await (const event of originalStream as AsyncIterable<StreamEvent>) {\n // message_start: get model and initial usage\n if (event.type === 'message_start' && event.message) {\n finalResponse.model = event.message.model;\n finalResponse.id = event.message.id;\n finalResponse.role = event.message.role;\n if (event.message.usage) {\n finalResponse.usage = { ...event.message.usage };\n }\n }\n\n // content_block_start: initialize new block\n if (event.type === 'content_block_start' && event.content_block) {\n currentBlockIndex = event.index ?? contentBlocks.length;\n contentBlocks[currentBlockIndex] = { ...event.content_block };\n if (event.content_block.type === 'text') {\n contentBlocks[currentBlockIndex].text = '';\n }\n if (event.content_block.type === 'thinking') {\n contentBlocks[currentBlockIndex].thinking = '';\n }\n }\n\n // content_block_delta: accumulate text/json\n if (event.type === 'content_block_delta' && event.delta && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block) {\n if (event.delta.text) {\n if (!firstTokenReceived) {\n firstTokenReceived = true;\n firstTokenMs = Date.now() - startTime;\n }\n if (block.type === 'thinking') {\n block.thinking = (block.thinking || '') + event.delta.text;\n } else if (block.type === 'text') {\n block.text = (block.text || '') + event.delta.text;\n }\n }\n if (event.delta.partial_json && block.type === 'tool_use') {\n // Accumulate JSON for tool input\n (block as { _inputJson?: string })._inputJson =\n ((block as { _inputJson?: string })._inputJson || '') + event.delta.partial_json;\n }\n }\n }\n\n // content_block_stop: finalize block\n if (event.type === 'content_block_stop' && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block && block.type === 'tool_use') {\n const inputJson = (block as { _inputJson?: string })._inputJson;\n if (inputJson) {\n try {\n block.input = JSON.parse(inputJson);\n } catch {\n // Keep existing\n }\n delete (block as { _inputJson?: string })._inputJson;\n }\n }\n currentBlockIndex = null;\n }\n\n // message_delta: get stop_reason and final usage\n if (event.type === 'message_delta') {\n if (event.usage?.output_tokens) {\n finalResponse.usage!.output_tokens = event.usage.output_tokens;\n }\n if (event.delta?.stop_reason) {\n finalResponse.stop_reason = event.delta.stop_reason;\n }\n }\n\n yield event;\n }\n } catch (error) {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n captureError({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n }\n throw error;\n } finally {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n // Build final response object\n finalResponse.content = contentBlocks.filter(Boolean);\n\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: finalResponse, // Reconstructed response\n durationMs,\n status: 'success',\n streaming: true,\n firstTokenMs,\n });\n\n // Register tool calls\n if (spanId && finalResponse.content) {\n const toolUseIds = extractToolUseIds(finalResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n }\n }\n };\n\n return new Proxy(stream as object, {\n get(target, prop, receiver) {\n if (prop === Symbol.asyncIterator) {\n return () => wrappedIterator()[Symbol.asyncIterator]();\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nasync function* wrapStreamResponse(\n stream: AsyncIterable<unknown>,\n request: MessageRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const finalResponse: MessageResponse = {\n content: [],\n usage: { input_tokens: 0, output_tokens: 0 },\n };\n let error: Error | null = null;\n let firstTokenMs: number | undefined;\n let firstTokenReceived = false;\n let currentBlockIndex: number | null = null;\n const contentBlocks: ContentBlock[] = [];\n\n try {\n for await (const event of stream as AsyncIterable<StreamEvent>) {\n if (event.type === 'message_start' && event.message) {\n finalResponse.model = event.message.model;\n finalResponse.id = event.message.id;\n finalResponse.role = event.message.role;\n if (event.message.usage) {\n finalResponse.usage = { ...event.message.usage };\n }\n }\n\n if (event.type === 'content_block_start' && event.content_block) {\n currentBlockIndex = event.index ?? contentBlocks.length;\n contentBlocks[currentBlockIndex] = { ...event.content_block };\n if (event.content_block.type === 'text') {\n contentBlocks[currentBlockIndex].text = '';\n }\n if (event.content_block.type === 'thinking') {\n contentBlocks[currentBlockIndex].thinking = '';\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block) {\n if (event.delta.text) {\n if (!firstTokenReceived) {\n firstTokenReceived = true;\n firstTokenMs = Date.now() - startTime;\n }\n if (block.type === 'thinking') {\n block.thinking = (block.thinking || '') + event.delta.text;\n } else if (block.type === 'text') {\n block.text = (block.text || '') + event.delta.text;\n }\n }\n if (event.delta.partial_json && block.type === 'tool_use') {\n (block as { _inputJson?: string })._inputJson =\n ((block as { _inputJson?: string })._inputJson || '') + event.delta.partial_json;\n }\n }\n }\n\n if (event.type === 'content_block_stop' && currentBlockIndex !== null) {\n const block = contentBlocks[currentBlockIndex];\n if (block && block.type === 'tool_use') {\n const inputJson = (block as { _inputJson?: string })._inputJson;\n if (inputJson) {\n try {\n block.input = JSON.parse(inputJson);\n } catch {\n // Keep existing\n }\n delete (block as { _inputJson?: string })._inputJson;\n }\n }\n currentBlockIndex = null;\n }\n\n if (event.type === 'message_delta') {\n if (event.usage?.output_tokens) {\n finalResponse.usage!.output_tokens = event.usage.output_tokens;\n }\n if (event.delta?.stop_reason) {\n finalResponse.stop_reason = event.delta.stop_reason;\n }\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n finalResponse.content = contentBlocks.filter(Boolean);\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n const spanId = captureTrace({\n provider: PROVIDER_NAME,\n model: finalResponse.model || request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n rawResponse: finalResponse,\n durationMs,\n status: 'success',\n streaming: true,\n firstTokenMs,\n });\n\n if (spanId && finalResponse.content) {\n const toolUseIds = extractToolUseIds(finalResponse.content);\n if (toolUseIds.length > 0) {\n registerToolCalls(toolUseIds, spanId);\n }\n }\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractToolUseIds(content: ContentBlock[]): string[] {\n const ids: string[] = [];\n for (const block of content) {\n if (block.type === 'tool_use' && block.id) {\n ids.push(block.id);\n }\n }\n return ids;\n}\n","/**\n * Anthropic Provider Entry Point\n *\n * @example\n * ```typescript\n * import { init, observe, flush } from '@lelemondev/sdk/anthropic';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * init({ apiKey: process.env.LELEMON_API_KEY });\n * const client = observe(new Anthropic());\n *\n * await client.messages.create({...});\n * await flush();\n * ```\n */\n\n// Re-export core\nexport { init, flush, isEnabled } from './core/config';\nexport { trace, span, getTraceContext } from './core/context';\nexport { captureSpan } from './core/capture';\n\n// Re-export types\nexport type {\n LelemonConfig,\n ObserveOptions,\n SpanType,\n CaptureSpanOptions,\n} from './core/types';\nexport type { TraceContext, TraceOptions, SpanOptions } from './core/context';\n\n// Provider-specific observe\nimport * as anthropic from './providers/anthropic';\nimport { setGlobalContext } from './core/capture';\nimport { getConfig } from './core/config';\nimport type { ObserveOptions } from './core/types';\nimport { clientWrapped, warn, debug } from './core/logger';\n\n/**\n * Wrap an Anthropic client with automatic tracing\n */\nexport function observe<T>(client: T, options?: ObserveOptions): T {\n if (options) {\n setGlobalContext(options);\n }\n\n const config = getConfig();\n if (config.disabled) {\n debug('Tracing disabled, returning unwrapped client');\n return client;\n }\n\n if (!anthropic.canHandle(client)) {\n warn('Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK.');\n return client;\n }\n\n clientWrapped('anthropic');\n return wrapAnthropic(client) as T;\n}\n\n// Anthropic wrapper implementation\ninterface AnthropicShape {\n messages?: {\n create: CallableFunction;\n stream?: CallableFunction;\n };\n}\n\nfunction wrapAnthropic(client: unknown): unknown {\n const typed = client as AnthropicShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapAnthropicMessages(value as AnthropicShape['messages']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapAnthropicMessages(messages: AnthropicShape['messages']) {\n return new Proxy(messages!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return anthropic.wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return anthropic.wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n"]}
|