agentlens-sdk-js 1.0.1

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { redactPayload, SDK_VERSION } from "../index";
3
+ describe("AgentLens SDK", () => {
4
+ describe("redactPayload", () => {
5
+ it("should redact specified fields", () => {
6
+ const payload = {
7
+ apiKey: "secret",
8
+ userName: "john",
9
+ data: "public",
10
+ };
11
+ const redacted = redactPayload(payload, ["apiKey", "userName"]);
12
+ expect(redacted.apiKey).toBe("[REDACTED]");
13
+ expect(redacted.userName).toBe("[REDACTED]");
14
+ expect(redacted.data).toBe("public");
15
+ });
16
+ it("should handle nested objects", () => {
17
+ const payload = {
18
+ user: {
19
+ password: "secret123",
20
+ name: "john",
21
+ },
22
+ config: {
23
+ apiSecret: "confidential",
24
+ },
25
+ };
26
+ const redacted = redactPayload(payload, ["password", "apiSecret"]);
27
+ expect(redacted.user.password).toBe("[REDACTED]");
28
+ expect(redacted.user.name).toBe("john");
29
+ expect(redacted.config.apiSecret).toBe("[REDACTED]");
30
+ });
31
+ it("should return original payload if no redact fields specified", () => {
32
+ const payload = { foo: "bar", baz: "qux" };
33
+ const redacted = redactPayload(payload, []);
34
+ expect(redacted).toEqual(payload);
35
+ });
36
+ it("should handle case-insensitive field matching", () => {
37
+ const payload = {
38
+ ApiKey: "secret",
39
+ PASSWORD: "confidential",
40
+ };
41
+ const redacted = redactPayload(payload, ["apikey", "password"]);
42
+ expect(redacted.ApiKey).toBe("[REDACTED]");
43
+ expect(redacted.PASSWORD).toBe("[REDACTED]");
44
+ });
45
+ it("should not mutate original payload", () => {
46
+ const payload = { secret: "value", data: "safe" };
47
+ const original = JSON.parse(JSON.stringify(payload));
48
+ redactPayload(payload, ["secret"]);
49
+ expect(payload).toEqual(original);
50
+ });
51
+ });
52
+ describe("SDK_VERSION", () => {
53
+ it("should export SDK version", () => {
54
+ expect(SDK_VERSION).toBe("1.0.0");
55
+ expect(typeof SDK_VERSION).toBe("string");
56
+ });
57
+ });
58
+ });
59
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sender.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sender.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,95 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { createSender } from "../sender";
3
+ describe("Sender", () => {
4
+ beforeEach(() => {
5
+ vi.clearAllMocks();
6
+ global.fetch = vi.fn();
7
+ });
8
+ describe("createSender", () => {
9
+ it("should create a sender function", () => {
10
+ const sender = createSender({ apiKey: "test_key" });
11
+ expect(typeof sender).toBe("function");
12
+ });
13
+ it("should send trace with correct headers", async () => {
14
+ const mockFetch = vi.mocked(global.fetch);
15
+ mockFetch.mockResolvedValueOnce({ ok: true, status: 200 });
16
+ const sender = createSender({ apiKey: "test_key" });
17
+ const event = {
18
+ traceId: "trace123",
19
+ provider: "anthropic",
20
+ model: "claude-3-sonnet",
21
+ request: { messages: [] },
22
+ response: { content: [] },
23
+ status: "success",
24
+ latencyMs: 100,
25
+ timestamp: new Date().toISOString(),
26
+ };
27
+ await new Promise((resolve) => {
28
+ sender(event);
29
+ setTimeout(resolve, 50);
30
+ });
31
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
32
+ method: "POST",
33
+ headers: expect.objectContaining({
34
+ "Content-Type": "application/json",
35
+ "x-api-key": "test_key",
36
+ }),
37
+ }));
38
+ });
39
+ it("should include project_api_key in payload", async () => {
40
+ const mockFetch = vi.mocked(global.fetch);
41
+ mockFetch.mockResolvedValueOnce({ ok: true });
42
+ const sender = createSender({ apiKey: "secret_key" });
43
+ const event = {
44
+ traceId: "trace123",
45
+ provider: "openai",
46
+ model: "gpt-4",
47
+ request: { messages: [] },
48
+ status: "success",
49
+ latencyMs: 50,
50
+ timestamp: new Date().toISOString(),
51
+ };
52
+ await new Promise((resolve) => {
53
+ sender(event);
54
+ setTimeout(resolve, 50);
55
+ });
56
+ const callArgs = mockFetch.mock.calls[0];
57
+ const body = JSON.parse(callArgs[1]?.body);
58
+ expect(body.project_api_key).toBe("secret_key");
59
+ });
60
+ it("should not send if disabled", async () => {
61
+ const mockFetch = vi.mocked(global.fetch);
62
+ const sender = createSender({ apiKey: "test_key", disabled: true });
63
+ const event = {
64
+ traceId: "trace123",
65
+ provider: "anthropic",
66
+ model: "claude",
67
+ request: {},
68
+ status: "success",
69
+ latencyMs: 100,
70
+ timestamp: new Date().toISOString(),
71
+ };
72
+ await sender(event);
73
+ expect(mockFetch).not.toHaveBeenCalled();
74
+ });
75
+ it("should handle network errors gracefully", async () => {
76
+ const mockFetch = vi.mocked(global.fetch);
77
+ mockFetch.mockRejectedValueOnce(new Error("Network error"));
78
+ const sender = createSender({ apiKey: "test_key" });
79
+ const event = {
80
+ traceId: "trace123",
81
+ provider: "anthropic",
82
+ model: "claude",
83
+ request: {},
84
+ status: "success",
85
+ latencyMs: 100,
86
+ timestamp: new Date().toISOString(),
87
+ };
88
+ await expect(new Promise((resolve) => {
89
+ sender(event);
90
+ setTimeout(resolve, 50);
91
+ })).resolves.toBeUndefined();
92
+ });
93
+ });
94
+ });
95
+ //# sourceMappingURL=sender.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.test.js","sourceRoot":"","sources":["../../src/__tests__/sender.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export { wrapAnthropic } from "./wrappers/anthropic";
2
+ export { wrapOpenAI } from "./wrappers/openai";
3
+ export { wrapGemini } from "./wrappers/gemini";
4
+ export interface AgentLensConfig {
5
+ apiKey: string;
6
+ endpoint?: string;
7
+ redactFields?: string[];
8
+ batchSize?: number;
9
+ flushInterval?: number;
10
+ maxRetries?: number;
11
+ retryDelay?: number;
12
+ }
13
+ export interface SDKOptions extends AgentLensConfig {
14
+ }
15
+ export declare const SDK_VERSION = "1.0.0";
16
+ export declare function redactPayload(payload: any, redactFields?: string[]): any;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe;CAAG;AAEtD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,wBAAgB,aAAa,CAC3B,OAAO,EAAE,GAAG,EACZ,YAAY,GAAE,MAAM,EAAO,GAC1B,GAAG,CAmBL"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ export { wrapAnthropic } from "./wrappers/anthropic";
2
+ export { wrapOpenAI } from "./wrappers/openai";
3
+ export { wrapGemini } from "./wrappers/gemini";
4
+ export const SDK_VERSION = "1.0.0";
5
+ export function redactPayload(payload, redactFields = []) {
6
+ if (!redactFields.length)
7
+ return payload;
8
+ const redacted = JSON.parse(JSON.stringify(payload));
9
+ function redactValue(obj, fields) {
10
+ if (!obj || typeof obj !== "object")
11
+ return;
12
+ for (const key in obj) {
13
+ if (fields.some((f) => key.toLowerCase().includes(f.toLowerCase()))) {
14
+ obj[key] = "[REDACTED]";
15
+ }
16
+ else if (typeof obj[key] === "object") {
17
+ redactValue(obj[key], fields);
18
+ }
19
+ }
20
+ }
21
+ redactValue(redacted, redactFields);
22
+ return redacted;
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc/C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,UAAU,aAAa,CAC3B,OAAY,EACZ,eAAyB,EAAE;IAE3B,IAAI,CAAC,YAAY,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAErD,SAAS,WAAW,CAAC,GAAQ,EAAE,MAAgB;QAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO;QAE5C,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentLensConfig, TraceEvent } from "./types.js";
2
+ export declare function createSender(config: AgentLensConfig): (event: Omit<TraceEvent, "sdkVersion" | "projectApiKey">) => Promise<void>;
3
+ //# sourceMappingURL=sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../src/sender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,IACvB,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,eAAe,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CA2CnG"}
package/dist/sender.js ADDED
@@ -0,0 +1,47 @@
1
+ const DEFAULT_ENDPOINT = "https://ingest.agentlens.dev/v1/traces";
2
+ const SDK_VERSION = "1.0.0";
3
+ export function createSender(config) {
4
+ return async function send(event) {
5
+ const endpoint = config.endpoint ?? (process.env.NODE_ENV === "production" ? DEFAULT_ENDPOINT : "http://localhost:3002/ingest");
6
+ console.log(`[AgentLens SDK] Attempting to send trace ${event.traceId} to ${endpoint}`);
7
+ if (config.disabled)
8
+ return;
9
+ const payload = {
10
+ trace_id: event.traceId,
11
+ parent_trace_id: event.parentTraceId,
12
+ provider: event.provider,
13
+ model: event.model,
14
+ request: event.request,
15
+ response: event.response,
16
+ usage: event.usage ? {
17
+ input_tokens: event.usage.promptTokens,
18
+ output_tokens: event.usage.completionTokens,
19
+ total_tokens: event.usage.totalTokens,
20
+ } : undefined,
21
+ cost_usd: event.costUsd,
22
+ latency_ms: event.latencyMs,
23
+ status: event.status,
24
+ error: event.error,
25
+ metadata: event.metadata,
26
+ timestamp: event.timestamp,
27
+ sdk_version: SDK_VERSION,
28
+ project_api_key: config.apiKey,
29
+ };
30
+ // Fire-and-forget: never block the calling app
31
+ fetch(endpoint, {
32
+ method: "POST",
33
+ headers: { "Content-Type": "application/json", "x-api-key": config.apiKey },
34
+ body: JSON.stringify(payload),
35
+ }).then(res => {
36
+ if (!res.ok) {
37
+ console.warn(`[AgentLens SDK] Failed to send trace: ${res.status} ${res.statusText}`);
38
+ }
39
+ else {
40
+ console.log(`[AgentLens SDK] Trace ${event.traceId} sent successfully`);
41
+ }
42
+ }).catch((err) => {
43
+ console.warn("[AgentLens SDK] Network error sending trace:", err);
44
+ });
45
+ };
46
+ }
47
+ //# sourceMappingURL=sender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.js","sourceRoot":"","sources":["../src/sender.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,wCAAwC,CAAC;AAClE,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,KAAK,UAAU,IAAI,CAAC,KAAuD;QAChF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAChI,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,CAAC,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC;QAExF,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO;QAE5B,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,eAAe,EAAE,KAAK,CAAC,aAAa;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY;gBACtC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB;gBAC3C,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;aACtC,CAAC,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,UAAU,EAAE,KAAK,CAAC,SAAS;YAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,WAAW;YACxB,eAAe,EAAE,MAAM,CAAC,MAAM;SAC/B,CAAC;QAEF,+CAA+C;QAC/C,KAAK,CAAC,QAAQ,EAAE;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;YAC3E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yCAAyC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface AgentLensConfig {
2
+ apiKey: string;
3
+ endpoint?: string;
4
+ redactFields?: string[];
5
+ metadata?: Record<string, string>;
6
+ disabled?: boolean;
7
+ }
8
+ export interface TraceEvent {
9
+ sdkVersion: string;
10
+ projectApiKey: string;
11
+ traceId: string;
12
+ parentTraceId?: string | undefined;
13
+ provider: "openai" | "anthropic" | "gemini" | "other";
14
+ model: string;
15
+ request: unknown;
16
+ response?: unknown | undefined;
17
+ usage?: {
18
+ promptTokens?: number | undefined;
19
+ completionTokens?: number | undefined;
20
+ totalTokens?: number | undefined;
21
+ } | undefined;
22
+ costUsd?: number | undefined;
23
+ latencyMs: number;
24
+ status: "success" | "error" | "timeout";
25
+ error?: {
26
+ type: string;
27
+ message: string;
28
+ } | undefined;
29
+ metadata?: Record<string, string> | undefined;
30
+ timestamp: string;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAClC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,GAAG,SAAS,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type Anthropic from "@anthropic-ai/sdk";
2
+ import type { AgentLensConfig } from "../types.js";
3
+ export declare function wrapAnthropic(client: Anthropic, config: AgentLensConfig): Anthropic;
4
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/wrappers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgBnD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAqDnF"}
@@ -0,0 +1,62 @@
1
+ import { randomUUID } from "crypto";
2
+ import { createSender } from "../sender.js";
3
+ const ANTHROPIC_COST = {
4
+ "claude-opus-4-7": { input: 15, output: 75 },
5
+ "claude-sonnet-4-6": { input: 3, output: 15 },
6
+ "claude-haiku-4-5-20251001": { input: 0.8, output: 4 },
7
+ };
8
+ function estimateCost(model, inputTokens, outputTokens) {
9
+ const key = Object.keys(ANTHROPIC_COST).find((k) => model.includes(k));
10
+ const pricing = key ? ANTHROPIC_COST[key] : undefined;
11
+ if (!pricing)
12
+ return undefined;
13
+ return (inputTokens / 1000000) * pricing.input + (outputTokens / 1000000) * pricing.output;
14
+ }
15
+ export function wrapAnthropic(client, config) {
16
+ const send = createSender(config);
17
+ const originalCreate = client.messages.create.bind(client.messages);
18
+ // @ts-expect-error — proxy overload signatures
19
+ client.messages.create = async function (params, options) {
20
+ const traceId = randomUUID();
21
+ const start = Date.now();
22
+ try {
23
+ const response = await originalCreate(params, options);
24
+ const latencyMs = Date.now() - start;
25
+ const inputTokens = response.usage.input_tokens;
26
+ const outputTokens = response.usage.output_tokens;
27
+ send({
28
+ traceId,
29
+ parentTraceId: config.metadata?.["parentTraceId"],
30
+ provider: "anthropic",
31
+ model: params.model,
32
+ request: params,
33
+ response,
34
+ usage: { promptTokens: inputTokens, completionTokens: outputTokens, totalTokens: inputTokens + outputTokens },
35
+ costUsd: estimateCost(params.model, inputTokens, outputTokens),
36
+ latencyMs,
37
+ status: "success",
38
+ metadata: config.metadata,
39
+ timestamp: new Date().toISOString(),
40
+ });
41
+ return response;
42
+ }
43
+ catch (err) {
44
+ const latencyMs = Date.now() - start;
45
+ const error = err;
46
+ send({
47
+ traceId,
48
+ provider: "anthropic",
49
+ model: params.model,
50
+ request: params,
51
+ latencyMs,
52
+ status: "error",
53
+ error: { type: error.constructor.name, message: error.message },
54
+ metadata: config.metadata,
55
+ timestamp: new Date().toISOString(),
56
+ });
57
+ throw err;
58
+ }
59
+ };
60
+ return client;
61
+ }
62
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/wrappers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GoogleGenerativeAI } from "@google/generative-ai";
2
+ import type { AgentLensConfig } from "../types.js";
3
+ export declare function wrapGemini(genAI: GoogleGenerativeAI, config: AgentLensConfig): GoogleGenerativeAI;
4
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/wrappers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAkE,MAAM,uBAAuB,CAAC;AAChI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAsBnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,eAAe,GAAG,kBAAkB,CA+DjG"}
@@ -0,0 +1,76 @@
1
+ import { randomUUID } from "crypto";
2
+ import { createSender } from "../sender.js";
3
+ const GEMINI_COST = {
4
+ "gemini-2.0-flash": { input: 0.1, output: 0.4 },
5
+ "gemini-1.5-pro": { input: 1.25, output: 5.0 },
6
+ "gemini-1.5-flash": { input: 0.075, output: 0.3 },
7
+ "gemini-1.5-flash-8b": { input: 0.0375, output: 0.15 },
8
+ "gemini-1.0-pro": { input: 0.5, output: 1.5 },
9
+ "gemini-2.0-pro": { input: 1.25, output: 5.0 },
10
+ "gemini-3.1-flash-lite": { input: 0.075, output: 0.3 }, // Estimating same as 1.5 flash for now
11
+ "gemini-2.0-flash-lite": { input: 0.075, output: 0.3 },
12
+ "gemma": { input: 0.1, output: 0.1 }, // Standard Gemma pricing
13
+ };
14
+ function estimateCost(model, promptTokens, outputTokens) {
15
+ const key = Object.keys(GEMINI_COST).find((k) => model.includes(k));
16
+ const pricing = key ? GEMINI_COST[key] : undefined;
17
+ if (!pricing)
18
+ return undefined;
19
+ return (promptTokens / 1000000) * pricing.input + (outputTokens / 1000000) * pricing.output;
20
+ }
21
+ export function wrapGemini(genAI, config) {
22
+ const send = createSender(config);
23
+ const originalGetModel = genAI.getGenerativeModel.bind(genAI);
24
+ genAI.getGenerativeModel = function (request) {
25
+ const modelName = typeof request === "object" ? request.model || "unknown" : "unknown";
26
+ console.log(`[AgentLens SDK] Intercepting getGenerativeModel for ${modelName}`);
27
+ const model = originalGetModel(request);
28
+ const originalGenerateContent = model.generateContent.bind(model);
29
+ model.generateContent = async function (contentRequest) {
30
+ console.log(`[AgentLens SDK] Intercepting generateContent for ${modelName}`);
31
+ const traceId = randomUUID();
32
+ const start = Date.now();
33
+ try {
34
+ const response = (await originalGenerateContent(contentRequest));
35
+ const latencyMs = Date.now() - start;
36
+ const usage = response.usageMetadata || response.response?.usageMetadata || {};
37
+ const promptTokens = usage.promptTokenCount ?? usage.prompt_token_count ?? 0;
38
+ const completionTokens = usage.candidatesTokenCount ?? usage.candidates_token_count ?? usage.completion_token_count ?? 0;
39
+ send({
40
+ traceId,
41
+ parentTraceId: config.metadata?.["parentTraceId"],
42
+ provider: "gemini",
43
+ model: modelName,
44
+ request: contentRequest,
45
+ response,
46
+ usage: { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens },
47
+ costUsd: estimateCost(modelName, promptTokens, completionTokens),
48
+ latencyMs,
49
+ status: "success",
50
+ metadata: config.metadata,
51
+ timestamp: new Date().toISOString(),
52
+ });
53
+ return response;
54
+ }
55
+ catch (err) {
56
+ const latencyMs = Date.now() - start;
57
+ const error = err;
58
+ send({
59
+ traceId,
60
+ provider: "gemini",
61
+ model: modelName,
62
+ request: contentRequest,
63
+ latencyMs,
64
+ status: "error",
65
+ error: { type: error.constructor.name, message: error.message },
66
+ metadata: config.metadata,
67
+ timestamp: new Date().toISOString(),
68
+ });
69
+ throw err;
70
+ }
71
+ };
72
+ return model;
73
+ };
74
+ return genAI;
75
+ }
76
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/wrappers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type OpenAI from "openai";
2
+ import type { AgentLensConfig } from "../types.js";
3
+ export declare function wrapOpenAI(client: OpenAI, config: AgentLensConfig): OpenAI;
4
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/wrappers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiBnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAqD1E"}
@@ -0,0 +1,63 @@
1
+ import { randomUUID } from "crypto";
2
+ import { createSender } from "../sender.js";
3
+ // Cost per 1M tokens (USD) — update as pricing changes
4
+ const OPENAI_COST = {
5
+ "gpt-4o": { input: 2.5, output: 10 },
6
+ "gpt-4o-mini": { input: 0.15, output: 0.6 },
7
+ "gpt-4-turbo": { input: 10, output: 30 },
8
+ "gpt-3.5-turbo": { input: 0.5, output: 1.5 },
9
+ };
10
+ function estimateCost(model, promptTokens, completionTokens) {
11
+ const pricing = OPENAI_COST[model];
12
+ if (!pricing)
13
+ return undefined;
14
+ return (promptTokens / 1000000) * pricing.input + (completionTokens / 1000000) * pricing.output;
15
+ }
16
+ export function wrapOpenAI(client, config) {
17
+ const send = createSender(config);
18
+ const originalCreate = client.chat.completions.create.bind(client.chat.completions);
19
+ // @ts-expect-error — proxy overload signatures
20
+ client.chat.completions.create = async function (params, options) {
21
+ const traceId = randomUUID();
22
+ const start = Date.now();
23
+ try {
24
+ const response = await originalCreate(params, options);
25
+ const latencyMs = Date.now() - start;
26
+ const promptTokens = response.usage?.prompt_tokens ?? 0;
27
+ const completionTokens = response.usage?.completion_tokens ?? 0;
28
+ send({
29
+ traceId,
30
+ parentTraceId: config.metadata?.["parentTraceId"],
31
+ provider: "openai",
32
+ model: params.model,
33
+ request: params,
34
+ response,
35
+ usage: { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens },
36
+ costUsd: estimateCost(params.model, promptTokens, completionTokens),
37
+ latencyMs,
38
+ status: "success",
39
+ metadata: config.metadata,
40
+ timestamp: new Date().toISOString(),
41
+ });
42
+ return response;
43
+ }
44
+ catch (err) {
45
+ const latencyMs = Date.now() - start;
46
+ const error = err;
47
+ send({
48
+ traceId,
49
+ provider: "openai",
50
+ model: params.model,
51
+ request: params,
52
+ latencyMs,
53
+ status: "error",
54
+ error: { type: error.constructor.name, message: error.message },
55
+ metadata: config.metadata,
56
+ timestamp: new Date().toISOString(),
57
+ });
58
+ throw err;
59
+ }
60
+ };
61
+ return client;
62
+ }
63
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/wrappers/openai.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "agentlens-sdk-js",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ },
12
+ "./anthropic": {
13
+ "types": "./dist/wrappers/anthropic.d.ts",
14
+ "import": "./dist/wrappers/anthropic.js"
15
+ },
16
+ "./openai": {
17
+ "types": "./dist/wrappers/openai.d.ts",
18
+ "import": "./dist/wrappers/openai.js"
19
+ },
20
+ "./gemini": {
21
+ "types": "./dist/wrappers/gemini.d.ts",
22
+ "import": "./dist/wrappers/gemini.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "dev": "tsc --watch",
30
+ "type-check": "tsc --noEmit",
31
+ "build": "tsc",
32
+ "test": "vitest",
33
+ "test:ui": "vitest --ui",
34
+ "prepublishOnly": "pnpm run build && pnpm run test"
35
+ },
36
+ "peerDependencies": {
37
+ "@anthropic-ai/sdk": "^0.20.0 || ^0.21.0",
38
+ "@google/generative-ai": "^0.24.1",
39
+ "openai": "^4.0.0"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "@anthropic-ai/sdk": {
43
+ "optional": true
44
+ },
45
+ "openai": {
46
+ "optional": true
47
+ },
48
+ "@google/generative-ai": {
49
+ "optional": true
50
+ }
51
+ },
52
+ "dependencies": {
53
+ "@agentlens/shared": "workspace:*",
54
+ "uuid": "^9.0.0"
55
+ },
56
+ "devDependencies": {
57
+ "@google/generative-ai": "^0.24.1",
58
+ "@types/node": "^20.0.0",
59
+ "@types/uuid": "^9.0.0",
60
+ "happy-dom": "^20.9.0",
61
+ "typescript": "^5.0.0",
62
+ "vite": "^8.0.13",
63
+ "vitest": "^4.1.6"
64
+ },
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "https://github.com/mukeshkr123/agentLens"
68
+ },
69
+ "keywords": [
70
+ "ai",
71
+ "agent",
72
+ "monitoring",
73
+ "observability",
74
+ "llm",
75
+ "trace",
76
+ "sentry"
77
+ ],
78
+ "author": "AgentLens",
79
+ "license": "MIT"
80
+ }