@lelemondev/sdk 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -15
- package/dist/anthropic.d.mts +2 -2
- package/dist/anthropic.d.ts +2 -2
- package/dist/anthropic.js +1 -1
- package/dist/anthropic.mjs +1 -1
- package/dist/bedrock.d.mts +2 -2
- package/dist/bedrock.d.ts +2 -2
- package/dist/bedrock.js +1 -1
- package/dist/bedrock.mjs +1 -1
- package/dist/capture-BJnZrkYl.d.mts +264 -0
- package/dist/capture-BJnZrkYl.d.ts +264 -0
- package/dist/gemini.d.mts +2 -2
- package/dist/gemini.d.ts +2 -2
- package/dist/gemini.js +2 -2
- package/dist/gemini.mjs +1 -1
- package/dist/index.d.mts +21 -245
- package/dist/index.d.ts +21 -245
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/openai.d.mts +2 -2
- package/dist/openai.d.ts +2 -2
- package/dist/openai.js +1 -1
- package/dist/openai.mjs +1 -1
- package/dist/openrouter.d.mts +2 -2
- package/dist/openrouter.d.ts +2 -2
- package/dist/openrouter.js +1 -1
- package/dist/openrouter.mjs +1 -1
- 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/README.md
CHANGED
|
@@ -30,7 +30,8 @@ npm install @lelemondev/sdk
|
|
|
30
30
|
## Quick Start
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
|
-
|
|
33
|
+
// Import from provider-specific entry point for smaller bundle size
|
|
34
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
34
35
|
import OpenAI from 'openai';
|
|
35
36
|
|
|
36
37
|
// 1. Initialize once
|
|
@@ -46,6 +47,27 @@ const response = await openai.chat.completions.create({
|
|
|
46
47
|
});
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
### Provider-Specific Imports
|
|
51
|
+
|
|
52
|
+
Each provider has its own entry point for optimal bundle size:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// OpenAI
|
|
56
|
+
import { init, observe, flush } from '@lelemondev/sdk/openai';
|
|
57
|
+
|
|
58
|
+
// Anthropic
|
|
59
|
+
import { init, observe, flush } from '@lelemondev/sdk/anthropic';
|
|
60
|
+
|
|
61
|
+
// AWS Bedrock
|
|
62
|
+
import { init, observe, flush } from '@lelemondev/sdk/bedrock';
|
|
63
|
+
|
|
64
|
+
// Google Gemini
|
|
65
|
+
import { init, observe, flush } from '@lelemondev/sdk/gemini';
|
|
66
|
+
|
|
67
|
+
// OpenRouter
|
|
68
|
+
import { init, observe, flush } from '@lelemondev/sdk/openrouter';
|
|
69
|
+
```
|
|
70
|
+
|
|
49
71
|
## Supported Providers
|
|
50
72
|
|
|
51
73
|
| Provider | Status | Methods |
|
|
@@ -61,7 +83,7 @@ const response = await openai.chat.completions.create({
|
|
|
61
83
|
[OpenRouter](https://openrouter.ai) provides unified access to 400+ models from OpenAI, Anthropic, Google, Meta, Mistral, and more through a single API.
|
|
62
84
|
|
|
63
85
|
```typescript
|
|
64
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
86
|
+
import { init, observe } from '@lelemondev/sdk/openrouter';
|
|
65
87
|
import OpenAI from 'openai';
|
|
66
88
|
|
|
67
89
|
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
@@ -94,7 +116,7 @@ The SDK works with **any Node.js application**. Framework integrations are optio
|
|
|
94
116
|
For long-running processes, the SDK auto-flushes every second (configurable via `flushIntervalMs`):
|
|
95
117
|
|
|
96
118
|
```typescript
|
|
97
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
119
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
98
120
|
import OpenAI from 'openai';
|
|
99
121
|
|
|
100
122
|
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
@@ -119,7 +141,7 @@ async function handleRequest(userId: string, message: string) {
|
|
|
119
141
|
For scripts or serverless functions, call `flush()` before the process exits:
|
|
120
142
|
|
|
121
143
|
```typescript
|
|
122
|
-
import { init, observe, flush } from '@lelemondev/sdk';
|
|
144
|
+
import { init, observe, flush } from '@lelemondev/sdk/openai';
|
|
123
145
|
import OpenAI from 'openai';
|
|
124
146
|
|
|
125
147
|
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
@@ -144,7 +166,7 @@ main();
|
|
|
144
166
|
|
|
145
167
|
```typescript
|
|
146
168
|
import http from 'http';
|
|
147
|
-
import { init, observe, flush } from '@lelemondev/sdk';
|
|
169
|
+
import { init, observe, flush } from '@lelemondev/sdk/openai';
|
|
148
170
|
import OpenAI from 'openai';
|
|
149
171
|
|
|
150
172
|
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
@@ -194,7 +216,7 @@ Framework integrations automate the `flush()` call so you don't have to think ab
|
|
|
194
216
|
|
|
195
217
|
```typescript
|
|
196
218
|
// app/api/chat/route.ts
|
|
197
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
219
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
198
220
|
import { withObserve } from '@lelemondev/sdk/next';
|
|
199
221
|
import { after } from 'next/server';
|
|
200
222
|
import OpenAI from 'openai';
|
|
@@ -219,7 +241,7 @@ export const POST = withObserve(
|
|
|
219
241
|
|
|
220
242
|
```typescript
|
|
221
243
|
import express from 'express';
|
|
222
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
244
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
223
245
|
import { createMiddleware } from '@lelemondev/sdk/express';
|
|
224
246
|
import OpenAI from 'openai';
|
|
225
247
|
|
|
@@ -241,7 +263,7 @@ app.post('/chat', async (req, res) => {
|
|
|
241
263
|
### AWS Lambda
|
|
242
264
|
|
|
243
265
|
```typescript
|
|
244
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
266
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
245
267
|
import { withObserve } from '@lelemondev/sdk/lambda';
|
|
246
268
|
import OpenAI from 'openai';
|
|
247
269
|
|
|
@@ -265,7 +287,7 @@ export const handler = withObserve(async (event) => {
|
|
|
265
287
|
|
|
266
288
|
```typescript
|
|
267
289
|
import { Hono } from 'hono';
|
|
268
|
-
import { init, observe } from '@lelemondev/sdk';
|
|
290
|
+
import { init, observe } from '@lelemondev/sdk/openai';
|
|
269
291
|
import { createMiddleware } from '@lelemondev/sdk/hono';
|
|
270
292
|
import OpenAI from 'openai';
|
|
271
293
|
|
|
@@ -299,8 +321,14 @@ init({
|
|
|
299
321
|
endpoint: 'https://...', // Optional, custom endpoint
|
|
300
322
|
debug: false, // Optional, enable debug logs
|
|
301
323
|
disabled: false, // Optional, disable tracing
|
|
302
|
-
batchSize: 10, // Optional, items per batch
|
|
303
|
-
flushIntervalMs: 1000, // Optional, auto-flush interval
|
|
324
|
+
batchSize: 10, // Optional, items per batch (default: 10)
|
|
325
|
+
flushIntervalMs: 1000, // Optional, auto-flush interval in ms (default: 1000)
|
|
326
|
+
requestTimeoutMs: 10000, // Optional, HTTP request timeout in ms (default: 10000)
|
|
327
|
+
service: { // Optional, service metadata for telemetry
|
|
328
|
+
name: 'my-ai-app', // Service name
|
|
329
|
+
version: '1.0.0', // Service version
|
|
330
|
+
environment: 'production' // Deployment environment
|
|
331
|
+
}
|
|
304
332
|
});
|
|
305
333
|
```
|
|
306
334
|
|
|
@@ -325,6 +353,101 @@ Manually flush pending traces. Use in serverless without framework integration.
|
|
|
325
353
|
await flush();
|
|
326
354
|
```
|
|
327
355
|
|
|
356
|
+
### `isEnabled()`
|
|
357
|
+
|
|
358
|
+
Check if tracing is enabled (useful for conditional logic).
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
import { isEnabled } from '@lelemondev/sdk/openai';
|
|
362
|
+
|
|
363
|
+
if (isEnabled()) {
|
|
364
|
+
console.log('Tracing is active');
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### `trace(name, fn)` / `trace(options, fn)`
|
|
369
|
+
|
|
370
|
+
Group multiple LLM calls under a single trace. Useful for agents, RAG pipelines, and multi-step workflows.
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
import { trace, span } from '@lelemondev/sdk/openai';
|
|
374
|
+
|
|
375
|
+
// Simple usage
|
|
376
|
+
await trace('sales-agent', async () => {
|
|
377
|
+
const response = await openai.chat.completions.create({...});
|
|
378
|
+
return response;
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// With options
|
|
382
|
+
await trace({
|
|
383
|
+
name: 'rag-query',
|
|
384
|
+
input: userQuestion,
|
|
385
|
+
metadata: { source: 'api' },
|
|
386
|
+
tags: ['production']
|
|
387
|
+
}, async () => {
|
|
388
|
+
// All LLM calls inside become children of this trace
|
|
389
|
+
const docs = await searchVectors(userQuestion);
|
|
390
|
+
const response = await openai.chat.completions.create({...});
|
|
391
|
+
return response;
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### `span(options)`
|
|
396
|
+
|
|
397
|
+
Manually capture a span for non-LLM operations (retrieval, embedding, tool calls). Must be called within a `trace()` block.
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
import { trace, span } from '@lelemondev/sdk/openai';
|
|
401
|
+
|
|
402
|
+
await trace('rag-pipeline', async () => {
|
|
403
|
+
// Capture a retrieval span
|
|
404
|
+
const t0 = Date.now();
|
|
405
|
+
const docs = await pinecone.query({ vector, topK: 5 });
|
|
406
|
+
span({
|
|
407
|
+
type: 'retrieval',
|
|
408
|
+
name: 'pinecone-search',
|
|
409
|
+
input: { topK: 5 },
|
|
410
|
+
output: { count: docs.length },
|
|
411
|
+
durationMs: Date.now() - t0,
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// LLM call is automatically captured
|
|
415
|
+
return openai.chat.completions.create({...});
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Span types:** `retrieval`, `embedding`, `tool`, `guardrail`, `rerank`, `custom`
|
|
420
|
+
|
|
421
|
+
### `captureSpan(options)`
|
|
422
|
+
|
|
423
|
+
Lower-level API for manual span capture. Works both inside and outside `trace()` blocks.
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
import { captureSpan } from '@lelemondev/sdk/openai';
|
|
427
|
+
|
|
428
|
+
captureSpan({
|
|
429
|
+
type: 'tool',
|
|
430
|
+
name: 'get_weather',
|
|
431
|
+
input: { location: 'San Francisco' },
|
|
432
|
+
output: { temperature: 72, conditions: 'sunny' },
|
|
433
|
+
durationMs: 150,
|
|
434
|
+
status: 'success', // or 'error'
|
|
435
|
+
});
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### `getTraceContext()`
|
|
439
|
+
|
|
440
|
+
Get the current trace context (useful for advanced scenarios).
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
import { getTraceContext } from '@lelemondev/sdk/openai';
|
|
444
|
+
|
|
445
|
+
const ctx = getTraceContext();
|
|
446
|
+
if (ctx) {
|
|
447
|
+
console.log('Inside trace:', ctx.name, ctx.traceId);
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
328
451
|
## User & Session Tracking
|
|
329
452
|
|
|
330
453
|
Track which user generated each trace and group related conversations.
|
|
@@ -409,14 +532,18 @@ app.post('/chat', async (req, res) => {
|
|
|
409
532
|
|
|
410
533
|
### Reusable Context with createObserve()
|
|
411
534
|
|
|
412
|
-
When you have multiple LLM clients or make calls from different places, use `createObserve()` to avoid repeating context
|
|
535
|
+
When you have multiple LLM clients or make calls from different places, use `createObserve()` to avoid repeating context.
|
|
536
|
+
|
|
537
|
+
> **Note:** `createObserve` is imported from the generic `@lelemondev/sdk` entry point (not provider-specific) because it works with any provider.
|
|
413
538
|
|
|
414
539
|
```typescript
|
|
415
|
-
import { createObserve } from '@lelemondev/sdk';
|
|
540
|
+
import { init, createObserve } from '@lelemondev/sdk';
|
|
416
541
|
import OpenAI from 'openai';
|
|
417
542
|
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
418
543
|
import { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime';
|
|
419
544
|
|
|
545
|
+
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
546
|
+
|
|
420
547
|
// Create a scoped observe function with user context
|
|
421
548
|
const observeForUser = createObserve({
|
|
422
549
|
userId: 'user-123',
|
|
@@ -439,7 +566,9 @@ await gemini.getGenerativeModel({ model: 'gemini-pro' }).generateContent('...');
|
|
|
439
566
|
Set up user context once, use it everywhere:
|
|
440
567
|
|
|
441
568
|
```typescript
|
|
442
|
-
import { createObserve } from '@lelemondev/sdk';
|
|
569
|
+
import { init, createObserve } from '@lelemondev/sdk';
|
|
570
|
+
|
|
571
|
+
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
443
572
|
|
|
444
573
|
// Middleware to attach observe function to request
|
|
445
574
|
app.use((req, res, next) => {
|
|
@@ -469,6 +598,8 @@ app.post('/summarize', async (req, res) => {
|
|
|
469
598
|
### Multi-tenant Application
|
|
470
599
|
|
|
471
600
|
```typescript
|
|
601
|
+
import { observe } from '@lelemondev/sdk/openai';
|
|
602
|
+
|
|
472
603
|
app.post('/api/:tenantId/chat', async (req, res) => {
|
|
473
604
|
const openai = observe(new OpenAI(), {
|
|
474
605
|
userId: req.user.id,
|
|
@@ -491,7 +622,9 @@ When your application spans multiple services (REST API, WebSocket server, backg
|
|
|
491
622
|
```typescript
|
|
492
623
|
// Shared utility for creating observe context
|
|
493
624
|
// utils/observe-context.ts
|
|
494
|
-
import { createObserve } from '@lelemondev/sdk';
|
|
625
|
+
import { init, createObserve } from '@lelemondev/sdk';
|
|
626
|
+
|
|
627
|
+
init({ apiKey: process.env.LELEMON_API_KEY });
|
|
495
628
|
|
|
496
629
|
export function createUserObserve(userId: string, sessionId: string, service: string) {
|
|
497
630
|
return createObserve({
|
package/dist/anthropic.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ObserveOptions } from './
|
|
2
|
-
export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './
|
|
1
|
+
import { O as ObserveOptions } from './capture-BJnZrkYl.mjs';
|
|
2
|
+
export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Anthropic Provider Entry Point
|
package/dist/anthropic.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ObserveOptions } from './
|
|
2
|
-
export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './
|
|
1
|
+
import { O as ObserveOptions } from './capture-BJnZrkYl.js';
|
|
2
|
+
export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Anthropic Provider Entry Point
|
package/dist/anthropic.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use strict';var async_hooks=require('async_hooks');/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var de=Object.defineProperty;var le=(e,t,n)=>t in e?de(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var J=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>le(e,typeof t!="symbol"?t+"":t,n);var X=pe((Qe,be)=>{be.exports={name:"@lelemondev/sdk",version:"0.9.2",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function z(e){U=e;}function y(){return U?true:me("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&P("debug",e,t);}function $(e,t){y()&&P("info",e,t);}function E(e,t){P("warn",e,t);}function j(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function F(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function G(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function P(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,R=class{constructor(t){S(this,"config");S(this,"queue",[]);S(this,"flushPromise",null);S(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),G(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;W(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Y(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",ke="nodejs";function we(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Te(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof J<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function Z(e){if(!v){let n=we(),r=Te();v={"telemetry.sdk.name":he,"telemetry.sdk.version":ve(),"telemetry.sdk.language":ke},n&&(v["process.runtime.name"]=n.name,v["process.runtime.version"]=n.version),r&&(v["os.type"]=r);}let t={...v};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var N={},k=null,O=null,ee="https://www.lelemon.dev";function Se(e={}){N=e,e.debug&&z(true),O=Z(e.service),$("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),k=ne(e),k.isEnabled()?$("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function te(){return N}function D(){return O}function _e(){return w().isEnabled()}function w(){return k||(k=ne(N)),k}async function Ie(){k&&await k.flush();}function ne(e){let t=e.apiKey??Ce("LELEMON_API_KEY");return !t&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new R({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var se={};function oe(e){se=e,m("Global context updated",e);}function I(){return se}function A(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=I(),r=g(),o=x(),a=D(),u={provider:e.provider,model:e.model,input:L(e.input),rawResponse:e.rawResponse?_(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return j(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));return}}function C(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=I(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:x(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};j(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=I(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=D(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(e.input),output:_(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:x(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){M("unknown",t instanceof Error?t:new Error(String(t)));}}var re=1e5,Ee=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Re=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function De(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ee.some(n=>t.includes(n))||Me.some(n=>t.includes(n)))}function L(e){return _(e,0)}function _(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>re?e.slice(0,re)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>_(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))De(r)?n[r]="[REDACTED]":n[r]=_(o,t+1);return n}return String(e)}var ie=new async_hooks.AsyncLocalStorage;function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function q(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function qe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function $e(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function je(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??x(),a=x(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return ie.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{Pe(u,d?void 0:c,d);}})}function Pe(e,t,n){let r=w();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=I(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Oe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);K({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&$e(e.toolCallId);}var T="anthropic";function ae(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ue(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Ne(u))return Le(u,o,r);let c=Date.now()-r,d=u,s=A({provider:T,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=B(d.content);l.length>0&&q(l,s);}return u}catch(u){let c=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ce(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ke(a,o,r):a}catch(a){let u=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Ne(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ke(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;C({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=A({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=B(o.content);b.length>0&&q(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Le(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)C({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=A({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=B(r.content);i.length>0&&q(i,l);}}}}function B(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function _t(e,t){return t&&oe(t),te().disabled?(m("Tracing disabled, returning unwrapped client"),e):ae(e)?(F("anthropic"),Je(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Je(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Ue(a):a}})}function Ue(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ue(o.bind(t)):n==="stream"&&typeof o=="function"?ce(o.bind(t)):o}})}
|
|
2
|
+
var de=Object.defineProperty;var le=(e,t,n)=>t in e?de(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var J=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=(e,t,n)=>le(e,typeof t!="symbol"?t+"":t,n);var X=pe((Qe,be)=>{be.exports={name:"@lelemondev/sdk",version:"0.9.4",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var U=false;function z(e){U=e;}function y(){return U?true:me("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&P("debug",e,t);}function $(e,t){y()&&P("info",e,t);}function E(e,t){P("warn",e,t);}function j(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function M(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function F(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function V(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function G(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function H(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function W(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function Y(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function P(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function me(e){if(typeof process<"u"&&process.env)return process.env[e]}var fe=10,ge=1e3,ye=1e4,R=class{constructor(t){S(this,"config");S(this,"queue",[]);S(this,"flushPromise",null);S(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??fe,flushIntervalMs:t.flushIntervalMs??ge,requestTimeoutMs:t.requestTimeoutMs??ye};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();V(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),G(t.length,Date.now()-n);}catch(r){H(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;W(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),Y(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var he="@lelemondev/sdk",ke="nodejs";function we(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function Te(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function ve(){try{if(typeof J<"u")return X().version??"unknown"}catch{}return "unknown"}var v=null;function Z(e){if(!v){let n=we(),r=Te();v={"telemetry.sdk.name":he,"telemetry.sdk.version":ve(),"telemetry.sdk.language":ke},n&&(v["process.runtime.name"]=n.name,v["process.runtime.version"]=n.version),r&&(v["os.type"]=r);}let t={...v};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var N={},k=null,O=null,ee="https://www.lelemon.dev";function Se(e={}){N=e,e.debug&&z(true),O=Z(e.service),$("Initializing SDK",{endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??false,telemetry:O}),k=ne(e),k.isEnabled()?$("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function te(){return N}function D(){return O}function _e(){return w().isEnabled()}function w(){return k||(k=ne(N)),k}async function Ie(){k&&await k.flush();}function ne(e){let t=e.apiKey??Ce("LELEMON_API_KEY");return !t&&!e.disabled&&E("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new R({apiKey:t??"",endpoint:e.endpoint??ee,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ce(e){if(typeof process<"u"&&process.env)return process.env[e]}var se={};function oe(e){se=e,m("Global context updated",e);}function I(){return se}function A(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=I(),r=g(),o=x(),a=D(),u={provider:e.provider,model:e.model,input:L(e.input),rawResponse:e.rawResponse?_(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return j(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));return}}function C(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=I(),r=g(),o=D(),a={provider:e.provider,model:e.model,input:L(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:x(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};j(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){M(e.provider,t instanceof Error?t:new Error(String(t)));}}function K(e){try{let t=w();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=I(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=D(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:L(e.input),output:_(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:x(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){M("unknown",t instanceof Error?t:new Error(String(t)));}}var re=1e5,Ee=["api_key","apikey","password","secret","authorization"],Me=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Re=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function De(e){let t=e.toLowerCase();return Re.includes(t)?false:!!(Ee.some(n=>t.includes(n))||Me.some(n=>t.includes(n)))}function L(e){return _(e,0)}function _(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>re?e.slice(0,re)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>_(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))De(r)?n[r]="[REDACTED]":n[r]=_(o,t+1);return n}return String(e)}var ie=new async_hooks.AsyncLocalStorage;function x(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return ie.getStore()}function q(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function qe(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function $e(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function je(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??x(),a=x(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return ie.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{Pe(u,d?void 0:c,d);}})}function Pe(e,t,n){let r=w();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=I(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Oe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=qe(e.toolCallId);K({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&$e(e.toolCallId);}var T="anthropic";function ae(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ue(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Ne(u))return Le(u,o,r);let c=Date.now()-r,d=u,s=A({provider:T,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=B(d.content);l.length>0&&q(l,s);}return u}catch(u){let c=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ce(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ke(a,o,r):a}catch(a){let u=Date.now()-r;throw C({provider:T,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Ne(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ke(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;C({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=A({provider:T,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=B(o.content);b.length>0&&q(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Le(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)C({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=A({provider:T,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=B(r.content);i.length>0&&q(i,l);}}}}function B(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function _t(e,t){return t&&oe(t),te().disabled?(m("Tracing disabled, returning unwrapped client"),e):ae(e)?(F("anthropic"),Je(e)):(E("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Je(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Ue(a):a}})}function Ue(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ue(o.bind(t)):n==="stream"&&typeof o=="function"?ce(o.bind(t)):o}})}
|
|
3
3
|
exports.captureSpan=K;exports.flush=Ie;exports.getTraceContext=g;exports.init=Se;exports.isEnabled=_e;exports.observe=_t;exports.span=Oe;exports.trace=je;//# sourceMappingURL=anthropic.js.map
|
|
4
4
|
//# sourceMappingURL=anthropic.js.map
|
package/dist/anthropic.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import {AsyncLocalStorage}from'async_hooks';/* @lelemondev/sdk - LLM Observability */
|
|
2
|
-
var ce=Object.defineProperty;var de=(e,t,n)=>t in e?ce(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var B=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var Y=le((We,ye)=>{ye.exports={name:"@lelemondev/sdk",version:"0.9.2",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var J=false;function U(e){J=e;}function y(){return J?true:pe("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&j("debug",e,t);}function q(e,t){y()&&j("info",e,t);}function C(e,t){j("warn",e,t);}function $(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function E(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function F(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function V(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function W(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function j(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var me=10,fe=1e3,ge=1e4,M=class{constructor(t){x(this,"config");x(this,"queue",[]);x(this,"flushPromise",null);x(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??me,flushIntervalMs:t.flushIntervalMs??fe,requestTimeoutMs:t.requestTimeoutMs??ge};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){G(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;H(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),W(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var be="@lelemondev/sdk",he="nodejs";function ke(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function we(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Te(){try{if(typeof B<"u")return Y().version??"unknown"}catch{}return "unknown"}var T=null;function Q(e){if(!T){let n=ke(),r=we();T={"telemetry.sdk.name":be,"telemetry.sdk.version":Te(),"telemetry.sdk.language":he},n&&(T["process.runtime.name"]=n.name,T["process.runtime.version"]=n.version),r&&(T["os.type"]=r);}let t={...T};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var O={},h=null,P=null,Z="https://www.lelemon.dev";function xe(e={}){O=e,e.debug&&U(true),P=Q(e.service),q("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),h=te(e),h.isEnabled()?q("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ee(){return O}function R(){return P}function Se(){return k().isEnabled()}function k(){return h||(h=te(O)),h}async function _e(){h&&await h.flush();}function te(e){let t=e.apiKey??Ie("LELEMON_API_KEY");return !t&&!e.disabled&&C("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new M({apiKey:t??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ie(e){if(typeof process<"u"&&process.env)return process.env[e]}var re={};function se(e){re=e,m("Global context updated",e);}function _(){return re}function D(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=_(),r=g(),o=v(),a=R(),u={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function I(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=_(),r=g(),o=R(),a={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};$(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=_(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=R(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Ce=["api_key","apikey","password","secret","authorization"],Ee=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Me=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Re(e){let t=e.toLowerCase();return Me.includes(t)?false:!!(Ce.some(n=>t.includes(n))||Ee.some(n=>t.includes(n)))}function K(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ne?e.slice(0,ne)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Re(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var oe=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return oe.getStore()}function A(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ae(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function qe(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function $e(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??v(),a=v(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return oe.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{je(u,d?void 0:c,d);}})}function je(e,t,n){let r=k();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=_(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Pe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ae(e.toolCallId);N({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&qe(e.toolCallId);}var w="anthropic";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ae(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Oe(u))return Ke(u,o,r);let c=Date.now()-r,d=u,s=D({provider:w,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=L(d.content);l.length>0&&A(l,s);}return u}catch(u){let c=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ue(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ne(a,o,r):a}catch(a){let u=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Oe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ne(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;I({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=D({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=L(o.content);b.length>0&&A(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Ke(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)I({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=L(r.content);i.length>0&&A(i,l);}}}}function L(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function bt(e,t){return t&&se(t),ee().disabled?(m("Tracing disabled, returning unwrapped client"),e):ie(e)?(z("anthropic"),Be(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Be(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Je(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ae(o.bind(t)):n==="stream"&&typeof o=="function"?ue(o.bind(t)):o}})}
|
|
2
|
+
var ce=Object.defineProperty;var de=(e,t,n)=>t in e?ce(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var B=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var x=(e,t,n)=>de(e,typeof t!="symbol"?t+"":t,n);var Y=le((We,ye)=>{ye.exports={name:"@lelemondev/sdk",version:"0.9.4",description:"Automatic LLM observability. Wrap your client, everything is traced.",author:"Lelemon <info@lelemon.dev>",license:"MIT",repository:{type:"git",url:"git+https://github.com/lelemondev/lelemondev-sdk.git"},homepage:"https://lelemon.dev",bugs:{url:"https://github.com/lelemondev/lelemondev-sdk/issues"},keywords:["llm","observability","tracing","openai","anthropic","nextjs","lambda","express","hono","claude","gpt","ai","monitoring","serverless"],main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./openai":{types:"./dist/openai.d.ts",import:"./dist/openai.mjs",require:"./dist/openai.js"},"./anthropic":{types:"./dist/anthropic.d.ts",import:"./dist/anthropic.mjs",require:"./dist/anthropic.js"},"./bedrock":{types:"./dist/bedrock.d.ts",import:"./dist/bedrock.mjs",require:"./dist/bedrock.js"},"./gemini":{types:"./dist/gemini.d.ts",import:"./dist/gemini.mjs",require:"./dist/gemini.js"},"./openrouter":{types:"./dist/openrouter.d.ts",import:"./dist/openrouter.mjs",require:"./dist/openrouter.js"},"./next":{types:"./dist/next.d.ts",import:"./dist/next.mjs",require:"./dist/next.js"},"./lambda":{types:"./dist/lambda.d.ts",import:"./dist/lambda.mjs",require:"./dist/lambda.js"},"./express":{types:"./dist/express.d.ts",import:"./dist/express.mjs",require:"./dist/express.js"},"./hono":{types:"./dist/hono.d.ts",import:"./dist/hono.mjs",require:"./dist/hono.js"},"./integrations":{types:"./dist/integrations.d.ts",import:"./dist/integrations.mjs",require:"./dist/integrations.js"},"./package.json":"./package.json"},typesVersions:{"*":{openai:["./dist/openai.d.ts"],anthropic:["./dist/anthropic.d.ts"],bedrock:["./dist/bedrock.d.ts"],gemini:["./dist/gemini.d.ts"],openrouter:["./dist/openrouter.d.ts"],next:["./dist/next.d.ts"],lambda:["./dist/lambda.d.ts"],express:["./dist/express.d.ts"],hono:["./dist/hono.d.ts"],integrations:["./dist/integrations.d.ts"],"*":["./dist/index.d.ts"]}},files:["dist/**/*.js","dist/**/*.mjs","dist/**/*.d.ts","dist/**/*.d.mts","README.md"],sideEffects:false,engines:{node:">=18.0.0"},scripts:{build:"tsup",dev:"tsup --watch",docs:"typedoc && node scripts/generate-llms-txt.mjs",prepublishOnly:"npm run build",lint:"eslint src/",test:"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","test:e2e":"vitest run tests/e2e",typecheck:"tsc --noEmit"},devDependencies:{"@aws-sdk/client-bedrock-runtime":"^3.962.0","@google/generative-ai":"^0.24.1","@types/node":"^20.0.0","@vitest/coverage-v8":"^2.0.0",dotenv:"^17.2.3",openai:"^6.15.0",tsup:"^8.5.1",typedoc:"^0.28.15",typescript:"^5.9.3",vitest:"^2.0.0"}};});var J=false;function U(e){J=e;}function y(){return J?true:pe("LELEMON_DEBUG")==="true"}var f="[Lelemon]";function m(e,t){y()&&j("debug",e,t);}function q(e,t){y()&&j("info",e,t);}function C(e,t){j("warn",e,t);}function $(e,t,n,r){y()&&console.log(`${f} Captured trace: provider=${e} model=${t} duration=${n}ms status=${r}`);}function E(e,t){console.error(`${f} Failed to capture trace: provider=${e} error=${t.message}`);}function z(e){y()&&console.log(`${f} Wrapped client: provider=${e}`);}function F(e,t){y()&&console.log(`${f} Sending batch: count=${e} endpoint=${t}`);}function V(e,t){y()&&console.log(`${f} Batch sent successfully: count=${e} duration=${t}ms`);}function G(e,t){let n=t instanceof Error?t.message:String(t);console.error(`${f} Batch send failed: count=${e} error=${n}`);}function H(e,t,n){y()&&console.log(`${f} Request: ${e} ${t} (${n} bytes)`);}function W(e,t){y()&&console.log(`${f} Response: status=${e} duration=${t}ms`);}function j(e,t,n){let r=e==="error"?console.error:e==="warn"?console.warn:console.log;n!==void 0?r(`${f} ${t}`,n):r(`${f} ${t}`);}function pe(e){if(typeof process<"u"&&process.env)return process.env[e]}var me=10,fe=1e3,ge=1e4,M=class{constructor(t){x(this,"config");x(this,"queue",[]);x(this,"flushPromise",null);x(this,"flushTimer",null);this.config={apiKey:t.apiKey,endpoint:t.endpoint,debug:t.debug,disabled:t.disabled,batchSize:t.batchSize??me,flushIntervalMs:t.flushIntervalMs??fe,requestTimeoutMs:t.requestTimeoutMs??ge};}isEnabled(){return !this.config.disabled&&!!this.config.apiKey}enqueue(t){this.config.disabled||(this.queue.push(t),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush());}async flush(){if(this.flushPromise)return this.flushPromise;if(this.queue.length===0)return;this.cancelScheduledFlush();let t=this.queue;return this.queue=[],this.flushPromise=this.sendBatch(t).finally(()=>{this.flushPromise=null;}),this.flushPromise}getPendingCount(){return this.queue.length}scheduleFlush(){this.flushTimer===null&&(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}cancelScheduledFlush(){this.flushTimer!==null&&(clearTimeout(this.flushTimer),this.flushTimer=null);}async sendBatch(t){if(t.length===0)return;let n=Date.now();F(t.length,`${this.config.endpoint}/api/v1/ingest`);try{await this.request("POST","/api/v1/ingest",{events:t}),V(t.length,Date.now()-n);}catch(r){G(t.length,r);}}async request(t,n,r){let o=`${this.config.endpoint}${n}`,a=new AbortController,u=r?JSON.stringify(r):void 0;H(t,o,u?.length??0);let c=setTimeout(()=>{a.abort();},this.config.requestTimeoutMs),d=Date.now();try{let s=await fetch(o,{method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:u,signal:a.signal});if(clearTimeout(c),W(s.status,Date.now()-d),!s.ok){let i=await s.text().catch(()=>"Unknown error");throw new Error(`HTTP ${s.status}: ${i}`)}let l=await s.text();return l?JSON.parse(l):{}}catch(s){throw clearTimeout(c),s instanceof Error&&s.name==="AbortError"?new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`):s}}};var be="@lelemondev/sdk",he="nodejs";function ke(){return typeof process<"u"&&process.versions?.node?{name:"nodejs",version:process.versions.node}:typeof Deno<"u"?{name:"deno",version:Deno.version?.deno??"unknown"}:typeof Bun<"u"?{name:"bun",version:Bun.version??"unknown"}:typeof window<"u"&&typeof navigator<"u"?{name:"browser",version:navigator.userAgent}:null}function we(){if(typeof process<"u"&&process.platform){let e=process.platform;switch(e){case "darwin":return "darwin";case "win32":return "windows";case "linux":return "linux";default:return e}}if(typeof navigator<"u"){let e=navigator.userAgent.toLowerCase();if(e.includes("mac"))return "darwin";if(e.includes("win"))return "windows";if(e.includes("linux"))return "linux"}return null}function Te(){try{if(typeof B<"u")return Y().version??"unknown"}catch{}return "unknown"}var T=null;function Q(e){if(!T){let n=ke(),r=we();T={"telemetry.sdk.name":be,"telemetry.sdk.version":Te(),"telemetry.sdk.language":he},n&&(T["process.runtime.name"]=n.name,T["process.runtime.version"]=n.version),r&&(T["os.type"]=r);}let t={...T};return e?.name&&(t["service.name"]=e.name),e?.version&&(t["service.version"]=e.version),e?.environment&&(t["deployment.environment"]=e.environment),t}var O={},h=null,P=null,Z="https://www.lelemon.dev";function xe(e={}){O=e,e.debug&&U(true),P=Q(e.service),q("Initializing SDK",{endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??false,telemetry:P}),h=te(e),h.isEnabled()?q("SDK initialized - tracing enabled"):m("SDK initialized - tracing disabled (no API key or explicitly disabled)");}function ee(){return O}function R(){return P}function Se(){return k().isEnabled()}function k(){return h||(h=te(O)),h}async function _e(){h&&await h.flush();}function te(e){let t=e.apiKey??Ie("LELEMON_API_KEY");return !t&&!e.disabled&&C("No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled."),new M({apiKey:t??"",endpoint:e.endpoint??Z,debug:e.debug??false,disabled:e.disabled??!t,batchSize:e.batchSize,flushIntervalMs:e.flushIntervalMs,requestTimeoutMs:e.requestTimeoutMs})}function Ie(e){if(typeof process<"u"&&process.env)return process.env[e]}var re={};function se(e){re=e,m("Global context updated",e);}function _(){return re}function D(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping trace capture");return}let n=_(),r=g(),o=v(),a=R(),u={provider:e.provider,model:e.model,input:K(e.input),rawResponse:e.rawResponse?S(e.rawResponse,0):void 0,durationMs:e.durationMs,status:e.status,streaming:e.streaming,firstTokenMs:e.firstTokenMs,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:o,parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...a?{_telemetry:a}:{}},tags:n.tags,spanType:e.spanType,name:e.name};return $(e.provider,e.model,e.durationMs,e.status),t.enqueue(u),o}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));return}}function I(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping error capture");return}let n=_(),r=g(),o=R(),a={provider:e.provider,model:e.model,input:K(e.input),durationMs:e.durationMs,status:"error",errorMessage:e.error.message,streaming:e.streaming,sessionId:n.sessionId,userId:n.userId,traceId:r?.traceId,spanId:v(),parentSpanId:r?.currentSpanId,metadata:{...n.metadata,...e.metadata,...r?{_traceName:r.name}:{},...o?{_telemetry:o}:{}},tags:n.tags};$(e.provider,e.model,e.durationMs,"error"),m("Error details",{message:e.error.message,stack:e.error.stack}),t.enqueue(a);}catch(t){E(e.provider,t instanceof Error?t:new Error(String(t)));}}function N(e){try{let t=k();if(!t.isEnabled()){m("Transport disabled, skipping span capture");return}let n=_(),r=g(),o=e.metadata?._traceId,a=e.metadata?._parentSpanId,u=R(),c={...n.metadata,...e.metadata,...u?{_telemetry:u}:{}};delete c._traceId,delete c._parentSpanId;let d={spanType:e.type,name:e.name,provider:"unknown",model:e.name,input:K(e.input),output:S(e.output,0),durationMs:e.durationMs,status:e.status||"success",errorMessage:e.errorMessage,streaming:!1,sessionId:n.sessionId,userId:n.userId,traceId:o??r?.traceId,spanId:v(),parentSpanId:a??r?.currentSpanId,toolCallId:e.toolCallId,metadata:c,tags:n.tags};m(`Span captured: ${e.type}/${e.name}`,{durationMs:e.durationMs}),t.enqueue(d);}catch(t){E("unknown",t instanceof Error?t:new Error(String(t)));}}var ne=1e5,Ce=["api_key","apikey","password","secret","authorization"],Ee=["access_token","auth_token","bearer_token","refresh_token","id_token","session_token"],Me=["inputtokens","outputtokens","totaltokens","prompttokens","completiontokens","cachereadtokens","cachewritetokens","cachereadinputtokens","cachewriteinputtokens","reasoningtokens"];function Re(e){let t=e.toLowerCase();return Me.includes(t)?false:!!(Ce.some(n=>t.includes(n))||Ee.some(n=>t.includes(n)))}function K(e){return S(e,0)}function S(e,t){if(t>10)return "[max depth exceeded]";if(e==null)return e;if(typeof e=="string")return e.length>ne?e.slice(0,ne)+"...[truncated]":e;if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>S(n,t+1));if(typeof e=="object"){let n={};for(let[r,o]of Object.entries(e))Re(r)?n[r]="[REDACTED]":n[r]=S(o,t+1);return n}return String(e)}var oe=new AsyncLocalStorage;function v(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function g(){return oe.getStore()}function A(e,t){let n=g();if(n)for(let r of e)n.pendingToolCalls.set(r,t),m(`Registered tool call ${r} \u2192 LLM span ${t}`);}function Ae(e){let t=g();if(t)return e&&t.pendingToolCalls.has(e)?t.pendingToolCalls.get(e):t.currentSpanId}function qe(e){let t=g();t&&t.pendingToolCalls.delete(e);}async function $e(e,t){let n=typeof e=="string"?{name:e}:e,r=g(),o=r?.traceId??v(),a=v(),u={traceId:o,rootSpanId:a,currentSpanId:a,parentSpanId:r?.currentSpanId,name:n.name,startTime:Date.now(),input:n.input,metadata:n.metadata,tags:n.tags,pendingToolCalls:new Map};return oe.run(u,async()=>{let c,d;try{return c=await t(),c}catch(s){throw d=s instanceof Error?s:new Error(String(s)),s}finally{je(u,d?void 0:c,d);}})}function je(e,t,n){let r=k();if(!r.isEnabled()){m("Transport disabled, skipping root span");return}let o=_(),a=Date.now()-e.startTime,u=n?null:t,c={spanType:"agent",name:e.name,provider:"agent",model:e.name,traceId:e.traceId,spanId:e.rootSpanId,parentSpanId:e.parentSpanId,input:e.input,output:u,inputTokens:0,outputTokens:0,durationMs:a,status:n?"error":"success",errorMessage:n?.message,streaming:false,sessionId:o.sessionId,userId:o.userId,metadata:{...o.metadata,...e.metadata},tags:e.tags??o.tags};m(`Sending root span: ${e.name}`,{durationMs:a,hasError:!!n}),r.enqueue(c);}function Pe(e){let t=g();if(!t){process.env.NODE_ENV!=="production"&&console.warn("[Lelemon] span() called outside of trace() - span will not be captured");return}let n=Ae(e.toolCallId);N({type:e.type,name:e.name,input:e.input,output:e.output,durationMs:e.durationMs??0,status:e.status??"success",errorMessage:e.errorMessage,toolCallId:e.toolCallId,metadata:{...e.metadata,_traceId:t.traceId,_parentSpanId:n}}),e.toolCallId&&qe(e.toolCallId);}var w="anthropic";function ie(e){if(!e||typeof e!="object")return false;if(e.constructor?.name==="Anthropic")return true;let n=e;return !!(n.messages&&typeof n.messages=="object")}function ae(e){return async function(...n){let r=Date.now(),o=n[0]||{},a=o.stream===true;try{let u=await e(...n);if(a&&Oe(u))return Ke(u,o,r);let c=Date.now()-r,d=u,s=D({provider:w,model:o.model||d.model||"unknown",input:{system:o.system,messages:o.messages},rawResponse:u,durationMs:c,status:"success",streaming:!1});if(s&&d.content){let l=L(d.content);l.length>0&&A(l,s);}return u}catch(u){let c=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:u instanceof Error?u:new Error(String(u)),durationMs:c,streaming:a}),u}}}function ue(e){return function(...n){let r=Date.now(),o=n[0]||{};try{let a=e(...n);return a&&typeof a=="object"?Ne(a,o,r):a}catch(a){let u=Date.now()-r;throw I({provider:w,model:o.model||"unknown",input:{system:o.system,messages:o.messages},error:a instanceof Error?a:new Error(String(a)),durationMs:u,streaming:true}),a}}}function Oe(e){return e!=null&&typeof e[Symbol.asyncIterator]=="function"}function Ne(e,t,n){let r=e;if(!r[Symbol.asyncIterator])return e;let o={content:[],usage:{input_tokens:0,output_tokens:0}},a=false,u,c=false,d=null,s=[],l=async function*(){try{for await(let i of r){if(i.type==="message_start"&&i.message&&(o.model=i.message.model,o.id=i.message.id,o.role=i.message.role,i.message.usage&&(o.usage={...i.message.usage})),i.type==="content_block_start"&&i.content_block&&(d=i.index??s.length,s[d]={...i.content_block},i.content_block.type==="text"&&(s[d].text=""),i.content_block.type==="thinking"&&(s[d].thinking="")),i.type==="content_block_delta"&&i.delta&&d!==null){let p=s[d];p&&(i.delta.text&&(c||(c=!0,u=Date.now()-n),p.type==="thinking"?p.thinking=(p.thinking||"")+i.delta.text:p.type==="text"&&(p.text=(p.text||"")+i.delta.text)),i.delta.partial_json&&p.type==="tool_use"&&(p._inputJson=(p._inputJson||"")+i.delta.partial_json));}if(i.type==="content_block_stop"&&d!==null){let p=s[d];if(p&&p.type==="tool_use"){let b=p._inputJson;if(b){try{p.input=JSON.parse(b);}catch{}delete p._inputJson;}}d=null;}i.type==="message_delta"&&(i.usage?.output_tokens&&(o.usage.output_tokens=i.usage.output_tokens),i.delta?.stop_reason&&(o.stop_reason=i.delta.stop_reason)),yield i;}}catch(i){if(!a){a=true;let p=Date.now()-n;I({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:i instanceof Error?i:new Error(String(i)),durationMs:p,streaming:true});}throw i}finally{if(!a){a=true;let i=Date.now()-n;o.content=s.filter(Boolean);let p=D({provider:w,model:o.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:o,durationMs:i,status:"success",streaming:true,firstTokenMs:u});if(p&&o.content){let b=L(o.content);b.length>0&&A(b,p);}}}};return new Proxy(e,{get(i,p,b){return p===Symbol.asyncIterator?()=>l()[Symbol.asyncIterator]():Reflect.get(i,p,b)}})}async function*Ke(e,t,n){let r={content:[],usage:{input_tokens:0,output_tokens:0}},o=null,a,u=false,c=null,d=[];try{for await(let s of e){if(s.type==="message_start"&&s.message&&(r.model=s.message.model,r.id=s.message.id,r.role=s.message.role,s.message.usage&&(r.usage={...s.message.usage})),s.type==="content_block_start"&&s.content_block&&(c=s.index??d.length,d[c]={...s.content_block},s.content_block.type==="text"&&(d[c].text=""),s.content_block.type==="thinking"&&(d[c].thinking="")),s.type==="content_block_delta"&&s.delta&&c!==null){let l=d[c];l&&(s.delta.text&&(u||(u=!0,a=Date.now()-n),l.type==="thinking"?l.thinking=(l.thinking||"")+s.delta.text:l.type==="text"&&(l.text=(l.text||"")+s.delta.text)),s.delta.partial_json&&l.type==="tool_use"&&(l._inputJson=(l._inputJson||"")+s.delta.partial_json));}if(s.type==="content_block_stop"&&c!==null){let l=d[c];if(l&&l.type==="tool_use"){let i=l._inputJson;if(i){try{l.input=JSON.parse(i);}catch{}delete l._inputJson;}}c=null;}s.type==="message_delta"&&(s.usage?.output_tokens&&(r.usage.output_tokens=s.usage.output_tokens),s.delta?.stop_reason&&(r.stop_reason=s.delta.stop_reason)),yield s;}}catch(s){throw o=s instanceof Error?s:new Error(String(s)),s}finally{let s=Date.now()-n;if(r.content=d.filter(Boolean),o)I({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},error:o,durationMs:s,streaming:true});else {let l=D({provider:w,model:r.model||t.model||"unknown",input:{system:t.system,messages:t.messages},rawResponse:r,durationMs:s,status:"success",streaming:true,firstTokenMs:a});if(l&&r.content){let i=L(r.content);i.length>0&&A(i,l);}}}}function L(e){let t=[];for(let n of e)n.type==="tool_use"&&n.id&&t.push(n.id);return t}function bt(e,t){return t&&se(t),ee().disabled?(m("Tracing disabled, returning unwrapped client"),e):ie(e)?(z("anthropic"),Be(e)):(C("Client is not an Anthropic client. Use @lelemondev/sdk/anthropic only with Anthropic SDK."),e)}function Be(e){let t=e;return new Proxy(t,{get(n,r,o){let a=Reflect.get(n,r,o);return r==="messages"&&a&&typeof a=="object"?Je(a):a}})}function Je(e){return new Proxy(e,{get(t,n,r){let o=Reflect.get(t,n,r);return n==="create"&&typeof o=="function"?ae(o.bind(t)):n==="stream"&&typeof o=="function"?ue(o.bind(t)):o}})}
|
|
3
3
|
export{N as captureSpan,_e as flush,g as getTraceContext,xe as init,Se as isEnabled,bt as observe,Pe as span,$e as trace};//# sourceMappingURL=anthropic.mjs.map
|
|
4
4
|
//# sourceMappingURL=anthropic.mjs.map
|
package/dist/bedrock.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ObserveOptions } from './
|
|
2
|
-
export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './
|
|
1
|
+
import { O as ObserveOptions } from './capture-BJnZrkYl.mjs';
|
|
2
|
+
export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* AWS Bedrock Provider Entry Point
|
package/dist/bedrock.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ObserveOptions } from './
|
|
2
|
-
export { CaptureSpanOptions, LelemonConfig, SpanOptions, SpanType, TraceContext, TraceOptions, captureSpan, flush, getTraceContext, init, isEnabled, span, trace } from './
|
|
1
|
+
import { O as ObserveOptions } from './capture-BJnZrkYl.js';
|
|
2
|
+
export { C as CaptureSpanOptions, L as LelemonConfig, h as SpanOptions, d as SpanType, T as TraceContext, e as TraceOptions, c as captureSpan, f as flush, g as getTraceContext, i as init, a as isEnabled, s as span, t as trace } from './capture-BJnZrkYl.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* AWS Bedrock Provider Entry Point
|