@farzanhossans/agentlens 0.2.0
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 +151 -0
- package/dist/index.d.mts +59 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.js +1103 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1082 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/streaming/sse.ts","../src/interceptors/fetch.ts","../src/interceptors/https.ts","../src/parsers/anthropic.ts","../src/parsers/cohere.ts","../src/parsers/gemini.ts","../src/parsers/mistral.ts","../src/parsers/openai.ts","../src/parsers/index.ts","../src/pii/scrubber.ts","../src/transport.ts","../src/index.ts"],"names":["transport","lookupCost","extractInputText","extractOutputText","randomUUID","getCurrentTraceId"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LLMEndpoint } from './types'\n\nexport const LLM_REGISTRY: Record<string, LLMEndpoint> = {\n 'api.openai.com': {\n provider: 'openai',\n parser: 'openai',\n paths: ['/v1/chat/completions', '/v1/completions', '/v1/embeddings'],\n },\n 'api.anthropic.com': {\n provider: 'anthropic',\n parser: 'anthropic',\n paths: ['/v1/messages'],\n },\n 'generativelanguage.googleapis.com': {\n provider: 'gemini',\n parser: 'gemini',\n paths: ['/v1beta/models', '/v1/models'],\n },\n 'api.cohere.com': {\n provider: 'cohere',\n parser: 'cohere',\n paths: ['/v1/chat', '/v1/generate', '/v2/chat'],\n },\n 'api.mistral.ai': {\n provider: 'mistral',\n parser: 'mistral',\n paths: ['/v1/chat/completions'],\n },\n}\n\nexport function matchLLM(url: string): LLMEndpoint | null {\n try {\n const parsed = new URL(url)\n const entry = LLM_REGISTRY[parsed.hostname]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => parsed.pathname.startsWith(p))\n return pathMatch ? entry : null\n } catch {\n return null\n }\n}\n\nexport function matchHostPath(host: string, path: string): LLMEndpoint | null {\n const entry = LLM_REGISTRY[host]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => path.startsWith(p))\n return pathMatch ? entry : null\n}\n","import type { LLMEndpoint, ParserName } from '../types'\nimport type { Transport } from '../transport'\n\n/**\n * Normalized stream parse result. Each per-provider parser extracts the\n * provider's native event shape into this common form so the synthesizer\n * can rebuild the right non-streaming response shape per provider.\n */\ninterface ParsedStream {\n outputText: string\n inputTokens: number\n outputTokens: number\n}\n\nexport async function captureSSEStream(\n stream: ReadableStream<Uint8Array>,\n ctx: {\n llm: LLMEndpoint\n requestBody: Record<string, unknown> | null\n latency: number\n transport: Transport\n }\n): Promise<void> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let raw = ''\n\n try {\n let done = false\n while (!done) {\n const chunk = await reader.read()\n done = chunk.done\n if (chunk.value) raw += decoder.decode(chunk.value, { stream: true })\n }\n raw += decoder.decode()\n } catch {\n return\n }\n\n const parsed = parseStream(raw, ctx.llm.parser)\n const response = synthesizeResponse(parsed, ctx.llm.parser, ctx.requestBody)\n\n ctx.transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: ctx.requestBody,\n response,\n latency: ctx.latency,\n status: 200,\n isStream: true,\n })\n}\n\nfunction parseStream(raw: string, parser: ParserName): ParsedStream {\n switch (parser) {\n case 'anthropic':\n return parseAnthropicSSE(raw)\n case 'gemini':\n return parseGeminiSSE(raw)\n case 'cohere':\n return parseCohereSSE(raw)\n case 'openai':\n case 'mistral':\n return parseOpenAISSE(raw)\n }\n}\n\nfunction parseOpenAISSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string }; text?: string }>\n usage?: { prompt_tokens?: number; completion_tokens?: number }\n }\n const choice = evt.choices?.[0]\n if (choice?.delta?.content) outputText += choice.delta.content\n else if (typeof choice?.text === 'string') outputText += choice.text\n if (evt.usage) {\n if (typeof evt.usage.prompt_tokens === 'number') inputTokens = evt.usage.prompt_tokens\n if (typeof evt.usage.completion_tokens === 'number') outputTokens = evt.usage.completion_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction parseAnthropicSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n type?: string\n delta?: { type?: string; text?: string }\n message?: { usage?: { input_tokens?: number; output_tokens?: number } }\n usage?: { input_tokens?: number; output_tokens?: number }\n }\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta' && evt.delta.text) {\n outputText += evt.delta.text\n }\n const u = evt.message?.usage ?? evt.usage\n if (u) {\n if (typeof u.input_tokens === 'number') inputTokens = u.input_tokens\n if (typeof u.output_tokens === 'number') outputTokens = u.output_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\n/**\n * Gemini streaming events are an SSE-ish format where each `data: ` line\n * carries a full Gemini response chunk with `candidates[].content.parts[].text`\n * and optional `usageMetadata.{promptTokenCount, candidatesTokenCount}`.\n *\n * Some Gemini endpoints (alt=sse) wrap chunks in `data: `; others emit a\n * JSON array. We handle both: split on newlines, strip `data: ` prefix if\n * present, parse each JSON object.\n */\nfunction parseGeminiSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n const candidates = extractGeminiJsonChunks(raw)\n for (const evt of candidates) {\n const evtCandidates = (evt as { candidates?: Array<{ content?: { parts?: Array<{ text?: unknown }> } }> }).candidates\n if (Array.isArray(evtCandidates)) {\n for (const c of evtCandidates) {\n const parts = c.content?.parts\n if (Array.isArray(parts)) {\n for (const p of parts) {\n if (typeof p.text === 'string') outputText += p.text\n }\n }\n }\n }\n const usage = (evt as { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number } }).usageMetadata\n if (usage) {\n if (typeof usage.promptTokenCount === 'number') inputTokens = usage.promptTokenCount\n if (typeof usage.candidatesTokenCount === 'number') outputTokens = usage.candidatesTokenCount\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction extractGeminiJsonChunks(raw: string): unknown[] {\n const out: unknown[] = []\n // Format 1: SSE `data: {...}` lines\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const body = line.slice(6).trim()\n if (!body || body === '[DONE]') continue\n try {\n out.push(JSON.parse(body))\n } catch {\n continue\n }\n }\n if (out.length > 0) return out\n // Format 2: a single JSON array of chunks\n try {\n const parsed = JSON.parse(raw.trim()) as unknown\n if (Array.isArray(parsed)) return parsed\n if (parsed && typeof parsed === 'object') return [parsed]\n } catch {\n // fall through\n }\n return out\n}\n\n/**\n * Cohere streaming covers two shapes:\n * - v1 (`/v1/chat` with `stream: true`): newline-delimited JSON, each line\n * `{event_type: \"text-generation\", text: \"...\"}` plus a final\n * `{event_type: \"stream-end\", response: {meta: {billed_units: {...}}}}`.\n * - v2 (`/v2/chat`): SSE-style `event: content-delta` / `message-end` with\n * `data: {delta: {message: {content: {text}}}}` and final\n * `data: {delta: {usage: {tokens: {input_tokens, output_tokens}}}}`.\n */\nfunction parseCohereSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const body = trimmed.startsWith('data: ') ? trimmed.slice(6).trim() : trimmed\n if (!body || body === '[DONE]' || body.startsWith('event:')) continue\n let evt: Record<string, unknown>\n try {\n evt = JSON.parse(body) as Record<string, unknown>\n } catch {\n continue\n }\n\n // v1 text-generation event\n if (evt.event_type === 'text-generation' && typeof evt.text === 'string') {\n outputText += evt.text\n }\n // v1 stream-end carries the final response with meta.billed_units\n if (evt.event_type === 'stream-end') {\n const resp = evt.response as\n | { meta?: { billed_units?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const billed = resp?.meta?.billed_units\n if (billed) {\n if (typeof billed.input_tokens === 'number') inputTokens = billed.input_tokens\n if (typeof billed.output_tokens === 'number') outputTokens = billed.output_tokens\n }\n }\n\n // v2 content-delta\n const delta = evt.delta as\n | { message?: { content?: { text?: string } }; usage?: { tokens?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const text = delta?.message?.content?.text\n if (typeof text === 'string') outputText += text\n const tokens = delta?.usage?.tokens\n if (tokens) {\n if (typeof tokens.input_tokens === 'number') inputTokens = tokens.input_tokens\n if (typeof tokens.output_tokens === 'number') outputTokens = tokens.output_tokens\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction synthesizeResponse(\n parsed: ParsedStream,\n parser: ParserName,\n request: Record<string, unknown> | null\n): Record<string, unknown> {\n const model = (request?.model as string) ?? 'unknown'\n switch (parser) {\n case 'anthropic':\n return {\n model,\n content: [{ type: 'text', text: parsed.outputText }],\n usage: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n }\n case 'openai':\n case 'mistral':\n return {\n model,\n choices: [{ message: { content: parsed.outputText, role: 'assistant' } }],\n usage: {\n prompt_tokens: parsed.inputTokens,\n completion_tokens: parsed.outputTokens,\n total_tokens: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'gemini':\n return {\n modelVersion: model,\n candidates: [{ content: { parts: [{ text: parsed.outputText }] } }],\n usageMetadata: {\n promptTokenCount: parsed.inputTokens,\n candidatesTokenCount: parsed.outputTokens,\n totalTokenCount: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'cohere':\n // Use v1 meta.billed_units shape — the non-streaming Cohere parser\n // reads meta.billed_units first, then falls back to usage.tokens.\n return {\n text: parsed.outputText,\n meta: {\n billed_units: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n },\n }\n }\n}\n","import { matchLLM } from '../registry'\nimport { captureSSEStream } from '../streaming/sse'\nimport type { Transport } from '../transport'\n\ninterface PatchedFlag {\n __agentlens_patched?: boolean\n}\n\nexport function patchFetch(transport: Transport): void {\n const original = globalThis.fetch\n if (!original) return\n\n // Avoid double-patching\n if ((original as unknown as PatchedFlag).__agentlens_patched) return\n\n // Stash the original so the transport can use it without recursing through us\n ;(globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch = original\n\n const patched: typeof fetch = async (input, init) => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url\n\n const llm = matchLLM(url)\n if (!llm) return original(input, init)\n\n const start = Date.now()\n let requestBody: Record<string, unknown> | null = null\n\n const rawBody = init?.body ?? null\n if (typeof rawBody === 'string') {\n try {\n requestBody = JSON.parse(rawBody) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n } else if (rawBody && rawBody instanceof ArrayBuffer) {\n try {\n const text = new TextDecoder().decode(rawBody)\n requestBody = JSON.parse(text) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n }\n\n const isStream = requestBody?.stream === true\n\n try {\n const response = await original(input, init)\n const latency = Date.now() - start\n\n if (isStream && response.body) {\n const [userStream, ourStream] = response.body.tee()\n // fire-and-forget background read\n void captureSSEStream(ourStream, {\n llm,\n requestBody,\n latency,\n transport,\n })\n return new Response(userStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const clone = response.clone()\n const responseBody = (await clone.json().catch(() => null)) as Record<string, unknown> | null\n if (responseBody) {\n transport.push({\n provider: llm.provider,\n parser: llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: response.status,\n isStream: false,\n })\n }\n return response\n } catch (err) {\n transport.pushError({\n provider: llm.provider,\n request: requestBody,\n error: err instanceof Error ? err.message : String(err),\n latency: Date.now() - start,\n })\n throw err\n }\n }\n\n ;(patched as unknown as PatchedFlag).__agentlens_patched = true\n globalThis.fetch = patched\n}\n","import { matchHostPath } from '../registry'\nimport type { Transport } from '../transport'\nimport type { LLMEndpoint } from '../types'\n\ntype RequestFn = (...args: unknown[]) => unknown\n\ninterface PatchableModule {\n request: RequestFn\n __agentlens_patched?: boolean\n}\n\ninterface RequestOptions {\n host?: string\n hostname?: string\n path?: string\n method?: string\n headers?: Record<string, string>\n}\n\nexport function patchHttps(transport: Transport): void {\n if (typeof process === 'undefined' || typeof require === 'undefined') {\n // Browser / non-Node — nothing to patch\n return\n }\n\n try {\n patchModule('https', transport)\n patchModule('http', transport)\n } catch {\n // require may be unavailable in some bundled environments — just skip\n }\n}\n\nfunction patchModule(name: 'http' | 'https', transport: Transport): void {\n let mod: PatchableModule\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n mod = require(name) as PatchableModule\n } catch {\n return\n }\n if (mod.__agentlens_patched) return\n\n const original: RequestFn = mod.request.bind(mod)\n mod.request = function patchedRequest(...args: unknown[]): unknown {\n const ctx = extractContext(args)\n if (!ctx) return original(...args)\n\n const start = Date.now()\n const requestChunks: Buffer[] = []\n const responseChunks: Buffer[] = []\n\n const req = original(...args) as NodeJS.WritableStream & {\n write: (chunk: unknown, ...rest: unknown[]) => boolean\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n\n const originalWrite = req.write.bind(req)\n req.write = function (chunk: unknown, ...rest: unknown[]): boolean {\n try {\n if (chunk) requestChunks.push(toBuffer(chunk))\n } catch {\n // ignore\n }\n return originalWrite(chunk, ...(rest as []))\n }\n\n req.on('response', (...resArgs: unknown[]) => {\n const res = resArgs[0] as NodeJS.ReadableStream & {\n statusCode?: number\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n res.on('data', (chunk: unknown) => {\n try {\n responseChunks.push(toBuffer(chunk))\n } catch {\n // ignore\n }\n })\n res.on('end', () => {\n const latency = Date.now() - start\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n const responseText = Buffer.concat(responseChunks).toString('utf8')\n const requestBody = safeParse(requestText)\n const responseBody = safeParse(responseText)\n if (responseBody) {\n transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: res.statusCode ?? 0,\n isStream: requestBody?.stream === true,\n })\n }\n })\n })\n\n req.on('error', (...errArgs: unknown[]) => {\n const err = errArgs[0] as Error | undefined\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n transport.pushError({\n provider: ctx.llm.provider,\n request: safeParse(requestText),\n error: err?.message ?? String(err),\n latency: Date.now() - start,\n })\n })\n\n return req\n } as RequestFn\n mod.__agentlens_patched = true\n}\n\ninterface ExtractedCtx {\n llm: LLMEndpoint\n}\n\nfunction extractContext(args: unknown[]): ExtractedCtx | null {\n // Signatures supported:\n // request(url[, options][, callback])\n // request(options[, callback])\n let host: string | undefined\n let path: string | undefined\n\n const first = args[0]\n if (typeof first === 'string') {\n try {\n const u = new URL(first)\n host = u.hostname\n path = u.pathname + u.search\n } catch {\n return null\n }\n } else if (first instanceof URL) {\n host = first.hostname\n path = first.pathname + first.search\n } else if (first && typeof first === 'object') {\n const opts = first as RequestOptions\n host = opts.hostname ?? opts.host\n path = opts.path ?? '/'\n }\n\n if (args.length > 1 && typeof args[1] === 'object' && args[1] !== null && !(args[1] instanceof URL)) {\n const opts = args[1] as RequestOptions\n if (!host) host = opts.hostname ?? opts.host\n if (!path || path === '/') path = opts.path ?? path\n }\n\n if (!host || !path) return null\n // Strip query for path-prefix matching\n const pathOnly = path.split('?')[0]\n const llm = matchHostPath(host, pathOnly)\n if (!llm) return null\n return { llm }\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) return chunk\n if (typeof chunk === 'string') return Buffer.from(chunk)\n if (chunk instanceof Uint8Array) return Buffer.from(chunk)\n return Buffer.from(String(chunk))\n}\n\nfunction safeParse(text: string): Record<string, unknown> | null {\n if (!text) return null\n try {\n return JSON.parse(text) as Record<string, unknown>\n } catch {\n return null\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst ANTHROPIC_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-6': { input: 0.000015, output: 0.000075 },\n 'claude-sonnet-4-6': { input: 0.000003, output: 0.000015 },\n 'claude-haiku-4-5': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-opus': { input: 0.000015, output: 0.000075 },\n 'claude-3-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-haiku': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-5-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-5-haiku': { input: 0.000001, output: 0.000005 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (ANTHROPIC_COSTS[model]) return ANTHROPIC_COSTS[model]\n for (const key of Object.keys(ANTHROPIC_COSTS)) {\n if (model.startsWith(key)) return ANTHROPIC_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const parts: string[] = []\n if (typeof request.system === 'string') parts.push(request.system)\n const messages = request.messages\n if (Array.isArray(messages)) {\n for (const m of messages) {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') parts.push(content)\n else if (Array.isArray(content)) {\n for (const block of content) {\n const text = (block as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const content = response.content\n if (Array.isArray(content)) {\n return content\n .map((block) => {\n const b = block as { type?: string; text?: string }\n return b.type === 'text' && typeof b.text === 'string' ? b.text : ''\n })\n .join('')\n }\n return ''\n}\n\nexport function parseAnthropic(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as { input_tokens?: number; output_tokens?: number }\n\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const totalTokens = inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseAnthropicStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { input_tokens?: number; output_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst COHERE_COSTS: Record<string, { input: number; output: number }> = {\n 'command-r-plus': { input: 0.000003, output: 0.000015 },\n 'command-r': { input: 0.0000005, output: 0.0000015 },\n 'command': { input: 0.000001, output: 0.000002 },\n 'command-light': { input: 0.0000003, output: 0.0000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (COHERE_COSTS[model]) return COHERE_COSTS[model]\n for (const key of Object.keys(COHERE_COSTS)) {\n if (model.startsWith(key)) return COHERE_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n if (typeof request.message === 'string') return request.message\n if (typeof request.prompt === 'string') return request.prompt\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n return ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n if (typeof response.text === 'string') return response.text\n // v2 chat format: message.content[].text\n const message = response.message as { content?: Array<{ text?: string }> } | undefined\n if (message?.content && Array.isArray(message.content)) {\n return message.content.map((c) => (typeof c.text === 'string' ? c.text : '')).join('')\n }\n // generate format\n const generations = response.generations\n if (Array.isArray(generations) && generations.length > 0) {\n const first = generations[0] as { text?: string }\n if (typeof first.text === 'string') return first.text\n }\n return ''\n}\n\nexport function parseCohere(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (request?.model as string) ?? 'unknown'\n\n // Cohere v1 uses meta.billed_units {input_tokens, output_tokens}\n // Cohere v2 uses usage.tokens {input_tokens, output_tokens}\n const meta = (response?.meta ?? {}) as { billed_units?: { input_tokens?: number; output_tokens?: number } }\n const usage = (response?.usage ?? {}) as { tokens?: { input_tokens?: number; output_tokens?: number } }\n const tokens = meta.billed_units ?? usage.tokens ?? {}\n const inputTokens = tokens.input_tokens ?? 0\n const outputTokens = tokens.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'cohere',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst GEMINI_COSTS: Record<string, { input: number; output: number }> = {\n 'gemini-1.5-pro': { input: 0.00000125, output: 0.000005 },\n 'gemini-1.5-flash': { input: 0.000000075, output: 0.0000003 },\n 'gemini-1.0-pro': { input: 0.0000005, output: 0.0000015 },\n 'gemini-pro': { input: 0.0000005, output: 0.0000015 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (GEMINI_COSTS[model]) return GEMINI_COSTS[model]\n for (const key of Object.keys(GEMINI_COSTS)) {\n if (model.startsWith(key)) return GEMINI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const contents = request.contents\n if (!Array.isArray(contents)) return ''\n const parts: string[] = []\n for (const c of contents) {\n const innerParts = (c as { parts?: unknown }).parts\n if (Array.isArray(innerParts)) {\n for (const p of innerParts) {\n const text = (p as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const candidates = response.candidates\n if (!Array.isArray(candidates) || candidates.length === 0) return ''\n const first = candidates[0] as { content?: { parts?: Array<{ text?: string }> } }\n const parts = first.content?.parts\n if (!Array.isArray(parts)) return ''\n return parts.map((p) => (typeof p.text === 'string' ? p.text : '')).join('')\n}\n\nexport function parseGemini(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n modelHint?: string\n}): ParsedSpan {\n const { request, response, isStream, modelHint } = args\n const model =\n (response?.modelVersion as string) ??\n modelHint ??\n (request?.model as string) ??\n 'unknown'\n\n const usage = (response?.usageMetadata ?? {}) as {\n promptTokenCount?: number\n candidatesTokenCount?: number\n totalTokenCount?: number\n }\n\n const inputTokens = usage.promptTokenCount ?? 0\n const outputTokens = usage.candidatesTokenCount ?? 0\n const totalTokens = usage.totalTokenCount ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'gemini',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst MISTRAL_COSTS: Record<string, { input: number; output: number }> = {\n 'mistral-large': { input: 0.000002, output: 0.000006 },\n 'mistral-medium': { input: 0.0000027, output: 0.0000081 },\n 'mistral-small': { input: 0.0000002, output: 0.0000006 },\n 'open-mistral-7b': { input: 0.00000025, output: 0.00000025 },\n 'open-mixtral-8x7b': { input: 0.0000007, output: 0.0000007 },\n 'open-mixtral-8x22b': { input: 0.000002, output: 0.000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (MISTRAL_COSTS[model]) return MISTRAL_COSTS[model]\n for (const key of Object.keys(MISTRAL_COSTS)) {\n if (model.startsWith(key)) return MISTRAL_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n return typeof content === 'string' ? content : ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string } }\n if (first.message?.content) return first.message.content\n }\n return ''\n}\n\nexport function parseMistral(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'mistral',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst OPENAI_COSTS: Record<string, { input: number; output: number }> = {\n 'gpt-4o': { input: 0.0000025, output: 0.000010 },\n 'gpt-4o-mini': { input: 0.00000015, output: 0.0000006 },\n 'gpt-4-turbo': { input: 0.000010, output: 0.000030 },\n 'gpt-4': { input: 0.000030, output: 0.000060 },\n 'gpt-3.5-turbo': { input: 0.0000005, output: 0.0000015 },\n 'text-embedding-3-small': { input: 0.00000002, output: 0 },\n 'text-embedding-3-large': { input: 0.00000013, output: 0 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (OPENAI_COSTS[model]) return OPENAI_COSTS[model]\n // Permit version-suffixed model names like \"gpt-4o-2024-08-06\"\n for (const key of Object.keys(OPENAI_COSTS)) {\n if (model.startsWith(key)) return OPENAI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n return content\n .map((part) => (typeof (part as { text?: unknown }).text === 'string' ? (part as { text: string }).text : ''))\n .join('')\n }\n return ''\n })\n .join('\\n')\n }\n if (typeof request.prompt === 'string') return request.prompt\n if (Array.isArray(request.input)) return (request.input as unknown[]).map((x) => String(x)).join('\\n')\n if (typeof request.input === 'string') return request.input\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string }; text?: string }\n if (first.message?.content) return first.message.content\n if (typeof first.text === 'string') return first.text\n }\n // embeddings: no text output\n return ''\n}\n\nexport function parseOpenAI(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n\n const cost = lookupCost(model)\n const costUsd = inputTokens * cost.input + outputTokens * cost.output\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseOpenAIStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan, ParserName } from '../types'\nimport { parseAnthropic } from './anthropic'\nimport { parseCohere } from './cohere'\nimport { parseGemini } from './gemini'\nimport { parseMistral } from './mistral'\nimport { parseOpenAI } from './openai'\n\nexport { parseAnthropic, parseAnthropicStream } from './anthropic'\nexport { parseCohere } from './cohere'\nexport { parseGemini } from './gemini'\nexport { parseMistral } from './mistral'\nexport { parseOpenAI, parseOpenAIStream } from './openai'\n\nexport function parseSpan(args: {\n parser: ParserName\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n switch (args.parser) {\n case 'openai':\n return parseOpenAI(args)\n case 'anthropic':\n return parseAnthropic(args)\n case 'gemini':\n return parseGemini(args)\n case 'cohere':\n return parseCohere(args)\n case 'mistral':\n return parseMistral(args)\n }\n}\n","interface PIIPattern {\n name: string\n pattern: RegExp\n replacement: string\n}\n\n// Order matters: more specific / higher-stakes patterns run first.\n// SSN and credit cards must precede phone, because the phone regex is greedy\n// enough to eat 10 contiguous digits out of an unspaced 16-digit card number,\n// leaving fragments that no longer match the card pattern.\nconst PII_PATTERNS: PIIPattern[] = [\n { name: 'email', pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, replacement: '[EMAIL]' },\n { name: 'apikey', pattern: /\\b(sk|pk|key|token|secret|api[-_]?key)[-_]?[a-zA-Z0-9]{20,}/gi, replacement: '[API_KEY]' },\n { name: 'creditcard', pattern: /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g, replacement: '[CARD]' },\n { name: 'ssn', pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g, replacement: '[SSN]' },\n { name: 'phone', pattern: /(\\+?\\d{1,3}[\\s-]?)?\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}/g, replacement: '[PHONE]' },\n { name: 'ipv4', pattern: /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, replacement: '[IP]' },\n]\n\nexport function scrubPII(text: string): string {\n let result = text\n for (const { pattern, replacement } of PII_PATTERNS) {\n result = result.replace(pattern, replacement)\n }\n return result\n}\n\nexport function scrubObject(obj: unknown): unknown {\n if (typeof obj === 'string') return scrubPII(obj)\n if (Array.isArray(obj)) return obj.map(scrubObject)\n if (obj && typeof obj === 'object') {\n return Object.fromEntries(Object.entries(obj as Record<string, unknown>).map(([k, v]) => [k, scrubObject(v)]))\n }\n return obj\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentSpanId, getCurrentTraceId } from '@farzanhossans/agentlens-core'\nimport { parseSpan } from './parsers'\nimport { scrubPII } from './pii/scrubber'\nimport type {\n ErrorPayload,\n OutboundSpan,\n ParsedSpan,\n RawSpanPayload,\n TransportConfig,\n} from './types'\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 500\nconst DEFAULT_MAX_BATCH_SIZE = 50\nconst MAX_RETRIES = 3\n\nexport class Transport {\n private readonly config: Required<TransportConfig>\n private queue: OutboundSpan[] = []\n private timer: ReturnType<typeof setInterval> | null = null\n private flushing = false\n private exitHandlerRegistered = false\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxBatchSize: config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n }\n this.startTimer()\n this.registerExitHandler()\n }\n\n push(payload: RawSpanPayload): void {\n let parsed: ParsedSpan\n try {\n parsed = parseSpan({\n parser: payload.parser,\n request: (payload.request ?? null) as Record<string, unknown> | null,\n response: (payload.response ?? null) as Record<string, unknown> | null,\n isStream: payload.isStream,\n })\n } catch (err) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] parser failed', err)\n }\n return\n }\n\n const outbound = this.toOutbound(parsed, payload.latency, payload.status)\n this.enqueue(outbound)\n }\n\n pushError(payload: ErrorPayload): void {\n const ids = this.resolveIds()\n const span: OutboundSpan = {\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n model: 'unknown',\n provider: payload.provider,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n costUsd: 0,\n inputText: this.scrub(this.stringifyRequest(payload.request)),\n outputText: '',\n isStream: false,\n error: payload.error,\n latency: payload.latency,\n status: 0,\n timestamp: new Date().toISOString(),\n }\n this.enqueue(span)\n }\n\n async flush(): Promise<void> {\n if (this.flushing) return\n if (this.queue.length === 0) return\n\n this.flushing = true\n const batch = this.queue.splice(0, this.queue.length)\n\n try {\n await this.send(batch)\n } catch {\n // silent — never crash\n } finally {\n this.flushing = false\n }\n }\n\n shutdown(): void {\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n }\n\n private toOutbound(parsed: ParsedSpan, latency: number, status: number): OutboundSpan {\n const ids = this.resolveIds()\n return {\n ...parsed,\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n inputText: this.scrub(parsed.inputText),\n outputText: this.scrub(parsed.outputText),\n latency,\n status,\n timestamp: new Date().toISOString(),\n }\n }\n\n /**\n * Resolves the trace-context IDs to stamp on an outbound span.\n *\n * - `spanId` is always fresh per LLM call (the call IS the leaf span).\n * - `traceId` reuses the surrounding `trace()` block's traceId if any,\n * else a new one (the standalone LLM call is its own single-span trace).\n * - `parentSpanId` is the surrounding trace's currentSpanId, or undefined\n * when there is no enclosing `trace()`.\n *\n * AsyncLocalStorage propagates through the patched fetch's promise chain,\n * so this still resolves correctly for streamed spans emitted from the\n * background `captureSSEStream()` reader.\n */\n private resolveIds(): { spanId: string; traceId: string; parentSpanId?: string } {\n return {\n spanId: randomUUID(),\n traceId: getCurrentTraceId() ?? randomUUID(),\n parentSpanId: getCurrentSpanId(),\n }\n }\n\n private scrub(text: string): string {\n if (!this.config.pii) return text\n return scrubPII(text)\n }\n\n private stringifyRequest(request: unknown): string {\n if (request == null) return ''\n if (typeof request === 'string') return request\n try {\n return JSON.stringify(request)\n } catch {\n return ''\n }\n }\n\n private enqueue(span: OutboundSpan): void {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('[agentlens] span', {\n model: span.model,\n provider: span.provider,\n inputTokens: span.inputTokens,\n outputTokens: span.outputTokens,\n costUsd: span.costUsd,\n latency: span.latency,\n isStream: span.isStream,\n })\n }\n this.queue.push(span)\n if (this.queue.length >= this.config.maxBatchSize) {\n void this.flush()\n }\n }\n\n private startTimer(): void {\n if (this.timer) return\n this.timer = setInterval(() => {\n void this.flush()\n }, this.config.flushIntervalMs)\n // Don't keep the Node event loop alive on this interval alone\n if (typeof (this.timer as { unref?: () => void }).unref === 'function') {\n ;(this.timer as { unref: () => void }).unref()\n }\n }\n\n private registerExitHandler(): void {\n if (this.exitHandlerRegistered) return\n if (typeof process === 'undefined' || typeof process.on !== 'function') return\n this.exitHandlerRegistered = true\n process.on('beforeExit', () => {\n void this.flush()\n })\n }\n\n private async send(batch: OutboundSpan[]): Promise<void> {\n const body = JSON.stringify({ spans: batch })\n let attempt = 0\n let delay = 100\n\n while (attempt < MAX_RETRIES) {\n try {\n const res = await this.doFetch(body)\n if (res.ok) return\n // 4xx — don't retry, drop\n if (res.status >= 400 && res.status < 500) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush rejected', res.status)\n }\n return\n }\n } catch {\n // network error — retry\n }\n attempt++\n if (attempt < MAX_RETRIES) {\n await sleep(delay)\n delay *= 2\n }\n }\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush gave up after', MAX_RETRIES, 'attempts')\n }\n }\n\n private async doFetch(body: string): Promise<{ ok: boolean; status: number }> {\n // Use the ORIGINAL fetch, not a patched one. The interceptor stores the\n // original on globalThis under a private key so we don't intercept ourselves.\n const f =\n (globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch ??\n globalThis.fetch\n if (!f) {\n throw new Error('fetch unavailable')\n }\n const res = await f(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${this.config.apiKey}`,\n },\n body,\n })\n return { ok: res.ok, status: res.status }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentTraceId, runWithTrace } from '@farzanhossans/agentlens-core'\nimport { patchFetch } from './interceptors/fetch'\nimport { patchHttps } from './interceptors/https'\nimport { Transport } from './transport'\nimport type { AgentLensConfig } from './types'\n\nconst DEFAULT_ENDPOINT = 'https://ingest.agentlens.dev/v1/spans'\n\nlet initialized = false\nlet transport: Transport | null = null\n\nexport const AgentLens = {\n init(config: AgentLensConfig): void {\n if (initialized) return\n if (!config?.apiKey) {\n throw new Error('AgentLens.init requires an apiKey')\n }\n initialized = true\n\n transport = new Transport({\n apiKey: config.apiKey,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n flushIntervalMs: config.flushIntervalMs,\n maxBatchSize: config.maxBatchSize,\n })\n\n patchFetch(transport)\n patchHttps(transport)\n },\n\n async flush(): Promise<void> {\n if (!transport) return\n await transport.flush()\n },\n\n shutdown(): void {\n if (!transport) return\n transport.shutdown()\n transport = null\n initialized = false\n },\n\n /**\n * Wraps `fn` in a named trace context. Any LLM calls made inside `fn`\n * (including async ones) are auto-tagged with this trace's `traceId` and\n * get `parentSpanId` set to this trace's `spanId`. Nested `trace()` calls\n * become child spans automatically.\n *\n * Use this to group multiple LLM calls that belong to the same agent run.\n */\n trace<T>(_name: string, fn: () => Promise<T>): Promise<T> {\n const spanId = randomUUID()\n const traceId = getCurrentTraceId() ?? randomUUID()\n return runWithTrace({ traceId, currentSpanId: spanId }, fn)\n },\n}\n\nexport type { AgentLensConfig, ParsedSpan, OutboundSpan } from './types'\nexport { matchLLM, LLM_REGISTRY } from './registry'\nexport { scrubPII, scrubObject } from './pii/scrubber'\nexport {\n getCurrentTrace,\n getCurrentTraceId,\n getCurrentSpanId,\n runWithTrace,\n} from '@farzanhossans/agentlens-core'\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@farzanhossans/agentlens",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Universal AI agent observability — 1 line to trace every LLM call (OpenAI, Anthropic, Gemini, Cohere, Mistral)",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"ai",
|
|
21
|
+
"agent",
|
|
22
|
+
"observability",
|
|
23
|
+
"llm",
|
|
24
|
+
"tracing",
|
|
25
|
+
"openai",
|
|
26
|
+
"anthropic",
|
|
27
|
+
"gemini",
|
|
28
|
+
"cohere",
|
|
29
|
+
"mistral",
|
|
30
|
+
"monitoring"
|
|
31
|
+
],
|
|
32
|
+
"author": "Farzan Hossan <farzanhossans@gmail.com>",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"homepage": "https://agentlens.dev",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/farzanhossan/agentlens",
|
|
38
|
+
"directory": "packages/sdk-universal"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/farzanhossan/agentlens/issues"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@farzanhossans/agentlens-core": "1.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.12.12",
|
|
51
|
+
"tsup": "^8.5.1",
|
|
52
|
+
"typescript": "^5.4.5",
|
|
53
|
+
"vitest": "^1.6.0"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
57
|
+
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
58
|
+
"lint": "eslint src --ext .ts --max-warnings 0",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"test:watch": "vitest",
|
|
61
|
+
"type-check": "tsc --noEmit"
|
|
62
|
+
}
|
|
63
|
+
}
|