@lelemondev/sdk 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/anthropic.js +2 -2
- package/dist/anthropic.mjs +2 -2
- package/dist/bedrock.js +2 -2
- package/dist/bedrock.mjs +2 -2
- package/dist/express.js +1 -1
- package/dist/express.mjs +1 -1
- package/dist/gemini.js +2 -2
- package/dist/gemini.mjs +2 -2
- package/dist/hono.js +1 -1
- package/dist/hono.mjs +1 -1
- package/dist/index.d.mts +31 -1
- package/dist/index.d.ts +31 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/integrations.js +1 -1
- package/dist/integrations.mjs +1 -1
- package/dist/lambda.mjs +1 -1
- package/dist/next.js +1 -1
- package/dist/next.mjs +1 -1
- package/dist/openai.js +2 -2
- package/dist/openai.mjs +2 -2
- package/dist/openrouter.js +2 -2
- package/dist/openrouter.mjs +2 -2
- package/package.json +5 -2
- package/dist/anthropic.js.map +0 -1
- package/dist/anthropic.mjs.map +0 -1
- package/dist/bedrock.js.map +0 -1
- package/dist/bedrock.mjs.map +0 -1
- package/dist/express.js.map +0 -1
- package/dist/express.mjs.map +0 -1
- package/dist/gemini.js.map +0 -1
- package/dist/gemini.mjs.map +0 -1
- package/dist/hono.js.map +0 -1
- package/dist/hono.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/integrations.js.map +0 -1
- package/dist/integrations.mjs.map +0 -1
- package/dist/lambda.js.map +0 -1
- package/dist/lambda.mjs.map +0 -1
- package/dist/next.js.map +0 -1
- package/dist/next.mjs.map +0 -1
- package/dist/openai.js.map +0 -1
- package/dist/openai.mjs.map +0 -1
- package/dist/openrouter.js.map +0 -1
- package/dist/openrouter.mjs.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core types for Lelemon SDK
|
|
3
3
|
*/
|
|
4
|
+
interface ServiceConfig {
|
|
5
|
+
/** Service name (e.g., "my-ai-chatbot") */
|
|
6
|
+
name?: string;
|
|
7
|
+
/** Service version (e.g., "1.2.3") */
|
|
8
|
+
version?: string;
|
|
9
|
+
/** Deployment environment (e.g., "production", "staging", "development") */
|
|
10
|
+
environment?: string;
|
|
11
|
+
}
|
|
4
12
|
interface LelemonConfig {
|
|
5
13
|
/** API key (or set LELEMON_API_KEY env var) */
|
|
6
14
|
apiKey?: string;
|
|
@@ -16,6 +24,28 @@ interface LelemonConfig {
|
|
|
16
24
|
flushIntervalMs?: number;
|
|
17
25
|
/** Request timeout in ms (default: 10000) */
|
|
18
26
|
requestTimeoutMs?: number;
|
|
27
|
+
/** Service metadata for telemetry */
|
|
28
|
+
service?: ServiceConfig;
|
|
29
|
+
}
|
|
30
|
+
interface SDKTelemetry {
|
|
31
|
+
/** SDK name */
|
|
32
|
+
'telemetry.sdk.name': string;
|
|
33
|
+
/** SDK version */
|
|
34
|
+
'telemetry.sdk.version': string;
|
|
35
|
+
/** SDK language */
|
|
36
|
+
'telemetry.sdk.language': string;
|
|
37
|
+
/** Runtime name (nodejs, deno, bun, browser) */
|
|
38
|
+
'process.runtime.name'?: string;
|
|
39
|
+
/** Runtime version */
|
|
40
|
+
'process.runtime.version'?: string;
|
|
41
|
+
/** OS type (linux, darwin, windows) */
|
|
42
|
+
'os.type'?: string;
|
|
43
|
+
/** Service name */
|
|
44
|
+
'service.name'?: string;
|
|
45
|
+
/** Service version */
|
|
46
|
+
'service.version'?: string;
|
|
47
|
+
/** Deployment environment */
|
|
48
|
+
'deployment.environment'?: string;
|
|
19
49
|
}
|
|
20
50
|
type ProviderName = 'openai' | 'anthropic' | 'gemini' | 'bedrock' | 'openrouter' | 'agent' | 'unknown';
|
|
21
51
|
interface ObserveOptions {
|
|
@@ -231,4 +261,4 @@ declare function span(options: SpanOptions): void;
|
|
|
231
261
|
*/
|
|
232
262
|
declare function captureSpan(options: CaptureSpanOptions): void;
|
|
233
263
|
|
|
234
|
-
export { type CaptureSpanOptions, type LelemonConfig, type ObserveOptions, type ProviderName, type SpanOptions, type SpanType, type TraceContext, type TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace };
|
|
264
|
+
export { type CaptureSpanOptions, type LelemonConfig, type ObserveOptions, type ProviderName, type SDKTelemetry, type ServiceConfig, type SpanOptions, type SpanType, type TraceContext, type TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core types for Lelemon SDK
|
|
3
3
|
*/
|
|
4
|
+
interface ServiceConfig {
|
|
5
|
+
/** Service name (e.g., "my-ai-chatbot") */
|
|
6
|
+
name?: string;
|
|
7
|
+
/** Service version (e.g., "1.2.3") */
|
|
8
|
+
version?: string;
|
|
9
|
+
/** Deployment environment (e.g., "production", "staging", "development") */
|
|
10
|
+
environment?: string;
|
|
11
|
+
}
|
|
4
12
|
interface LelemonConfig {
|
|
5
13
|
/** API key (or set LELEMON_API_KEY env var) */
|
|
6
14
|
apiKey?: string;
|
|
@@ -16,6 +24,28 @@ interface LelemonConfig {
|
|
|
16
24
|
flushIntervalMs?: number;
|
|
17
25
|
/** Request timeout in ms (default: 10000) */
|
|
18
26
|
requestTimeoutMs?: number;
|
|
27
|
+
/** Service metadata for telemetry */
|
|
28
|
+
service?: ServiceConfig;
|
|
29
|
+
}
|
|
30
|
+
interface SDKTelemetry {
|
|
31
|
+
/** SDK name */
|
|
32
|
+
'telemetry.sdk.name': string;
|
|
33
|
+
/** SDK version */
|
|
34
|
+
'telemetry.sdk.version': string;
|
|
35
|
+
/** SDK language */
|
|
36
|
+
'telemetry.sdk.language': string;
|
|
37
|
+
/** Runtime name (nodejs, deno, bun, browser) */
|
|
38
|
+
'process.runtime.name'?: string;
|
|
39
|
+
/** Runtime version */
|
|
40
|
+
'process.runtime.version'?: string;
|
|
41
|
+
/** OS type (linux, darwin, windows) */
|
|
42
|
+
'os.type'?: string;
|
|
43
|
+
/** Service name */
|
|
44
|
+
'service.name'?: string;
|
|
45
|
+
/** Service version */
|
|
46
|
+
'service.version'?: string;
|
|
47
|
+
/** Deployment environment */
|
|
48
|
+
'deployment.environment'?: string;
|
|
19
49
|
}
|
|
20
50
|
type ProviderName = 'openai' | 'anthropic' | 'gemini' | 'bedrock' | 'openrouter' | 'agent' | 'unknown';
|
|
21
51
|
interface ObserveOptions {
|
|
@@ -231,4 +261,4 @@ declare function span(options: SpanOptions): void;
|
|
|
231
261
|
*/
|
|
232
262
|
declare function captureSpan(options: CaptureSpanOptions): void;
|
|
233
263
|
|
|
234
|
-
export { type CaptureSpanOptions, type LelemonConfig, type ObserveOptions, type ProviderName, type SpanOptions, type SpanType, type TraceContext, type TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace };
|
|
264
|
+
export { type CaptureSpanOptions, type LelemonConfig, type ObserveOptions, type ProviderName, type SDKTelemetry, type ServiceConfig, type SpanOptions, type SpanType, type TraceContext, type TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var U=Object.defineProperty;var F=(e,t,n)=>t in e?U(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var m=(e,t,n)=>F(e,typeof t!="symbol"?t+"":t,n);var E=false;function k(e){E=e;}function f(){return E?true:B("LELEMON_DEBUG")==="true"}var d="[Lelemon]";function c(e,t){f()&&y("debug",e,t);}function w(e,t){f()&&y("info",e,t);}function M(e,t){y("warn",e,t);}function $(e,t){console.error(`${d} Failed to capture trace: provider=${e} error=${t.message}`);}function q(e,t){f()&&console.log(`${d} Sending batch: count=${e} endpoint=${t}`);}function R(e,t){f()&&console.log(`${d} Batch sent successfully: count=${e} duration=${t}ms`);}function P(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${d} Batch send failed: count=${e} error=${n}`);}function D(e,t,n){f()&&console.log(`${d} Request: ${e} ${t} (${n} bytes)`);}function _(e,t){f()&&console.log(`${d} Response: status=${e} duration=${t}ms`);}function y(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${d} ${t}`,n):r(`${d} ${t}`);}function B(e){if(typeof process<"u"&&process.env)return process.env[e]}var G=10,V=1e3,H=1e4,h=class{constructor(t){m(this,"config");m(this,"queue",[]);m(this,"flushPromise",null);m(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??G,flushIntervalMs:t.flushIntervalMs??V,requestTimeoutMs:t.requestTimeoutMs??H};}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();q(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),R(t.length,Date.now()-n);}catch(r){P(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,i=r?JSON.stringify(r):void 0;D(t,s,i?.length??0);let u=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),g=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:a.signal});if(clearTimeout(u),_(o.status,Date.now()-g),!o.ok){let K=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${K}`)}let v=await o.text();return v?JSON.parse(v):{}}catch(o){throw clearTimeout(u),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var O={},p=null,L="https://www.lelemon.dev";function j(e={}){O=e,e.debug&&k(true),w("Initializing SDK",{endpoint:e.endpoint??L,debug:e.debug??false,disabled:e.disabled??false}),p=N(e),p.isEnabled()?w("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function Y(){return b().isEnabled()}function b(){return p||(p=N(O)),p}async function J(){p&&await p.flush();}function N(e){let t=e.apiKey??X("LELEMON_API_KEY");return !t&&!e.disabled&&M("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new h({apiKey:t??"",endpoint:e.endpoint??L,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function X(e){if(typeof process<"u"&&process.env)return process.env[e]}var Q={};function C(){return Q}function x(e){try{let t=b();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=C(),r=l(),s=e.metadata?._traceId,a=e.metadata?._parentSpanId,i={...n.metadata,...e.metadata};delete i._traceId,delete i._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:ee(e.input),output:I(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:s??r?.traceId,spanId:S(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(u);}catch(t){$("unknown",t instanceof Error?t:new Error(String(t)));}}var A=1e5,Z=["api_key","apikey","password","secret","token","authorization"];function ee(e){return I(e,0)}function I(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>A?e.slice(0,A)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>I(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))Z.some(a=>r.toLowerCase().includes(a))?n[r]="[REDACTED]":n[r]=I(s,t+1);return n}return String(e)}var z=new async_hooks.AsyncLocalStorage;function S(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function l(){return z.getStore()}function ne(e){let t=l();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function re(e){let t=l();t&&t.pendingToolCalls.delete(e);}async function oe(e,t){let n=typeof e=="string"?{name:e}:e,r=l(),s=r?.traceId??S(),a=S(),i={traceId:s,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 z.run(i,async()=>{let u,g;try{return u=await t(),u}catch(o){throw g=o instanceof Error?o:new Error(String(o)),o}finally{se(i,g?void 0:u,g);}})}function se(e,t,n){let r=b();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let s=C(),a=Date.now()-e.startTime,i=n?null:t,u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};c(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(u);}function ae(e){let t=l();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=ne(e.toolCallId);x({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&&re(e.toolCallId);}
|
|
3
|
-
exports.captureSpan=
|
|
2
|
+
var H=Object.defineProperty;var Y=(e,t,n)=>t in e?H(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var M=(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 J=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var b=(e,t,n)=>Y(e,typeof t!="symbol"?t+"":t,n);var L=J((De,te)=>{te.exports={name:"@lelemondev/sdk",version:"0.9.3",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var _=false;function q(e){_=e;}function g(){return _?true:X("LELEMON_DEBUG")==="true"}var d="[Lelemon]";function c(e,t){g()&&x("debug",e,t);}function w(e,t){g()&&x("info",e,t);}function $(e,t){x("warn",e,t);}function D(e,t){console.error(`${d} Failed to capture trace: provider=${e} error=${t.message}`);}function R(e,t){g()&&console.log(`${d} Sending batch: count=${e} endpoint=${t}`);}function j(e,t){g()&&console.log(`${d} Batch sent successfully: count=${e} duration=${t}ms`);}function K(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${d} Batch send failed: count=${e} error=${n}`);}function O(e,t,n){g()&&console.log(`${d} Request: ${e} ${t} (${n} bytes)`);}function P(e,t){g()&&console.log(`${d} Response: status=${e} duration=${t}ms`);}function x(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${d} ${t}`,n):r(`${d} ${t}`);}function X(e){if(typeof process<"u"&&process.env)return process.env[e]}var Q=10,Z=1e3,ee=1e4,T=class{constructor(t){b(this,"config");b(this,"queue",[]);b(this,"flushPromise",null);b(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??Q,flushIntervalMs:t.flushIntervalMs??Z,requestTimeoutMs:t.requestTimeoutMs??ee};}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();R(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),j(t.length,Date.now()-n);}catch(r){K(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;O(t,s,u?.length??0);let i=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),p=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(i),P(o.status,Date.now()-p),!o.ok){let W=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${W}`)}let C=await o.text();return C?JSON.parse(C):{}}catch(o){throw clearTimeout(i),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var ne="@lelemondev/sdk",re="nodejs";function oe(){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 se(){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 ie(){try{if(typeof M<"u")return L().version??"unknown"}catch{}return "unknown"}var h=null;function A(e){if(!h){let n=oe(),r=se();h={"telemetry.sdk.name":ne,"telemetry.sdk.version":ie(),"telemetry.sdk.language":re},n&&(h["process.runtime.name"]=n.name,h["process.runtime.version"]=n.version),r&&(h["os.type"]=r);}let t={...h};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var z={},l=null,I=null,U="https://www.lelemon.dev";function ue(e={}){z=e,e.debug&&q(true),I=A(e.service),w("Initializing SDK",{endpoint:e.endpoint??U,debug:e.debug??false,disabled:e.disabled??false,telemetry:I}),l=V(e),l.isEnabled()?w("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function F(){return I}function de(){return y().isEnabled()}function y(){return l||(l=V(z)),l}async function ce(){l&&await l.flush();}function V(e){let t=e.apiKey??pe("LELEMON_API_KEY");return !t&&!e.disabled&&$("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new T({apiKey:t??"",endpoint:e.endpoint??U,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var le={};function k(){return le}function E(e){try{let t=y();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=k(),r=m(),s=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=F(),i={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete i._traceId,delete i._parentSpanId;let p={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:be(e.input),output:v(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:s??r?.traceId,spanId:S(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(p);}catch(t){D("unknown",t instanceof Error?t:new Error(String(t)));}}var B=1e5,me=["api_key","apikey","password","secret","authorization"],fe=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],ge=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function he(e){let t=e.toLowerCase();return ge.includes(t)?false:!!(me.some(n=>t.includes(n))||fe.some(n=>t.includes(n)))}function be(e){return v(e,0)}function v(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>B?e.slice(0,B)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>v(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))he(r)?n[r]="[REDACTED]":n[r]=v(s,t+1);return n}return String(e)}var G=new async_hooks.AsyncLocalStorage;function S(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return G.getStore()}function Te(e){let t=m();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function ve(e){let t=m();t&&t.pendingToolCalls.delete(e);}async function Se(e,t){let n=typeof e=="string"?{name:e}:e,r=m(),s=r?.traceId??S(),a=S(),u={traceId:s,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 G.run(u,async()=>{let i,p;try{return i=await t(),i}catch(o){throw p=o instanceof Error?o:new Error(String(o)),o}finally{we(u,p?void 0:i,p);}})}function we(e,t,n){let r=y();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let s=k(),a=Date.now()-e.startTime,u=n?null:t,i={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:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};c(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(i);}function xe(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=Te(e.toolCallId);E({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&&ve(e.toolCallId);}
|
|
3
|
+
exports.captureSpan=E;exports.flush=ce;exports.getTraceContext=m;exports.init=ue;exports.isEnabled=de;exports.span=xe;exports.trace=Se;//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var K=Object.defineProperty;var U=(e,t,n)=>t in e?K(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var m=(e,t,n)=>U(e,typeof t!="symbol"?t+"":t,n);var v=false;function E(e){v=e;}function f(){return v?true:F("LELEMON_DEBUG")==="true"}var d="[Lelemon]";function c(e,t){f()&&w("debug",e,t);}function S(e,t){f()&&w("info",e,t);}function k(e,t){w("warn",e,t);}function M(e,t){console.error(`${d} Failed to capture trace: provider=${e} error=${t.message}`);}function $(e,t){f()&&console.log(`${d} Sending batch: count=${e} endpoint=${t}`);}function q(e,t){f()&&console.log(`${d} Batch sent successfully: count=${e} duration=${t}ms`);}function R(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${d} Batch send failed: count=${e} error=${n}`);}function P(e,t,n){f()&&console.log(`${d} Request: ${e} ${t} (${n} bytes)`);}function D(e,t){f()&&console.log(`${d} Response: status=${e} duration=${t}ms`);}function w(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${d} ${t}`,n):r(`${d} ${t}`);}function F(e){if(typeof process<"u"&&process.env)return process.env[e]}var B=10,G=1e3,V=1e4,b=class{constructor(t){m(this,"config");m(this,"queue",[]);m(this,"flushPromise",null);m(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??B,flushIntervalMs:t.flushIntervalMs??G,requestTimeoutMs:t.requestTimeoutMs??V};}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();$(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),q(t.length,Date.now()-n);}catch(r){R(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,i=r?JSON.stringify(r):void 0;P(t,s,i?.length??0);let u=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),g=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:a.signal});if(clearTimeout(u),D(o.status,Date.now()-g),!o.ok){let z=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${z}`)}let x=await o.text();return x?JSON.parse(x):{}}catch(o){throw clearTimeout(u),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var _={},p=null,O="https://www.lelemon.dev";function W(e={}){_=e,e.debug&&E(true),S("Initializing SDK",{endpoint:e.endpoint??O,debug:e.debug??false,disabled:e.disabled??false}),p=L(e),p.isEnabled()?S("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function j(){return T().isEnabled()}function T(){return p||(p=L(_)),p}async function Y(){p&&await p.flush();}function L(e){let t=e.apiKey??J("LELEMON_API_KEY");return !t&&!e.disabled&&k("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new b({apiKey:t??"",endpoint:e.endpoint??O,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function J(e){if(typeof process<"u"&&process.env)return process.env[e]}var X={};function y(){return X}function C(e){try{let t=T();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=y(),r=l(),s=e.metadata?._traceId,a=e.metadata?._parentSpanId,i={...n.metadata,...e.metadata};delete i._traceId,delete i._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:Z(e.input),output:h(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:s??r?.traceId,spanId:I(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(u);}catch(t){M("unknown",t instanceof Error?t:new Error(String(t)));}}var N=1e5,Q=["api_key","apikey","password","secret","token","authorization"];function Z(e){return h(e,0)}function h(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>N?e.slice(0,N)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>h(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))Q.some(a=>r.toLowerCase().includes(a))?n[r]="[REDACTED]":n[r]=h(s,t+1);return n}return String(e)}var A=new AsyncLocalStorage;function I(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function l(){return A.getStore()}function te(e){let t=l();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function ne(e){let t=l();t&&t.pendingToolCalls.delete(e);}async function re(e,t){let n=typeof e=="string"?{name:e}:e,r=l(),s=r?.traceId??I(),a=I(),i={traceId:s,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 A.run(i,async()=>{let u,g;try{return u=await t(),u}catch(o){throw g=o instanceof Error?o:new Error(String(o)),o}finally{oe(i,g?void 0:u,g);}})}function oe(e,t,n){let r=T();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let s=y(),a=Date.now()-e.startTime,i=n?null:t,u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};c(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(u);}function se(e){let t=l();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=te(e.toolCallId);C({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&&ne(e.toolCallId);}
|
|
3
|
-
export{
|
|
2
|
+
var W=Object.defineProperty;var H=(e,t,n)=>t in e?W(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var C=(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 Y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var h=(e,t,n)=>H(e,typeof t!="symbol"?t+"":t,n);var P=Y((_e,ee)=>{ee.exports={name:"@lelemondev/sdk",version:"0.9.3",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var M=false;function _(e){M=e;}function f(){return M?true:J("LELEMON_DEBUG")==="true"}var d="[Lelemon]";function c(e,t){f()&&w("debug",e,t);}function S(e,t){f()&&w("info",e,t);}function q(e,t){w("warn",e,t);}function $(e,t){console.error(`${d} Failed to capture trace: provider=${e} error=${t.message}`);}function D(e,t){f()&&console.log(`${d} Sending batch: count=${e} endpoint=${t}`);}function R(e,t){f()&&console.log(`${d} Batch sent successfully: count=${e} duration=${t}ms`);}function j(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${d} Batch send failed: count=${e} error=${n}`);}function K(e,t,n){f()&&console.log(`${d} Request: ${e} ${t} (${n} bytes)`);}function O(e,t){f()&&console.log(`${d} Response: status=${e} duration=${t}ms`);}function w(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${d} ${t}`,n):r(`${d} ${t}`);}function J(e){if(typeof process<"u"&&process.env)return process.env[e]}var X=10,Q=1e3,Z=1e4,y=class{constructor(t){h(this,"config");h(this,"queue",[]);h(this,"flushPromise",null);h(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??X,flushIntervalMs:t.flushIntervalMs??Q,requestTimeoutMs:t.requestTimeoutMs??Z};}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();D(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),R(t.length,Date.now()-n);}catch(r){j(t.length,r);}}async request(t,n,r){let s=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;K(t,s,u?.length??0);let i=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),p=Date.now();try{let o=await fetch(s,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(i),O(o.status,Date.now()-p),!o.ok){let G=await o.text().catch(()=>"Unknown error");throw new Error(`HTTP ${o.status}: ${G}`)}let E=await o.text();return E?JSON.parse(E):{}}catch(o){throw clearTimeout(i),o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):o}}};var te="@lelemondev/sdk",ne="nodejs";function re(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function oe(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function se(){try{if(typeof C<"u")return P().version??"unknown"}catch{}return "unknown"}var g=null;function N(e){if(!g){let n=re(),r=oe();g={"telemetry.sdk.name":te,"telemetry.sdk.version":se(),"telemetry.sdk.language":ne},n&&(g["process.runtime.name"]=n.name,g["process.runtime.version"]=n.version),r&&(g["os.type"]=r);}let t={...g};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var A={},l=null,x=null,z="https://www.lelemon.dev";function ae(e={}){A=e,e.debug&&_(true),x=N(e.service),S("Initializing SDK",{endpoint:e.endpoint??z,debug:e.debug??false,disabled:e.disabled??false,telemetry:x}),l=F(e),l.isEnabled()?S("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function U(){return x}function ue(){return b().isEnabled()}function b(){return l||(l=F(A)),l}async function de(){l&&await l.flush();}function F(e){let t=e.apiKey??ce("LELEMON_API_KEY");return !t&&!e.disabled&&q("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new y({apiKey:t??"",endpoint:e.endpoint??z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var pe={};function I(){return pe}function k(e){try{let t=b();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=I(),r=m(),s=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=U(),i={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete i._traceId,delete i._parentSpanId;let p={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:he(e.input),output:T(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:s??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(p);}catch(t){$("unknown",t instanceof Error?t:new Error(String(t)));}}var V=1e5,le=["api_key","apikey","password","secret","authorization"],me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],fe=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function ge(e){let t=e.toLowerCase();return fe.includes(t)?false:!!(le.some(n=>t.includes(n))||me.some(n=>t.includes(n)))}function he(e){return T(e,0)}function T(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>V?e.slice(0,V)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>T(n,t+1));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))ge(r)?n[r]="[REDACTED]":n[r]=T(s,t+1);return n}return String(e)}var B=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return B.getStore()}function ye(e){let t=m();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function Te(e){let t=m();t&&t.pendingToolCalls.delete(e);}async function ve(e,t){let n=typeof e=="string"?{name:e}:e,r=m(),s=r?.traceId??v(),a=v(),u={traceId:s,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 B.run(u,async()=>{let i,p;try{return i=await t(),i}catch(o){throw p=o instanceof Error?o:new Error(String(o)),o}finally{Se(u,p?void 0:i,p);}})}function Se(e,t,n){let r=b();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let s=I(),a=Date.now()-e.startTime,u=n?null:t,i={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:s.sessionId,userId:s.userId,metadata:{...s.metadata,...e.metadata},tags:e.tags??s.tags};c(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(i);}function we(e){let t=m();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=ye(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&&Te(e.toolCallId);}
|
|
3
|
+
export{k as captureSpan,de as flush,m as getTraceContext,ae as init,ue as isEnabled,we as span,ve as trace};//# sourceMappingURL=index.mjs.map
|
|
4
4
|
//# sourceMappingURL=index.mjs.map
|
package/dist/integrations.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use strict';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var
|
|
2
|
+
var m=Object.defineProperty;var i=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:true});};var l={};i(l,{createWrapper:()=>f,withObserve:()=>a});async function n(){}function a(t,e){return async(r,x)=>{try{return await t(r,x)}finally{e?.after?e.after(()=>n()):e?.waitUntil?e.waitUntil(n()):await n();}}}function f(t){return function(e,r){return a(e,{...t,...r})}}var u={};i(u,{withObserve:()=>c});function c(t){return async(e,r)=>{try{return await t(e,r)}finally{await n();}}}var p={};i(p,{createMiddleware:()=>b});function b(){return (t,e,r)=>{e.on("finish",()=>{n().catch(()=>{});}),r();}}var d={};i(d,{createMiddleware:()=>w});function w(){return async(t,e)=>{await e(),t.executionCtx?.waitUntil?t.executionCtx.waitUntil(n()):n().catch(()=>{});}}exports.express=p;exports.hono=d;exports.lambda=u;exports.next=l;//# sourceMappingURL=integrations.js.map
|
|
3
3
|
//# sourceMappingURL=integrations.js.map
|
package/dist/integrations.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var x=Object.defineProperty;var o=(t,e)=>{for(var r in e)x(t,r,{get:e[r],enumerable:true});};var a={};o(a,{createWrapper:()=>
|
|
2
|
+
var x=Object.defineProperty;var o=(t,e)=>{for(var r in e)x(t,r,{get:e[r],enumerable:true});};var a={};o(a,{createWrapper:()=>m,withObserve:()=>s});async function n(){}function s(t,e){return async(r,d)=>{try{return await t(r,d)}finally{e?.after?e.after(()=>n()):e?.waitUntil?e.waitUntil(n()):await n();}}}function m(t){return function(e,r){return s(e,{...t,...r})}}var l={};o(l,{withObserve:()=>f});function f(t){return async(e,r)=>{try{return await t(e,r)}finally{await n();}}}var u={};o(u,{createMiddleware:()=>c});function c(){return (t,e,r)=>{e.on("finish",()=>{n().catch(()=>{});}),r();}}var p={};o(p,{createMiddleware:()=>b});function b(){return async(t,e)=>{await e(),t.executionCtx?.waitUntil?t.executionCtx.waitUntil(n()):n().catch(()=>{});}}export{u as express,p as hono,l as lambda,a as next};//# sourceMappingURL=integrations.mjs.map
|
|
3
3
|
//# sourceMappingURL=integrations.mjs.map
|
package/dist/lambda.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
async function n(){}function
|
|
2
|
+
async function n(){}function a(t){return async(i,r)=>{try{return await t(i,r)}finally{await n();}}}export{a as withObserve};//# sourceMappingURL=lambda.mjs.map
|
|
3
3
|
//# sourceMappingURL=lambda.mjs.map
|
package/dist/next.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use strict';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
async function t(){}function
|
|
2
|
+
async function t(){}function s(n,e){return async(r,o)=>{try{return await n(r,o)}finally{e?.after?e.after(()=>t()):e?.waitUntil?e.waitUntil(t()):await t();}}}function p(n){return function(e,r){return s(e,{...n,...r})}}exports.createWrapper=p;exports.withObserve=s;//# sourceMappingURL=next.js.map
|
|
3
3
|
//# sourceMappingURL=next.js.map
|
package/dist/next.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
async function t(){}function
|
|
2
|
+
async function t(){}function l(n,e){return async(r,o)=>{try{return await n(r,o)}finally{e?.after?e.after(()=>t()):e?.waitUntil?e.waitUntil(t()):await t();}}}function u(n){return function(e,r){return l(e,{...n,...r})}}export{u as createWrapper,l as withObserve};//# sourceMappingURL=next.mjs.map
|
|
3
3
|
//# sourceMappingURL=next.mjs.map
|
package/dist/openai.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var ae=Object.defineProperty;var ue=(e,n,t)=>n in e?ae(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var I=(e,n,t)=>ue(e,typeof n!="symbol"?n+"":n,t);var z=false;function F(e){z=e;}function w(){return z?true:ce("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function p(e,n){w()&&_("debug",e,n);}function O(e,n){w()&&_("info",e,n);}function E(e,n){_("warn",e,n);}function P(e,n,t,r){w()&&console.log(`${f} Captured trace: provider=${e} model=${n} duration=${t}ms status=${r}`);}function R(e,n){console.error(`${f} Failed to capture trace: provider=${e} error=${n.message}`);}function K(e){w()&&console.log(`${f} Wrapped client: provider=${e}`);}function j(e,n){w()&&console.log(`${f} Sending batch: count=${e} endpoint=${n}`);}function U(e,n){w()&&console.log(`${f} Batch sent successfully: count=${e} duration=${n}ms`);}function G(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${f} Batch send failed: count=${e} error=${t}`);}function B(e,n,t){w()&&console.log(`${f} Request: ${e} ${n} (${t} bytes)`);}function H(e,n){w()&&console.log(`${f} Response: status=${e} duration=${n}ms`);}function _(e,n,t){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?r(`${f} ${n}`,t):r(`${f} ${n}`);}function ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var pe=10,le=1e3,de=1e4,M=class{constructor(n){I(this,"config");I(this,"queue",[]);I(this,"flushPromise",null);I(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??pe,flushIntervalMs:n.flushIntervalMs??le,requestTimeoutMs:n.requestTimeoutMs??de};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(n){if(n.length===0)return;let t=Date.now();j(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),U(n.length,Date.now()-t);}catch(r){G(n.length,r);}}async request(n,t,r){let o=`${this.config.endpoint}${t}`,s=new AbortController,i=r?JSON.stringify(r):void 0;B(n,o,i?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let a=await fetch(o,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(u),H(a.status,Date.now()-c),!a.ok){let x=await a.text().catch(()=>"Unknown error");throw new Error(`HTTP ${a.status}: ${x}`)}let l=await a.text();return l?JSON.parse(l):{}}catch(a){throw clearTimeout(u),a instanceof Error&&a.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):a}}};var $={},h=null,V="https://www.lelemon.dev";function me(e={}){$=e,e.debug&&F(true),O("Initializing SDK",{endpoint:e.endpoint??V,debug:e.debug??false,disabled:e.disabled??false}),h=Y(e),h.isEnabled()?O("SDK initialized - tracing enabled"):p("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function W(){return $}function ge(){return b().isEnabled()}function b(){return h||(h=Y($)),h}async function we(){h&&await h.flush();}function Y(e){let n=e.apiKey??he("LELEMON_API_KEY");return !n&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new M({apiKey:n??"",endpoint:e.endpoint??V,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function he(e){if(typeof process<"u"&&process.env)return process.env[e]}var X={};function Q(e){X=e,p("Global context updated",e);}function v(){return X}function y(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping trace capture");return}let t=v(),r=m(),o=k(),s={provider:e.provider,model:e.model,input:q(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return P(e.provider,e.model,e.durationMs,e.status),n.enqueue(s),o}catch(n){R(e.provider,n instanceof Error?n:new Error(String(n)));return}}function C(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping error capture");return}let t=v(),r=m(),o={provider:e.provider,model:e.model,input:q(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:k(),parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags};P(e.provider,e.model,e.durationMs,"error"),p("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(o);}catch(n){R(e.provider,n instanceof Error?n:new Error(String(n)));}}function D(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping span capture");return}let t=v(),r=m(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i={...t.metadata,...e.metadata};delete i._traceId,delete i._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:q(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:o??r?.traceId,spanId:k(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:t.tags};p(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(u);}catch(n){R("unknown",n instanceof Error?n:new Error(String(n)));}}var J=1e5,be=["api_key","apikey","password","secret","token","authorization"];function q(e){return S(e,0)}function S(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>J?e.slice(0,J)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>S(t,n+1));if(typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))be.some(s=>r.toLowerCase().includes(s))?t[r]="[REDACTED]":t[r]=S(o,n+1);return t}return String(e)}var Z=new async_hooks.AsyncLocalStorage;function k(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return Z.getStore()}function N(e,n){let t=m();if(t)for(let r of e)t.pendingToolCalls.set(r,n),p(`Registered tool call ${r} \u2192 LLM span ${n}`);}function Ce(e){let n=m();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function Te(e){let n=m();n&&n.pendingToolCalls.delete(e);}async function ke(e,n){let t=typeof e=="string"?{name:e}:e,r=m(),o=r?.traceId??k(),s=k(),i={traceId:o,rootSpanId:s,currentSpanId:s,parentSpanId:r?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return Z.run(i,async()=>{let u,c;try{return u=await n(),u}catch(a){throw c=a instanceof Error?a:new Error(String(a)),a}finally{Ie(i,c?void 0:u,c);}})}function Ie(e,n,t){let r=b();if(!r.isEnabled()){p("Transport disabled, skipping root span");return}let o=v(),s=Date.now()-e.startTime,i=t?null:n,u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};p(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),r.enqueue(u);}function Se(e){let n=m();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=Ce(e.toolCallId);D({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:n.traceId,_parentSpanId:t}}),e.toolCallId&&Te(e.toolCallId);}var d="openai";function ee(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function ne(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&te(i))return ve(i,o,r);let u=Date.now()-r,c=i,a=y({provider:d,model:o.model||c.model||"unknown",input:o.messages,rawResponse:i,durationMs:u,status:"success",streaming:!1});if(a){let l=ie(c);l.length>0&&N(l,a);}return i}catch(i){let u=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.messages,error:i instanceof Error?i:new Error(String(i)),durationMs:u,streaming:s}),i}}}function te(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*ve(e,n,t){let r={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,s,i=false,u=new Map;try{for await(let c of e){let a=c,l=a?.choices?.[0]?.delta?.content;l&&(i||(i=!0,s=Date.now()-t),r.choices[0].message.content+=l);let x=a?.choices?.[0]?.delta?.tool_calls;if(x)for(let g of x){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let A=u.get(g.index);g.id&&(A.id=g.id),g.function?.name&&(A.function.name=g.function.name),g.function?.arguments&&(A.function.arguments+=g.function.arguments);}let L=a?.choices?.[0]?.finish_reason;L&&(r.choices[0].finish_reason=L),a?.usage&&(r.usage=a.usage),yield c;}}catch(c){throw o=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(r.choices[0].message.tool_calls=Array.from(u.entries()).sort((a,l)=>a[0]-l[0]).map(([,a])=>a)),o)C({provider:d,model:n.model||"unknown",input:n.messages,error:o,durationMs:c,streaming:true});else {let a=y({provider:d,model:n.model||"unknown",input:n.messages,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(a){let l=ie(r);l.length>0&&N(l,a);}}}}function re(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&te(i))return xe(i,o,r);let u=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},rawResponse:i,durationMs:u,status:"success",streaming:!1}),i}catch(i){let u=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},error:i instanceof Error?i:new Error(String(i)),durationMs:u,streaming:s}),i}}}async function*xe(e,n,t){let r=[],o=null,s=null;try{for await(let i of e){r.push(i);let u=i;u.type==="response.done"&&u.response&&(o=u.response),yield i;}}catch(i){throw s=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;s?C({provider:d,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:i,streaming:true}):y({provider:d,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:o||{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function oe(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:o.prompt,rawResponse:s,durationMs:i,status:"success",streaming:!1}),s}catch(s){let i=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function se(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:o.input,rawResponse:s,durationMs:i,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let i=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.input,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function ie(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let r of t)r.id&&n.push(r.id);return n}function ln(e,n){return n&&Q(n),W().disabled?(p("Tracing disabled, returning unwrapped client"),e):ee(e)?(K("openai"),Re(e)):(E("Client is not an OpenAI client. Use @lelemondev/sdk/openai only with OpenAI SDK."),e)}function Re(e){let n=e;return new Proxy(n,{get(t,r,o){let s=Reflect.get(t,r,o);return r==="chat"&&s&&typeof s=="object"?Me(s):r==="responses"&&s&&typeof s=="object"?Oe(s):r==="completions"&&s&&typeof s=="object"?Pe(s):r==="embeddings"&&s&&typeof s=="object"?_e(s):s}})}function Me(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="completions"&&o&&typeof o=="object"?Ae(o):o}})}function Ae(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?ne(o.bind(n)):o}})}function Oe(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?re(o.bind(n)):o}})}function Pe(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?oe(o.bind(n)):o}})}function _e(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?se(o.bind(n)):o}})}
|
|
3
|
-
exports.captureSpan=
|
|
2
|
+
var fe=Object.defineProperty;var ge=(e,n,t)=>n in e?fe(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var z=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var we=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var I=(e,n,t)=>ge(e,typeof n!="symbol"?n+"":n,t);var X=we((sn,Te)=>{Te.exports={name:"@lelemondev/sdk",version:"0.9.3",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function V(e){U=e;}function w(){return U?true:he("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function d(e,n){w()&&q("debug",e,n);}function D(e,n){w()&&q("info",e,n);}function R(e,n){q("warn",e,n);}function P(e,n,t,r){w()&&console.log(`${m} Captured trace: provider=${e} model=${n} duration=${t}ms status=${r}`);}function _(e,n){console.error(`${m} Failed to capture trace: provider=${e} error=${n.message}`);}function B(e){w()&&console.log(`${m} Wrapped client: provider=${e}`);}function G(e,n){w()&&console.log(`${m} Sending batch: count=${e} endpoint=${n}`);}function H(e,n){w()&&console.log(`${m} Batch sent successfully: count=${e} duration=${n}ms`);}function W(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${m} Batch send failed: count=${e} error=${t}`);}function Y(e,n,t){w()&&console.log(`${m} Request: ${e} ${n} (${t} bytes)`);}function J(e,n){w()&&console.log(`${m} Response: status=${e} duration=${n}ms`);}function q(e,n,t){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?r(`${m} ${n}`,t):r(`${m} ${n}`);}function he(e){if(typeof process<"u"&&process.env)return process.env[e]}var ye=10,be=1e3,ke=1e4,A=class{constructor(n){I(this,"config");I(this,"queue",[]);I(this,"flushPromise",null);I(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??ye,flushIntervalMs:n.flushIntervalMs??be,requestTimeoutMs:n.requestTimeoutMs??ke};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(n){if(n.length===0)return;let t=Date.now();G(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),H(n.length,Date.now()-t);}catch(r){W(n.length,r);}}async request(n,t,r){let o=`${this.config.endpoint}${t}`,s=new AbortController,i=r?JSON.stringify(r):void 0;Y(n,o,i?.length??0);let a=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let u=await fetch(o,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(a),J(u.status,Date.now()-c),!u.ok){let E=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${E}`)}let l=await u.text();return l?JSON.parse(l):{}}catch(u){throw clearTimeout(a),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var ve="@lelemondev/sdk",Ce="nodejs";function Ie(){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 xe(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Se(){try{if(typeof z<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function Z(e){if(!v){let t=Ie(),r=xe();v={"telemetry.sdk.name":ve,"telemetry.sdk.version":Se(),"telemetry.sdk.language":Ce},t&&(v["process.runtime.name"]=t.name,v["process.runtime.version"]=t.version),r&&(v["os.type"]=r);}let n={...v};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var j={},y=null,$=null,ee="https://www.lelemon.dev";function Re(e={}){j=e,e.debug&&V(true),$=Z(e.service),D("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:$}),y=te(e),y.isEnabled()?D("SDK initialized - tracing enabled"):d("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ne(){return j}function M(){return $}function _e(){return b().isEnabled()}function b(){return y||(y=te(j)),y}async function Ae(){y&&await y.flush();}function te(e){let n=e.apiKey??Me("LELEMON_API_KEY");return !n&&!e.disabled&&R("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new A({apiKey:n??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Me(e){if(typeof process<"u"&&process.env)return process.env[e]}var oe={};function se(e){oe=e,d("Global context updated",e);}function S(){return oe}function k(e){try{let n=b();if(!n.isEnabled()){d("Transport disabled, skipping trace capture");return}let t=S(),r=f(),o=C(),s=M(),i={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?x(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return P(e.provider,e.model,e.durationMs,e.status),n.enqueue(i),o}catch(n){_(e.provider,n instanceof Error?n:new Error(String(n)));return}}function T(e){try{let n=b();if(!n.isEnabled()){d("Transport disabled, skipping error capture");return}let t=S(),r=f(),o=M(),s={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:C(),parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:t.tags};P(e.provider,e.model,e.durationMs,"error"),d("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){_(e.provider,n instanceof Error?n:new Error(String(n)));}}function N(e){try{let n=b();if(!n.isEnabled()){d("Transport disabled, skipping span capture");return}let t=S(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=M(),a={...t.metadata,...e.metadata,...i?{_telemetry:i}:{}};delete a._traceId,delete a._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:x(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:o??r?.traceId,spanId:C(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:a,tags:t.tags};d(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){_("unknown",n instanceof Error?n:new Error(String(n)));}}var re=1e5,Oe=["api_key","apikey","password","secret","authorization"],De=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Pe=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function qe(e){let n=e.toLowerCase();return Pe.includes(n)?false:!!(Oe.some(t=>n.includes(t))||De.some(t=>n.includes(t)))}function K(e){return x(e,0)}function x(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")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(t=>x(t,n+1));if(typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))qe(r)?t[r]="[REDACTED]":t[r]=x(o,n+1);return t}return String(e)}var ie=new async_hooks.AsyncLocalStorage;function C(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return ie.getStore()}function L(e,n){let t=f();if(t)for(let r of e)t.pendingToolCalls.set(r,n),d(`Registered tool call ${r} \u2192 LLM span ${n}`);}function je(e){let n=f();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function Ne(e){let n=f();n&&n.pendingToolCalls.delete(e);}async function Ke(e,n){let t=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??C(),s=C(),i={traceId:o,rootSpanId:s,currentSpanId:s,parentSpanId:r?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return ie.run(i,async()=>{let a,c;try{return a=await n(),a}catch(u){throw c=u instanceof Error?u:new Error(String(u)),u}finally{Le(i,c?void 0:a,c);}})}function Le(e,n,t){let r=b();if(!r.isEnabled()){d("Transport disabled, skipping root span");return}let o=S(),s=Date.now()-e.startTime,i=t?null:n,a={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};d(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),r.enqueue(a);}function Fe(e){let n=f();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=je(e.toolCallId);N({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:n.traceId,_parentSpanId:t}}),e.toolCallId&&Ne(e.toolCallId);}var p="openai";function ae(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function ue(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ce(i))return ze(i,o,r);let a=Date.now()-r,c=i,u=k({provider:p,model:o.model||c.model||"unknown",input:o.messages,rawResponse:i,durationMs:a,status:"success",streaming:!1});if(u){let l=me(c);l.length>0&&L(l,u);}return i}catch(i){let a=Date.now()-r;throw T({provider:p,model:o.model||"unknown",input:o.messages,error:i instanceof Error?i:new Error(String(i)),durationMs:a,streaming:s}),i}}}function ce(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*ze(e,n,t){let r={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,s,i=false,a=new Map;try{for await(let c of e){let u=c,l=u?.choices?.[0]?.delta?.content;l&&(i||(i=!0,s=Date.now()-t),r.choices[0].message.content+=l);let E=u?.choices?.[0]?.delta?.tool_calls;if(E)for(let g of E){a.has(g.index)||a.set(g.index,{id:"",function:{name:"",arguments:""}});let O=a.get(g.index);g.id&&(O.id=g.id),g.function?.name&&(O.function.name=g.function.name),g.function?.arguments&&(O.function.arguments+=g.function.arguments);}let F=u?.choices?.[0]?.finish_reason;F&&(r.choices[0].finish_reason=F),u?.usage&&(r.usage=u.usage),yield c;}}catch(c){throw o=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(a.size>0&&(r.choices[0].message.tool_calls=Array.from(a.entries()).sort((u,l)=>u[0]-l[0]).map(([,u])=>u)),o)T({provider:p,model:n.model||"unknown",input:n.messages,error:o,durationMs:c,streaming:true});else {let u=k({provider:p,model:n.model||"unknown",input:n.messages,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(u){let l=me(r);l.length>0&&L(l,u);}}}}function de(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ce(i))return Ue(i,o,r);let a=Date.now()-r;return k({provider:p,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},rawResponse:i,durationMs:a,status:"success",streaming:!1}),i}catch(i){let a=Date.now()-r;throw T({provider:p,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},error:i instanceof Error?i:new Error(String(i)),durationMs:a,streaming:s}),i}}}async function*Ue(e,n,t){let r=[],o=null,s=null;try{for await(let i of e){r.push(i);let a=i;a.type==="response.done"&&a.response&&(o=a.response),yield i;}}catch(i){throw s=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;s?T({provider:p,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:i,streaming:true}):k({provider:p,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:o||{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function le(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return k({provider:p,model:o.model||"unknown",input:o.prompt,rawResponse:s,durationMs:i,status:"success",streaming:!1}),s}catch(s){let i=Date.now()-r;throw T({provider:p,model:o.model||"unknown",input:o.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function pe(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return k({provider:p,model:o.model||"unknown",input:o.input,rawResponse:s,durationMs:i,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let i=Date.now()-r;throw T({provider:p,model:o.model||"unknown",input:o.input,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function me(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let r of t)r.id&&n.push(r.id);return n}function Dn(e,n){return n&&se(n),ne().disabled?(d("Tracing disabled, returning unwrapped client"),e):ae(e)?(B("openai"),Be(e)):(R("Client is not an OpenAI client. Use @lelemondev/sdk/openai only with OpenAI SDK."),e)}function Be(e){let n=e;return new Proxy(n,{get(t,r,o){let s=Reflect.get(t,r,o);return r==="chat"&&s&&typeof s=="object"?Ge(s):r==="responses"&&s&&typeof s=="object"?We(s):r==="completions"&&s&&typeof s=="object"?Ye(s):r==="embeddings"&&s&&typeof s=="object"?Je(s):s}})}function Ge(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="completions"&&o&&typeof o=="object"?He(o):o}})}function He(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?ue(o.bind(n)):o}})}function We(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?de(o.bind(n)):o}})}function Ye(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?le(o.bind(n)):o}})}function Je(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?pe(o.bind(n)):o}})}
|
|
3
|
+
exports.captureSpan=N;exports.flush=Ae;exports.getTraceContext=f;exports.init=Re;exports.isEnabled=_e;exports.observe=Dn;exports.span=Fe;exports.trace=Ke;//# sourceMappingURL=openai.js.map
|
|
4
4
|
//# sourceMappingURL=openai.js.map
|
package/dist/openai.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var ie=Object.defineProperty;var ae=(e,n,t)=>n in e?ie(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var k=(e,n,t)=>ae(e,typeof n!="symbol"?n+"":n,t);var L=false;function z(e){L=e;}function w(){return L?true:ue("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function p(e,n){w()&&P("debug",e,n);}function A(e,n){w()&&P("info",e,n);}function x(e,n){P("warn",e,n);}function O(e,n,t,r){w()&&console.log(`${f} Captured trace: provider=${e} model=${n} duration=${t}ms status=${r}`);}function E(e,n){console.error(`${f} Failed to capture trace: provider=${e} error=${n.message}`);}function F(e){w()&&console.log(`${f} Wrapped client: provider=${e}`);}function K(e,n){w()&&console.log(`${f} Sending batch: count=${e} endpoint=${n}`);}function j(e,n){w()&&console.log(`${f} Batch sent successfully: count=${e} duration=${n}ms`);}function U(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${f} Batch send failed: count=${e} error=${t}`);}function G(e,n,t){w()&&console.log(`${f} Request: ${e} ${n} (${t} bytes)`);}function B(e,n){w()&&console.log(`${f} Response: status=${e} duration=${n}ms`);}function P(e,n,t){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?r(`${f} ${n}`,t):r(`${f} ${n}`);}function ue(e){if(typeof process<"u"&&process.env)return process.env[e]}var ce=10,pe=1e3,le=1e4,R=class{constructor(n){k(this,"config");k(this,"queue",[]);k(this,"flushPromise",null);k(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??ce,flushIntervalMs:n.flushIntervalMs??pe,requestTimeoutMs:n.requestTimeoutMs??le};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(n){if(n.length===0)return;let t=Date.now();K(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),j(n.length,Date.now()-t);}catch(r){U(n.length,r);}}async request(n,t,r){let o=`${this.config.endpoint}${t}`,s=new AbortController,i=r?JSON.stringify(r):void 0;G(n,o,i?.length??0);let u=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let a=await fetch(o,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(u),B(a.status,Date.now()-c),!a.ok){let v=await a.text().catch(()=>"Unknown error");throw new Error(`HTTP ${a.status}: ${v}`)}let l=await a.text();return l?JSON.parse(l):{}}catch(a){throw clearTimeout(u),a instanceof Error&&a.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):a}}};var _={},h=null,H="https://www.lelemon.dev";function fe(e={}){_=e,e.debug&&z(true),A("Initializing SDK",{endpoint:e.endpoint??H,debug:e.debug??false,disabled:e.disabled??false}),h=W(e),h.isEnabled()?A("SDK initialized - tracing enabled"):p("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function V(){return _}function me(){return b().isEnabled()}function b(){return h||(h=W(_)),h}async function ge(){h&&await h.flush();}function W(e){let n=e.apiKey??we("LELEMON_API_KEY");return !n&&!e.disabled&&x("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new R({apiKey:n??"",endpoint:e.endpoint??H,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function we(e){if(typeof process<"u"&&process.env)return process.env[e]}var J={};function X(e){J=e,p("Global context updated",e);}function S(){return J}function y(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping trace capture");return}let t=S(),r=m(),o=T(),s={provider:e.provider,model:e.model,input:D(e.input),rawResponse:e.rawResponse?I(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return O(e.provider,e.model,e.durationMs,e.status),n.enqueue(s),o}catch(n){E(e.provider,n instanceof Error?n:new Error(String(n)));return}}function C(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping error capture");return}let t=S(),r=m(),o={provider:e.provider,model:e.model,input:D(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:T(),parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags};O(e.provider,e.model,e.durationMs,"error"),p("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(o);}catch(n){E(e.provider,n instanceof Error?n:new Error(String(n)));}}function $(e){try{let n=b();if(!n.isEnabled()){p("Transport disabled, skipping span capture");return}let t=S(),r=m(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i={...t.metadata,...e.metadata};delete i._traceId,delete i._parentSpanId;let u={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:D(e.input),output:I(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:o??r?.traceId,spanId:T(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:i,tags:t.tags};p(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(u);}catch(n){E("unknown",n instanceof Error?n:new Error(String(n)));}}var Y=1e5,he=["api_key","apikey","password","secret","token","authorization"];function D(e){return I(e,0)}function I(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")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(t=>I(t,n+1));if(typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))he.some(s=>r.toLowerCase().includes(s))?t[r]="[REDACTED]":t[r]=I(o,n+1);return t}return String(e)}var Q=new AsyncLocalStorage;function T(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function m(){return Q.getStore()}function q(e,n){let t=m();if(t)for(let r of e)t.pendingToolCalls.set(r,n),p(`Registered tool call ${r} \u2192 LLM span ${n}`);}function ye(e){let n=m();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function Ce(e){let n=m();n&&n.pendingToolCalls.delete(e);}async function Te(e,n){let t=typeof e=="string"?{name:e}:e,r=m(),o=r?.traceId??T(),s=T(),i={traceId:o,rootSpanId:s,currentSpanId:s,parentSpanId:r?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return Q.run(i,async()=>{let u,c;try{return u=await n(),u}catch(a){throw c=a instanceof Error?a:new Error(String(a)),a}finally{ke(i,c?void 0:u,c);}})}function ke(e,n,t){let r=b();if(!r.isEnabled()){p("Transport disabled, skipping root span");return}let o=S(),s=Date.now()-e.startTime,i=t?null:n,u={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};p(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),r.enqueue(u);}function Ie(e){let n=m();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=ye(e.toolCallId);$({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:n.traceId,_parentSpanId:t}}),e.toolCallId&&Ce(e.toolCallId);}var d="openai";function Z(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function ee(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ne(i))return Se(i,o,r);let u=Date.now()-r,c=i,a=y({provider:d,model:o.model||c.model||"unknown",input:o.messages,rawResponse:i,durationMs:u,status:"success",streaming:!1});if(a){let l=se(c);l.length>0&&q(l,a);}return i}catch(i){let u=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.messages,error:i instanceof Error?i:new Error(String(i)),durationMs:u,streaming:s}),i}}}function ne(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Se(e,n,t){let r={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,s,i=false,u=new Map;try{for await(let c of e){let a=c,l=a?.choices?.[0]?.delta?.content;l&&(i||(i=!0,s=Date.now()-t),r.choices[0].message.content+=l);let v=a?.choices?.[0]?.delta?.tool_calls;if(v)for(let g of v){u.has(g.index)||u.set(g.index,{id:"",function:{name:"",arguments:""}});let M=u.get(g.index);g.id&&(M.id=g.id),g.function?.name&&(M.function.name=g.function.name),g.function?.arguments&&(M.function.arguments+=g.function.arguments);}let N=a?.choices?.[0]?.finish_reason;N&&(r.choices[0].finish_reason=N),a?.usage&&(r.usage=a.usage),yield c;}}catch(c){throw o=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(u.size>0&&(r.choices[0].message.tool_calls=Array.from(u.entries()).sort((a,l)=>a[0]-l[0]).map(([,a])=>a)),o)C({provider:d,model:n.model||"unknown",input:n.messages,error:o,durationMs:c,streaming:true});else {let a=y({provider:d,model:n.model||"unknown",input:n.messages,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(a){let l=se(r);l.length>0&&q(l,a);}}}}function te(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ne(i))return ve(i,o,r);let u=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},rawResponse:i,durationMs:u,status:"success",streaming:!1}),i}catch(i){let u=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},error:i instanceof Error?i:new Error(String(i)),durationMs:u,streaming:s}),i}}}async function*ve(e,n,t){let r=[],o=null,s=null;try{for await(let i of e){r.push(i);let u=i;u.type==="response.done"&&u.response&&(o=u.response),yield i;}}catch(i){throw s=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;s?C({provider:d,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:i,streaming:true}):y({provider:d,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:o||{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function re(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:o.prompt,rawResponse:s,durationMs:i,status:"success",streaming:!1}),s}catch(s){let i=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function oe(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return y({provider:d,model:o.model||"unknown",input:o.input,rawResponse:s,durationMs:i,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let i=Date.now()-r;throw C({provider:d,model:o.model||"unknown",input:o.input,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function se(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let r of t)r.id&&n.push(r.id);return n}function rn(e,n){return n&&X(n),V().disabled?(p("Tracing disabled, returning unwrapped client"),e):Z(e)?(F("openai"),Ee(e)):(x("Client is not an OpenAI client. Use @lelemondev/sdk/openai only with OpenAI SDK."),e)}function Ee(e){let n=e;return new Proxy(n,{get(t,r,o){let s=Reflect.get(t,r,o);return r==="chat"&&s&&typeof s=="object"?Re(s):r==="responses"&&s&&typeof s=="object"?Ae(s):r==="completions"&&s&&typeof s=="object"?Oe(s):r==="embeddings"&&s&&typeof s=="object"?Pe(s):s}})}function Re(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="completions"&&o&&typeof o=="object"?Me(o):o}})}function Me(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?ee(o.bind(n)):o}})}function Ae(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?te(o.bind(n)):o}})}function Oe(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?re(o.bind(n)):o}})}function Pe(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?oe(o.bind(n)):o}})}
|
|
3
|
-
export{
|
|
2
|
+
var me=Object.defineProperty;var fe=(e,n,t)=>n in e?me(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ge=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var C=(e,n,t)=>fe(e,typeof n!="symbol"?n+"":n,t);var J=ge((tn,ke)=>{ke.exports={name:"@lelemondev/sdk",version:"0.9.3",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var z=false;function U(e){z=e;}function w(){return z?true:we("LELEMON_DEBUG")==="true"}var m="[Lelemon]";function d(e,n){w()&&P("debug",e,n);}function O(e,n){w()&&P("info",e,n);}function E(e,n){P("warn",e,n);}function D(e,n,t,r){w()&&console.log(`${m} Captured trace: provider=${e} model=${n} duration=${t}ms status=${r}`);}function R(e,n){console.error(`${m} Failed to capture trace: provider=${e} error=${n.message}`);}function V(e){w()&&console.log(`${m} Wrapped client: provider=${e}`);}function B(e,n){w()&&console.log(`${m} Sending batch: count=${e} endpoint=${n}`);}function G(e,n){w()&&console.log(`${m} Batch sent successfully: count=${e} duration=${n}ms`);}function H(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${m} Batch send failed: count=${e} error=${t}`);}function W(e,n,t){w()&&console.log(`${m} Request: ${e} ${n} (${t} bytes)`);}function Y(e,n){w()&&console.log(`${m} Response: status=${e} duration=${n}ms`);}function P(e,n,t){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?r(`${m} ${n}`,t):r(`${m} ${n}`);}function we(e){if(typeof process<"u"&&process.env)return process.env[e]}var he=10,ye=1e3,be=1e4,_=class{constructor(n){C(this,"config");C(this,"queue",[]);C(this,"flushPromise",null);C(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??he,flushIntervalMs:n.flushIntervalMs??ye,requestTimeoutMs:n.requestTimeoutMs??be};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(n){if(n.length===0)return;let t=Date.now();B(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),G(n.length,Date.now()-t);}catch(r){H(n.length,r);}}async request(n,t,r){let o=`${this.config.endpoint}${t}`,s=new AbortController,i=r?JSON.stringify(r):void 0;W(n,o,i?.length??0);let a=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let u=await fetch(o,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:i,signal:s.signal});if(clearTimeout(a),Y(u.status,Date.now()-c),!u.ok){let S=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${S}`)}let l=await u.text();return l?JSON.parse(l):{}}catch(u){throw clearTimeout(a),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var Te="@lelemondev/sdk",ve="nodejs";function Ce(){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 Ie(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function xe(){try{if(typeof F<"u")return J().version??"unknown"}catch{}return "unknown"}var T=null;function Q(e){if(!T){let t=Ce(),r=Ie();T={"telemetry.sdk.name":Te,"telemetry.sdk.version":xe(),"telemetry.sdk.language":ve},t&&(T["process.runtime.name"]=t.name,T["process.runtime.version"]=t.version),r&&(T["os.type"]=r);}let n={...T};return e?.name&&(n["service.name"]=e.name),e?.version&&(n["service.version"]=e.version),e?.environment&&(n["deployment.environment"]=e.environment),n}var $={},h=null,q=null,Z="https://www.lelemon.dev";function Ee(e={}){$=e,e.debug&&U(true),q=Q(e.service),O("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:q}),h=ne(e),h.isEnabled()?O("SDK initialized - tracing enabled"):d("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ee(){return $}function A(){return q}function Re(){return y().isEnabled()}function y(){return h||(h=ne($)),h}async function _e(){h&&await h.flush();}function ne(e){let n=e.apiKey??Ae("LELEMON_API_KEY");return !n&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new _({apiKey:n??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ae(e){if(typeof process<"u"&&process.env)return process.env[e]}var re={};function oe(e){re=e,d("Global context updated",e);}function x(){return re}function b(e){try{let n=y();if(!n.isEnabled()){d("Transport disabled, skipping trace capture");return}let t=x(),r=f(),o=v(),s=A(),i={provider:e.provider,model:e.model,input:N(e.input),rawResponse:e.rawResponse?I(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{},...s?{_telemetry:s}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return D(e.provider,e.model,e.durationMs,e.status),n.enqueue(i),o}catch(n){R(e.provider,n instanceof Error?n:new Error(String(n)));return}}function k(e){try{let n=y();if(!n.isEnabled()){d("Transport disabled, skipping error capture");return}let t=x(),r=f(),o=A(),s={provider:e.provider,model:e.model,input:N(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:t.tags};D(e.provider,e.model,e.durationMs,"error"),d("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(s);}catch(n){R(e.provider,n instanceof Error?n:new Error(String(n)));}}function j(e){try{let n=y();if(!n.isEnabled()){d("Transport disabled, skipping span capture");return}let t=x(),r=f(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,i=A(),a={...t.metadata,...e.metadata,...i?{_telemetry:i}:{}};delete a._traceId,delete a._parentSpanId;let c={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:N(e.input),output:I(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:o??r?.traceId,spanId:v(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:a,tags:t.tags};d(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(c);}catch(n){R("unknown",n instanceof Error?n:new Error(String(n)));}}var te=1e5,Me=["api_key","apikey","password","secret","authorization"],Oe=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],De=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Pe(e){let n=e.toLowerCase();return De.includes(n)?false:!!(Me.some(t=>n.includes(t))||Oe.some(t=>n.includes(t)))}function N(e){return I(e,0)}function I(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>te?e.slice(0,te)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>I(t,n+1));if(typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))Pe(r)?t[r]="[REDACTED]":t[r]=I(o,n+1);return t}return String(e)}var se=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function f(){return se.getStore()}function K(e,n){let t=f();if(t)for(let r of e)t.pendingToolCalls.set(r,n),d(`Registered tool call ${r} \u2192 LLM span ${n}`);}function $e(e){let n=f();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function je(e){let n=f();n&&n.pendingToolCalls.delete(e);}async function Ne(e,n){let t=typeof e=="string"?{name:e}:e,r=f(),o=r?.traceId??v(),s=v(),i={traceId:o,rootSpanId:s,currentSpanId:s,parentSpanId:r?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return se.run(i,async()=>{let a,c;try{return a=await n(),a}catch(u){throw c=u instanceof Error?u:new Error(String(u)),u}finally{Ke(i,c?void 0:a,c);}})}function Ke(e,n,t){let r=y();if(!r.isEnabled()){d("Transport disabled, skipping root span");return}let o=x(),s=Date.now()-e.startTime,i=t?null:n,a={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:i,inputTokens:0,outputTokens:0,durationMs:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};d(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),r.enqueue(a);}function Le(e){let n=f();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=$e(e.toolCallId);j({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:n.traceId,_parentSpanId:t}}),e.toolCallId&&je(e.toolCallId);}var p="openai";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="OpenAI")return true;let t=e;return !!(t.chat&&t.completions)||!!t.responses}function ae(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ue(i))return Fe(i,o,r);let a=Date.now()-r,c=i,u=b({provider:p,model:o.model||c.model||"unknown",input:o.messages,rawResponse:i,durationMs:a,status:"success",streaming:!1});if(u){let l=pe(c);l.length>0&&K(l,u);}return i}catch(i){let a=Date.now()-r;throw k({provider:p,model:o.model||"unknown",input:o.messages,error:i instanceof Error?i:new Error(String(i)),durationMs:a,streaming:s}),i}}}function ue(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Fe(e,n,t){let r={choices:[{message:{content:"",tool_calls:[]},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,s,i=false,a=new Map;try{for await(let c of e){let u=c,l=u?.choices?.[0]?.delta?.content;l&&(i||(i=!0,s=Date.now()-t),r.choices[0].message.content+=l);let S=u?.choices?.[0]?.delta?.tool_calls;if(S)for(let g of S){a.has(g.index)||a.set(g.index,{id:"",function:{name:"",arguments:""}});let M=a.get(g.index);g.id&&(M.id=g.id),g.function?.name&&(M.function.name=g.function.name),g.function?.arguments&&(M.function.arguments+=g.function.arguments);}let L=u?.choices?.[0]?.finish_reason;L&&(r.choices[0].finish_reason=L),u?.usage&&(r.usage=u.usage),yield c;}}catch(c){throw o=c instanceof Error?c:new Error(String(c)),c}finally{let c=Date.now()-t;if(a.size>0&&(r.choices[0].message.tool_calls=Array.from(a.entries()).sort((u,l)=>u[0]-l[0]).map(([,u])=>u)),o)k({provider:p,model:n.model||"unknown",input:n.messages,error:o,durationMs:c,streaming:true});else {let u=b({provider:p,model:n.model||"unknown",input:n.messages,rawResponse:r,durationMs:c,status:"success",streaming:true,firstTokenMs:s});if(u){let l=pe(r);l.length>0&&K(l,u);}}}}function ce(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let i=await e(...t);if(s&&ue(i))return ze(i,o,r);let a=Date.now()-r;return b({provider:p,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},rawResponse:i,durationMs:a,status:"success",streaming:!1}),i}catch(i){let a=Date.now()-r;throw k({provider:p,model:o.model||"unknown",input:{instructions:o.instructions,input:o.input},error:i instanceof Error?i:new Error(String(i)),durationMs:a,streaming:s}),i}}}async function*ze(e,n,t){let r=[],o=null,s=null;try{for await(let i of e){r.push(i);let a=i;a.type==="response.done"&&a.response&&(o=a.response),yield i;}}catch(i){throw s=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;s?k({provider:p,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},error:s,durationMs:i,streaming:true}):b({provider:p,model:n.model||"unknown",input:{instructions:n.instructions,input:n.input},rawResponse:o||{streamEvents:r},durationMs:i,status:"success",streaming:true});}}function de(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return b({provider:p,model:o.model||"unknown",input:o.prompt,rawResponse:s,durationMs:i,status:"success",streaming:!1}),s}catch(s){let i=Date.now()-r;throw k({provider:p,model:o.model||"unknown",input:o.prompt,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function le(e){return async function(...t){let r=Date.now(),o=t[0]||{};try{let s=await e(...t),i=Date.now()-r;return b({provider:p,model:o.model||"unknown",input:o.input,rawResponse:s,durationMs:i,status:"success",streaming:!1,spanType:"embedding"}),s}catch(s){let i=Date.now()-r;throw k({provider:p,model:o.model||"unknown",input:o.input,error:s instanceof Error?s:new Error(String(s)),durationMs:i,streaming:false}),s}}}function pe(e){let n=[],t=e.choices?.[0]?.message?.tool_calls;if(Array.isArray(t))for(let r of t)r.id&&n.push(r.id);return n}function xn(e,n){return n&&oe(n),ee().disabled?(d("Tracing disabled, returning unwrapped client"),e):ie(e)?(V("openai"),Ve(e)):(E("Client is not an OpenAI client. Use @lelemondev/sdk/openai only with OpenAI SDK."),e)}function Ve(e){let n=e;return new Proxy(n,{get(t,r,o){let s=Reflect.get(t,r,o);return r==="chat"&&s&&typeof s=="object"?Be(s):r==="responses"&&s&&typeof s=="object"?He(s):r==="completions"&&s&&typeof s=="object"?We(s):r==="embeddings"&&s&&typeof s=="object"?Ye(s):s}})}function Be(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="completions"&&o&&typeof o=="object"?Ge(o):o}})}function Ge(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?ae(o.bind(n)):o}})}function He(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?ce(o.bind(n)):o}})}function We(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?de(o.bind(n)):o}})}function Ye(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?le(o.bind(n)):o}})}
|
|
3
|
+
export{j as captureSpan,_e as flush,f as getTraceContext,Ee as init,Re as isEnabled,xn as observe,Le as span,Ne as trace};//# sourceMappingURL=openai.mjs.map
|
|
4
4
|
//# sourceMappingURL=openai.mjs.map
|
package/dist/openrouter.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var Q=Object.defineProperty;var Z=(e,n,t)=>n in e?Q(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t;var T=(e,n,t)=>Z(e,typeof n!="symbol"?n+"":n,t);var O=false;function D(e){O=e;}function f(){return O?true:ee("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function d(e,n){f()&&R("debug",e,n);}function v(e,n){f()&&R("info",e,n);}function I(e,n){R("warn",e,n);}function E(e,n,t,r){f()&&console.log(`${p} Captured trace: provider=${e} model=${n} duration=${t}ms status=${r}`);}function k(e,n){console.error(`${p} Failed to capture trace: provider=${e} error=${n.message}`);}function L(e){f()&&console.log(`${p} Wrapped client: provider=${e}`);}function A(e,n){f()&&console.log(`${p} Sending batch: count=${e} endpoint=${n}`);}function N(e,n){f()&&console.log(`${p} Batch sent successfully: count=${e} duration=${n}ms`);}function U(e,n){let t=n instanceof Error?n.message:String(n);console.error(`${p} Batch send failed: count=${e} error=${t}`);}function z(e,n,t){f()&&console.log(`${p} Request: ${e} ${n} (${t} bytes)`);}function K(e,n){f()&&console.log(`${p} Response: status=${e} duration=${n}ms`);}function R(e,n,t){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;t!==void 0?r(`${p} ${n}`,t):r(`${p} ${n}`);}function ee(e){if(typeof process<"u"&&process.env)return process.env[e]}var ne=10,te=1e3,re=1e4,S=class{constructor(n){T(this,"config");T(this,"queue",[]);T(this,"flushPromise",null);T(this,"flushTimer",null);this.config={apiKey:n.apiKey,endpoint:n.endpoint,debug:n.debug,disabled:n.disabled,batchSize:n.batchSize??ne,flushIntervalMs:n.flushIntervalMs??te,requestTimeoutMs:n.requestTimeoutMs??re};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(n){this.config.disabled||(this.queue.push(n),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let n=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(n).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(n){if(n.length===0)return;let t=Date.now();A(n.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:n}),N(n.length,Date.now()-t);}catch(r){U(n.length,r);}}async request(n,t,r){let o=`${this.config.endpoint}${t}`,s=new AbortController,a=r?JSON.stringify(r):void 0;z(n,o,a?.length??0);let i=setTimeout(()=>{s.abort();},this.config.requestTimeoutMs),c=Date.now();try{let u=await fetch(o,{method:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:s.signal});if(clearTimeout(i),K(u.status,Date.now()-c),!u.ok){let X=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${X}`)}let w=await u.text();return w?JSON.parse(w):{}}catch(u){throw clearTimeout(i),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var M={},g=null,F="https://www.lelemon.dev";function se(e={}){M=e,e.debug&&D(true),v("Initializing SDK",{endpoint:e.endpoint??F,debug:e.debug??false,disabled:e.disabled??false}),g=G(e),g.isEnabled()?v("SDK initialized - tracing enabled"):d("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function B(){return M}function ae(){return m().isEnabled()}function m(){return g||(g=G(M)),g}async function ie(){g&&await g.flush();}function G(e){let n=e.apiKey??ue("LELEMON_API_KEY");return !n&&!e.disabled&&I("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new S({apiKey:n??"",endpoint:e.endpoint??F,debug:e.debug??false,disabled:e.disabled??!n,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function ue(e){if(typeof process<"u"&&process.env)return process.env[e]}var H={};function V(e){H=e,d("Global context updated",e);}function C(){return H}function $(e){try{let n=m();if(!n.isEnabled()){d("Transport disabled, skipping trace capture");return}let t=C(),r=l(),o=h(),s={provider:e.provider,model:e.model,input:q(e.input),rawResponse:e.rawResponse?y(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags,spanType:e.spanType,name:e.name};return E(e.provider,e.model,e.durationMs,e.status),n.enqueue(s),o}catch(n){k(e.provider,n instanceof Error?n:new Error(String(n)));return}}function _(e){try{let n=m();if(!n.isEnabled()){d("Transport disabled, skipping error capture");return}let t=C(),r=l(),o={provider:e.provider,model:e.model,input:q(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:t.sessionId,userId:t.userId,traceId:r?.traceId,spanId:h(),parentSpanId:r?.currentSpanId,metadata:{...t.metadata,...e.metadata,...r?{_traceName:r.name}:{}},tags:t.tags};E(e.provider,e.model,e.durationMs,"error"),d("Error details",{message:e.error.message,stack:e.error.stack}),n.enqueue(o);}catch(n){k(e.provider,n instanceof Error?n:new Error(String(n)));}}function P(e){try{let n=m();if(!n.isEnabled()){d("Transport disabled, skipping span capture");return}let t=C(),r=l(),o=e.metadata?._traceId,s=e.metadata?._parentSpanId,a={...t.metadata,...e.metadata};delete a._traceId,delete a._parentSpanId;let i={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:q(e.input),output:y(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:t.sessionId,userId:t.userId,traceId:o??r?.traceId,spanId:h(),parentSpanId:s??r?.currentSpanId,toolCallId:e.toolCallId,metadata:a,tags:t.tags};d(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),n.enqueue(i);}catch(n){k("unknown",n instanceof Error?n:new Error(String(n)));}}var j=1e5,ce=["api_key","apikey","password","secret","token","authorization"];function q(e){return y(e,0)}function y(e,n){if(n>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>j?e.slice(0,j)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(t=>y(t,n+1));if(typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))ce.some(s=>r.toLowerCase().includes(s))?t[r]="[REDACTED]":t[r]=y(o,n+1);return t}return String(e)}var W=new async_hooks.AsyncLocalStorage;function h(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function l(){return W.getStore()}function pe(e){let n=l();if(n)return e&&n.pendingToolCalls.has(e)?n.pendingToolCalls.get(e):n.currentSpanId}function le(e){let n=l();n&&n.pendingToolCalls.delete(e);}async function fe(e,n){let t=typeof e=="string"?{name:e}:e,r=l(),o=r?.traceId??h(),s=h(),a={traceId:o,rootSpanId:s,currentSpanId:s,parentSpanId:r?.currentSpanId,name:t.name,startTime:Date.now(),input:t.input,metadata:t.metadata,tags:t.tags,pendingToolCalls:new Map};return W.run(a,async()=>{let i,c;try{return i=await n(),i}catch(u){throw c=u instanceof Error?u:new Error(String(u)),u}finally{ge(a,c?void 0:i,c);}})}function ge(e,n,t){let r=m();if(!r.isEnabled()){d("Transport disabled, skipping root span");return}let o=C(),s=Date.now()-e.startTime,a=t?null:n,i={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:s,status:t?"error":"success",errorMessage:t?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};d(`Sending root span: ${e.name}`,{durationMs:s,hasError:!!t}),r.enqueue(i);}function me(e){let n=l();if(!n){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let t=pe(e.toolCallId);P({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:n.traceId,_parentSpanId:t}}),e.toolCallId&&le(e.toolCallId);}var be="openrouter.ai",x="openrouter";function Y(e){if(!e||typeof e!="object")return false;let n=e;return n.chat?.completions?.create?(n.baseURL||"").includes(be):false}function J(e){let n=e;return new Proxy(n,{get(t,r,o){let s=Reflect.get(t,r,o);return r==="chat"&&s&&typeof s=="object"?he(s):s}})}function he(e){return e&&new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="completions"&&o&&typeof o=="object"?we(o):o}})}function we(e){return new Proxy(e,{get(n,t,r){let o=Reflect.get(n,t,r);return t==="create"&&typeof o=="function"?Te(o.bind(n)):o}})}function Te(e){return async function(...t){let r=Date.now(),o=t[0]||{},s=o.stream===true;try{let a=await e(...t);if(s&&ye(a))return Ce(a,o,r);let i=Date.now()-r,c=a;return $({provider:x,model:o.model||c.model||"unknown",input:o.messages,rawResponse:a,durationMs:i,status:"success",streaming:!1}),a}catch(a){let i=Date.now()-r;throw _({provider:x,model:o.model||"unknown",input:o.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:i,streaming:s}),a}}}function ye(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Ce(e,n,t){let r={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,s,a=false;try{for await(let i of e){let c=i;!r.id&&c.id&&(r.id=c.id);let u=c.choices?.[0]?.delta?.content;u&&(a||(a=!0,s=Date.now()-t),r.choices[0].message.content+=u);let w=c.choices?.[0]?.finish_reason;w&&(r.choices[0].finish_reason=w),c.usage&&(r.usage=c.usage),yield i;}}catch(i){throw o=i instanceof Error?i:new Error(String(i)),i}finally{let i=Date.now()-t;o?_({provider:x,model:n.model||"unknown",input:n.messages,error:o,durationMs:i,streaming:true}):$({provider:x,model:n.model||"unknown",input:n.messages,rawResponse:r,durationMs:i,status:"success",streaming:true,firstTokenMs:s});}}function Qe(e,n){return n&&V(n),B().disabled?(d("Tracing disabled, returning unwrapped client"),e):Y(e)?(L("openrouter"),J(e)):(I("Client is not configured for OpenRouter. Ensure baseURL is set to openrouter.ai."),e)}
|
|
3
|
-
exports.captureSpan=P;exports.flush=
|
|
2
|
+
var se=Object.defineProperty;var ie=(e,t,n)=>t in e?se(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ae=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=(e,t,n)=>ie(e,typeof t!="symbol"?t+"":t,n);var G=ae((We,le)=>{le.exports={name:"@lelemondev/sdk",version:"0.9.3",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var L=false;function K(e){L=e;}function m(){return L?true:ue("LELEMON_DEBUG")==="true"}var p="[Lelemon]";function c(e,t){m()&&M("debug",e,t);}function R(e,t){m()&&M("info",e,t);}function S(e,t){M("warn",e,t);}function _(e,t,n,r){m()&&console.log(`${p} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function x(e,t){console.error(`${p} Failed to capture trace: provider=${e} error=${t.message}`);}function N(e){m()&&console.log(`${p} Wrapped client: provider=${e}`);}function U(e,t){m()&&console.log(`${p} Sending batch: count=${e} endpoint=${t}`);}function z(e,t){m()&&console.log(`${p} Batch sent successfully: count=${e} duration=${t}ms`);}function F(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${p} Batch send failed: count=${e} error=${n}`);}function V(e,t,n){m()&&console.log(`${p} Request: ${e} ${t} (${n} bytes)`);}function B(e,t){m()&&console.log(`${p} Response: status=${e} duration=${t}ms`);}function M(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${p} ${t}`,n):r(`${p} ${t}`);}function ue(e){if(typeof process<"u"&&process.env)return process.env[e]}var de=10,ce=1e3,pe=1e4,C=class{constructor(t){T(this,"config");T(this,"queue",[]);T(this,"flushPromise",null);T(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??de,flushIntervalMs:t.flushIntervalMs??ce,requestTimeoutMs:t.requestTimeoutMs??pe};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();U(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),z(t.length,Date.now()-n);}catch(r){F(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,i=new AbortController,a=r?JSON.stringify(r):void 0;V(t,o,a?.length??0);let s=setTimeout(()=>{i.abort();},this.config.requestTimeoutMs),d=Date.now();try{let u=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:a,signal:i.signal});if(clearTimeout(s),B(u.status,Date.now()-d),!u.ok){let oe=await u.text().catch(()=>"Unknown error");throw new Error(`HTTP ${u.status}: ${oe}`)}let w=await u.text();return w?JSON.parse(w):{}}catch(u){throw clearTimeout(s),u instanceof Error&&u.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):u}}};var me="@lelemondev/sdk",fe="nodejs";function ge(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function he(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function be(){try{if(typeof A<"u")return G().version??"unknown"}catch{}return "unknown"}var b=null;function W(e){if(!b){let n=ge(),r=he();b={"telemetry.sdk.name":me,"telemetry.sdk.version":be(),"telemetry.sdk.language":fe},n&&(b["process.runtime.name"]=n.name,b["process.runtime.version"]=n.version),r&&(b["os.type"]=r);}let t={...b};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var D={},g=null,q=null,Y="https://www.lelemon.dev";function we(e={}){D=e,e.debug&&K(true),q=W(e.service),R("Initializing SDK",{endpoint:e.endpoint??Y,debug:e.debug??false,disabled:e.disabled??false,telemetry:q}),g=X(e),g.isEnabled()?R("SDK initialized - tracing enabled"):c("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function J(){return D}function I(){return q}function Te(){return h().isEnabled()}function h(){return g||(g=X(D)),g}async function ve(){g&&await g.flush();}function X(e){let t=e.apiKey??ke("LELEMON_API_KEY");return !t&&!e.disabled&&S("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new C({apiKey:t??"",endpoint:e.endpoint??Y,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function ke(e){if(typeof process<"u"&&process.env)return process.env[e]}var Z={};function ee(e){Z=e,c("Global context updated",e);}function k(){return Z}function $(e){try{let t=h();if(!t.isEnabled()){c("Transport disabled, skipping trace capture");return}let n=k(),r=l(),o=y(),i=I(),a={provider:e.provider,model:e.model,input:j(e.input),rawResponse:e.rawResponse?v(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...i?{_telemetry:i}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return _(e.provider,e.model,e.durationMs,e.status),t.enqueue(a),o}catch(t){x(e.provider,t instanceof Error?t:new Error(String(t)));return}}function O(e){try{let t=h();if(!t.isEnabled()){c("Transport disabled, skipping error capture");return}let n=k(),r=l(),o=I(),i={provider:e.provider,model:e.model,input:j(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:y(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};_(e.provider,e.model,e.durationMs,"error"),c("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(i);}catch(t){x(e.provider,t instanceof Error?t:new Error(String(t)));}}function P(e){try{let t=h();if(!t.isEnabled()){c("Transport disabled, skipping span capture");return}let n=k(),r=l(),o=e.metadata?._traceId,i=e.metadata?._parentSpanId,a=I(),s={...n.metadata,...e.metadata,...a?{_telemetry:a}:{}};delete s._traceId,delete s._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:j(e.input),output:v(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:y(),parentSpanId:i??r?.currentSpanId,toolCallId:e.toolCallId,metadata:s,tags:n.tags};c(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){x("unknown",t instanceof Error?t:new Error(String(t)));}}var Q=1e5,Se=["api_key","apikey","password","secret","authorization"],xe=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Ce=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Ie(e){let t=e.toLowerCase();return Ce.includes(t)?false:!!(Se.some(n=>t.includes(n))||xe.some(n=>t.includes(n)))}function j(e){return v(e,0)}function v(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>Q?e.slice(0,Q)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>v(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Ie(r)?n[r]="[REDACTED]":n[r]=v(o,t+1);return n}return String(e)}var te=new async_hooks.AsyncLocalStorage;function y(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function l(){return te.getStore()}function Re(e){let t=l();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function _e(e){let t=l();t&&t.pendingToolCalls.delete(e);}async function Me(e,t){let n=typeof e=="string"?{name:e}:e,r=l(),o=r?.traceId??y(),i=y(),a={traceId:o,rootSpanId:i,currentSpanId:i,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return te.run(a,async()=>{let s,d;try{return s=await t(),s}catch(u){throw d=u instanceof Error?u:new Error(String(u)),u}finally{qe(a,d?void 0:s,d);}})}function qe(e,t,n){let r=h();if(!r.isEnabled()){c("Transport disabled, skipping root span");return}let o=k(),i=Date.now()-e.startTime,a=n?null:t,s={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:a,inputTokens:0,outputTokens:0,durationMs:i,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};c(`Sending root span: ${e.name}`,{durationMs:i,hasError:!!n}),r.enqueue(s);}function De(e){let t=l();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Re(e.toolCallId);P({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 $e="openrouter.ai",E="openrouter";function ne(e){if(!e||typeof e!="object")return false;let t=e;return t.chat?.completions?.create?(t.baseURL||"").includes($e):false}function re(e){let t=e;return new Proxy(t,{get(n,r,o){let i=Reflect.get(n,r,o);return r==="chat"&&i&&typeof i=="object"?Oe(i):i}})}function Oe(e){return e&&new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="completions"&&o&&typeof o=="object"?Pe(o):o}})}function Pe(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?je(o.bind(t)):o}})}function je(e){return async function(...n){let r=Date.now(),o=n[0]||{},i=o.stream===true;try{let a=await e(...n);if(i&&Ae(a))return Le(a,o,r);let s=Date.now()-r,d=a;return $({provider:E,model:o.model||d.model||"unknown",input:o.messages,rawResponse:a,durationMs:s,status:"success",streaming:!1}),a}catch(a){let s=Date.now()-r;throw O({provider:E,model:o.model||"unknown",input:o.messages,error:a instanceof Error?a:new Error(String(a)),durationMs:s,streaming:i}),a}}}function Ae(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}async function*Le(e,t,n){let r={choices:[{message:{content:"",role:"assistant"},finish_reason:""}],usage:{prompt_tokens:0,completion_tokens:0}},o=null,i,a=false;try{for await(let s of e){let d=s;!r.id&&d.id&&(r.id=d.id);let u=d.choices?.[0]?.delta?.content;u&&(a||(a=!0,i=Date.now()-n),r.choices[0].message.content+=u);let w=d.choices?.[0]?.finish_reason;w&&(r.choices[0].finish_reason=w),d.usage&&(r.usage=d.usage),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;o?O({provider:E,model:t.model||"unknown",input:t.messages,error:o,durationMs:s,streaming:true}):$({provider:E,model:t.model||"unknown",input:t.messages,rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:i});}}function Tt(e,t){return t&&ee(t),J().disabled?(c("Tracing disabled, returning unwrapped client"),e):ne(e)?(N("openrouter"),re(e)):(S("Client is not configured for OpenRouter. Ensure baseURL is set to openrouter.ai."),e)}
|
|
3
|
+
exports.captureSpan=P;exports.flush=ve;exports.getTraceContext=l;exports.init=we;exports.isEnabled=Te;exports.observe=Tt;exports.span=De;exports.trace=Me;//# sourceMappingURL=openrouter.js.map
|
|
4
4
|
//# sourceMappingURL=openrouter.js.map
|