@lov3kaizen/agentsea-cache 0.5.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 @@
1
+ {"version":3,"sources":["../../src/streaming/ChunkBuffer.ts","../../src/core/utils.ts","../../src/streaming/StreamRecorder.ts","../../src/streaming/StreamReplayer.ts","../../src/core/CacheKey.ts","../../src/streaming/StreamCache.ts"],"names":["DEFAULT_CONFIG","latencyMs","entry"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ChunkBuffer\n *\n * Buffers stream chunks for efficient recording.\n */\n\nimport type { StreamChunk, ChunkBufferConfig } from '../types/index.js';\n\n/**\n * Default buffer configuration\n */\nconst DEFAULT_CONFIG: Required<ChunkBufferConfig> = {\n maxChunks: 100,\n maxBytes: 64 * 1024, // 64KB\n flushIntervalMs: 1000,\n preserveOrder: true,\n};\n\n/**\n * ChunkBuffer\n *\n * Buffers stream chunks for batch processing.\n *\n * @example\n * ```typescript\n * const buffer = new ChunkBuffer({\n * maxChunks: 50,\n * onFlush: (chunks) => console.log(`Flushed ${chunks.length} chunks`)\n * });\n *\n * buffer.add(chunk);\n * const chunks = buffer.flush();\n * ```\n */\nexport class ChunkBuffer {\n private chunks: StreamChunk[] = [];\n private currentBytes = 0;\n private config: Required<ChunkBufferConfig>;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private onFlush?: (chunks: StreamChunk[]) => void;\n\n constructor(\n config?: ChunkBufferConfig,\n onFlush?: (chunks: StreamChunk[]) => void,\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.onFlush = onFlush;\n\n if (this.config.flushIntervalMs > 0) {\n this.startFlushTimer();\n }\n }\n\n /**\n * Add a chunk to the buffer\n */\n add(chunk: StreamChunk): void {\n if (this.config.preserveOrder) {\n // Ensure chunk has correct index\n if (chunk.index === undefined) {\n chunk.index = this.chunks.length;\n }\n }\n\n this.chunks.push(chunk);\n this.currentBytes += this.estimateChunkSize(chunk);\n\n // Auto-flush if limits exceeded\n if (this.shouldFlush()) {\n this.flush();\n }\n }\n\n /**\n * Add multiple chunks\n */\n addAll(chunks: StreamChunk[]): void {\n for (const chunk of chunks) {\n this.add(chunk);\n }\n }\n\n /**\n * Flush all buffered chunks\n */\n flush(): StreamChunk[] {\n const flushed = this.chunks;\n\n // Sort by index if preserving order\n if (this.config.preserveOrder) {\n flushed.sort((a, b) => a.index - b.index);\n }\n\n // Reset buffer\n this.chunks = [];\n this.currentBytes = 0;\n\n // Callback if set\n if (this.onFlush && flushed.length > 0) {\n this.onFlush(flushed);\n }\n\n return flushed;\n }\n\n /**\n * Get current buffer size\n */\n size(): number {\n return this.chunks.length;\n }\n\n /**\n * Get current buffer bytes\n */\n bytes(): number {\n return this.currentBytes;\n }\n\n /**\n * Check if buffer is empty\n */\n isEmpty(): boolean {\n return this.chunks.length === 0;\n }\n\n /**\n * Peek at buffered chunks without flushing\n */\n peek(): readonly StreamChunk[] {\n return this.chunks;\n }\n\n /**\n * Clear the buffer without flushing\n */\n clear(): void {\n this.chunks = [];\n this.currentBytes = 0;\n }\n\n /**\n * Stop the flush timer\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Destroy the buffer\n */\n destroy(): void {\n this.stop();\n this.clear();\n }\n\n private shouldFlush(): boolean {\n return (\n this.chunks.length >= this.config.maxChunks ||\n this.currentBytes >= this.config.maxBytes\n );\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n if (!this.isEmpty()) {\n this.flush();\n }\n }, this.config.flushIntervalMs);\n }\n\n private estimateChunkSize(chunk: StreamChunk): number {\n let size = 0;\n if (chunk.content) {\n size += chunk.content.length * 2; // Unicode chars\n }\n if (chunk.toolCall) {\n size += JSON.stringify(chunk.toolCall).length;\n }\n if (chunk.toolResult) {\n size += JSON.stringify(chunk.toolResult).length;\n }\n if (chunk.metadata) {\n size += JSON.stringify(chunk.metadata).length;\n }\n return size + 50; // Base overhead\n }\n}\n\n/**\n * Create a ChunkBuffer instance\n */\nexport function createChunkBuffer(\n config?: ChunkBufferConfig,\n onFlush?: (chunks: StreamChunk[]) => void,\n): ChunkBuffer {\n return new ChunkBuffer(config, onFlush);\n}\n","/**\n * Core Utilities\n *\n * Helper functions for the semantic cache.\n */\n\nimport { nanoid } from 'nanoid';\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n const id = nanoid(16);\n return prefix ? `${prefix}_${id}` : id;\n}\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function now(): number {\n return Date.now();\n}\n\n/**\n * Check if an entry has expired based on TTL\n */\nexport function isExpired(createdAt: number, ttlSeconds: number): boolean {\n if (ttlSeconds <= 0) return false;\n return now() > createdAt + ttlSeconds * 1000;\n}\n\n/**\n * Estimate the size of an object in bytes\n */\nexport function estimateSize(obj: unknown): number {\n const str = JSON.stringify(obj);\n // Rough estimate: 2 bytes per character for UTF-16\n return str.length * 2;\n}\n\n/**\n * Estimate size of a cache entry\n */\nexport function estimateEntrySize(entry: {\n embedding?: number[];\n request: { messages: Array<{ content: string }> };\n response: { content: string };\n}): number {\n // Vector: 4 bytes per float32\n const vectorSize = (entry.embedding?.length ?? 0) * 4;\n\n // Content: roughly 2 bytes per character\n const messageSize = entry.request.messages.reduce(\n (acc, m) => acc + (m.content?.length ?? 0) * 2,\n 0,\n );\n const responseSize = (entry.response.content?.length ?? 0) * 2;\n\n // Metadata overhead\n const overheadSize = 500;\n\n return vectorSize + messageSize + responseSize + overheadSize;\n}\n\n/**\n * Sleep for a specified duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n } = {},\n): Promise<T> {\n const {\n maxAttempts = 3,\n initialDelayMs = 100,\n maxDelayMs = 5000,\n backoffMultiplier = 2,\n } = options;\n\n let lastError: Error | undefined;\n let delay = initialDelayMs;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelayMs);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Chunk an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Calculate percentile from an array of numbers\n */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n}\n\n/**\n * Calculate mean of an array of numbers\n */\nexport function mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((a, b) => a + b, 0) / values.length;\n}\n","/**\n * StreamRecorder\n *\n * Records LLM stream responses for caching.\n */\n\nimport type {\n StreamChunk,\n RecordedStream,\n StreamRecorderConfig,\n} from '../types/index.js';\nimport { ChunkBuffer } from './ChunkBuffer.js';\nimport { generateId, now } from '../core/utils.js';\n\n/**\n * Default recorder configuration\n */\nconst DEFAULT_CONFIG: Required<StreamRecorderConfig> = {\n buffer: {\n maxChunks: 100,\n maxBytes: 64 * 1024,\n flushIntervalMs: 0, // No auto-flush during recording\n preserveOrder: true,\n },\n captureToolCalls: true,\n captureMetadata: true,\n maxDurationMs: 300000, // 5 minutes\n maxChunks: 10000,\n};\n\n/**\n * StreamRecorder\n *\n * Records stream chunks for later caching and replay.\n *\n * @example\n * ```typescript\n * const recorder = new StreamRecorder({\n * captureToolCalls: true\n * });\n *\n * recorder.start('gpt-4', messages);\n *\n * for await (const chunk of stream) {\n * recorder.recordChunk({ type: 'text', content: chunk.content });\n * }\n *\n * const recorded = recorder.complete();\n * ```\n */\nexport class StreamRecorder {\n private config: Required<StreamRecorderConfig>;\n private buffer: ChunkBuffer;\n private recording = false;\n private startTime = 0;\n private model = '';\n private messages: Array<{ role: string; content: string }> = [];\n private key = '';\n private totalChars = 0;\n private chunkIndex = 0;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config?: StreamRecorderConfig) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n buffer: { ...DEFAULT_CONFIG.buffer, ...config?.buffer },\n };\n this.buffer = new ChunkBuffer(this.config.buffer);\n }\n\n /**\n * Start recording a new stream\n */\n start(\n model: string,\n messages: Array<{ role: string; content: string }>,\n key?: string,\n ): void {\n if (this.recording) {\n throw new Error('Recording already in progress');\n }\n\n this.recording = true;\n this.startTime = now();\n this.model = model;\n this.messages = messages;\n this.key = key ?? generateId();\n this.totalChars = 0;\n this.chunkIndex = 0;\n this.buffer.clear();\n\n // Set timeout for max duration\n if (this.config.maxDurationMs > 0) {\n this.timeoutId = setTimeout(() => {\n if (this.recording) {\n this.abort('Recording exceeded maximum duration');\n }\n }, this.config.maxDurationMs);\n }\n }\n\n /**\n * Record a text chunk\n */\n recordText(content: string, metadata?: Record<string, unknown>): void {\n this.recordChunk({\n type: 'text',\n content,\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n this.totalChars += content.length;\n }\n\n /**\n * Record a tool call chunk\n */\n recordToolCall(\n id: string,\n name: string,\n args: string,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.config.captureToolCalls) return;\n\n this.recordChunk({\n type: 'tool_call',\n toolCall: { id, name, arguments: args },\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record a tool result chunk\n */\n recordToolResult(\n callId: string,\n content: string,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.config.captureToolCalls) return;\n\n this.recordChunk({\n type: 'tool_result',\n toolResult: { callId, content },\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record metadata\n */\n recordMetadata(metadata: Record<string, unknown>): void {\n if (!this.config.captureMetadata) return;\n\n this.recordChunk({\n type: 'metadata',\n metadata,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record a generic chunk\n */\n recordChunk(chunk: StreamChunk): void {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n // Check if we've already recorded maxChunks (chunk.index is 0-based, already incremented)\n if (chunk.index >= this.config.maxChunks) {\n throw new Error('Maximum chunks exceeded');\n }\n\n this.buffer.add(chunk);\n }\n\n /**\n * Complete the recording and return the recorded stream\n */\n complete(tokenUsage?: {\n prompt: number;\n completion: number;\n total: number;\n }): RecordedStream {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n this.clearTimeout();\n const endTime = now();\n const chunks = this.buffer.flush();\n\n const stream: RecordedStream = {\n id: generateId(),\n key: this.key,\n chunks,\n model: this.model,\n messages: this.messages,\n startTime: this.startTime,\n endTime,\n durationMs: endTime - this.startTime,\n totalChars: this.totalChars,\n tokenUsage,\n complete: true,\n };\n\n this.reset();\n return stream;\n }\n\n /**\n * Abort the recording\n */\n abort(reason?: string): RecordedStream {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n this.clearTimeout();\n const endTime = now();\n const chunks = this.buffer.flush();\n\n const stream: RecordedStream = {\n id: generateId(),\n key: this.key,\n chunks,\n model: this.model,\n messages: this.messages,\n startTime: this.startTime,\n endTime,\n durationMs: endTime - this.startTime,\n totalChars: this.totalChars,\n complete: false,\n error: reason ?? 'Recording aborted',\n };\n\n this.reset();\n return stream;\n }\n\n /**\n * Check if currently recording\n */\n isRecording(): boolean {\n return this.recording;\n }\n\n /**\n * Get current chunk count\n */\n getChunkCount(): number {\n return this.chunkIndex;\n }\n\n /**\n * Get current recording duration in ms\n */\n getDuration(): number {\n if (!this.recording) return 0;\n return now() - this.startTime;\n }\n\n /**\n * Destroy the recorder\n */\n destroy(): void {\n this.clearTimeout();\n this.buffer.destroy();\n this.reset();\n }\n\n private reset(): void {\n this.recording = false;\n this.startTime = 0;\n this.model = '';\n this.messages = [];\n this.key = '';\n this.totalChars = 0;\n this.chunkIndex = 0;\n }\n\n private clearTimeout(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n}\n\n/**\n * Create a StreamRecorder instance\n */\nexport function createStreamRecorder(\n config?: StreamRecorderConfig,\n): StreamRecorder {\n return new StreamRecorder(config);\n}\n","/**\n * StreamReplayer\n *\n * Replays cached stream responses.\n */\n\nimport type {\n StreamChunk,\n RecordedStream,\n StreamReplayerConfig,\n} from '../types/index.js';\n\n/**\n * Default replayer configuration\n */\nconst DEFAULT_CONFIG: Required<StreamReplayerConfig> = {\n speedMultiplier: 1,\n minDelayMs: 0,\n maxDelayMs: 100,\n simulateTiming: false,\n onChunk: () => {},\n onComplete: () => {},\n onError: () => {},\n};\n\n/**\n * StreamReplayer\n *\n * Replays recorded streams as async iterables.\n *\n * @example\n * ```typescript\n * const replayer = new StreamReplayer({\n * speedMultiplier: 2, // 2x speed\n * simulateTiming: true\n * });\n *\n * for await (const chunk of replayer.replay(recordedStream)) {\n * process.stdout.write(chunk.content ?? '');\n * }\n * ```\n */\nexport class StreamReplayer {\n private config: Required<StreamReplayerConfig>;\n private abortController: AbortController | null = null;\n\n constructor(config?: StreamReplayerConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Replay a recorded stream as an async iterable\n */\n async *replay(stream: RecordedStream): AsyncGenerator<StreamChunk> {\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n try {\n const chunks = [...stream.chunks].sort((a, b) => a.index - b.index);\n let lastTimestamp = chunks[0]?.timestamp ?? 0;\n\n for (let i = 0; i < chunks.length; i++) {\n if (signal.aborted) {\n break;\n }\n\n const chunk = chunks[i];\n\n // Simulate timing if enabled\n if (this.config.simulateTiming && i > 0) {\n const timeDiff = chunk.timestamp - lastTimestamp;\n const delay = Math.min(\n Math.max(\n timeDiff / this.config.speedMultiplier,\n this.config.minDelayMs,\n ),\n this.config.maxDelayMs,\n );\n\n if (delay > 0) {\n await this.delay(delay, signal);\n }\n }\n\n lastTimestamp = chunk.timestamp;\n this.config.onChunk(chunk);\n yield chunk;\n }\n\n this.config.onComplete(stream);\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n this.config.onError(error as Error);\n throw error;\n }\n } finally {\n this.abortController = null;\n }\n }\n\n /**\n * Replay as a full async iterable of text content only\n */\n async *replayText(stream: RecordedStream): AsyncGenerator<string> {\n for await (const chunk of this.replay(stream)) {\n if (chunk.type === 'text' && chunk.content) {\n yield chunk.content;\n }\n }\n }\n\n /**\n * Replay synchronously (no timing simulation)\n */\n *replaySync(stream: RecordedStream): Generator<StreamChunk> {\n const chunks = [...stream.chunks].sort((a, b) => a.index - b.index);\n for (const chunk of chunks) {\n this.config.onChunk(chunk);\n yield chunk;\n }\n this.config.onComplete(stream);\n }\n\n /**\n * Get all chunks at once\n */\n getAllChunks(stream: RecordedStream): StreamChunk[] {\n return [...stream.chunks].sort((a, b) => a.index - b.index);\n }\n\n /**\n * Get full text content from stream\n */\n getFullText(stream: RecordedStream): string {\n return stream.chunks\n .filter((c) => c.type === 'text' && c.content)\n .sort((a, b) => a.index - b.index)\n .map((c) => c.content)\n .join('');\n }\n\n /**\n * Get tool calls from stream\n */\n getToolCalls(\n stream: RecordedStream,\n ): Array<{ id: string; name: string; arguments: string }> {\n return stream.chunks\n .filter((c) => c.type === 'tool_call' && c.toolCall)\n .sort((a, b) => a.index - b.index)\n .map((c) => c.toolCall!);\n }\n\n /**\n * Stop current replay\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<StreamReplayerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n private delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n });\n });\n }\n}\n\n/**\n * Create a StreamReplayer instance\n */\nexport function createStreamReplayer(\n config?: StreamReplayerConfig,\n): StreamReplayer {\n return new StreamReplayer(config);\n}\n","/**\n * Cache Key Generation\n *\n * Utilities for generating and normalizing cache keys.\n */\n\nimport murmurhash from 'murmurhash';\nimport type { CacheMessage, CacheKeyOptions } from '../types/index.js';\n\n/**\n * Default key options\n */\nconst DEFAULT_KEY_OPTIONS: CacheKeyOptions = {\n includeTemperature: false,\n includeTools: false,\n normalizeWhitespace: true,\n extractUserMessage: false,\n};\n\n/**\n * Generate a cache key from request parameters\n *\n * @param model - The model name\n * @param messages - The conversation messages\n * @param options - Key generation options\n * @returns A unique cache key string\n */\nexport function generateCacheKey(\n model: string,\n messages: CacheMessage[],\n options: CacheKeyOptions = {},\n): string {\n const opts = { ...DEFAULT_KEY_OPTIONS, ...options };\n const normalized = normalizeRequest(model, messages, opts);\n const hash = murmurhash.v3(JSON.stringify(normalized)).toString(16);\n return `cache:${model}:${hash}`;\n}\n\n/**\n * Normalize request for consistent hashing\n */\nexport function normalizeRequest(\n model: string,\n messages: CacheMessage[],\n options: CacheKeyOptions = {},\n): Record<string, unknown> {\n const normalizedMessages = messages.map((m) => ({\n role: m.role,\n content: options.normalizeWhitespace\n ? normalizeWhitespace(m.content)\n : m.content,\n }));\n\n return {\n model,\n messages: options.extractUserMessage\n ? extractUserMessage(normalizedMessages)\n : normalizedMessages,\n };\n}\n\n/**\n * Normalize whitespace in text\n *\n * - Trims leading/trailing whitespace\n * - Collapses multiple spaces into single space\n * - Normalizes line endings\n */\nexport function normalizeWhitespace(text: string): string {\n return text.trim().replace(/\\r\\n/g, '\\n').replace(/\\s+/g, ' ');\n}\n\n/**\n * Extract the last user message for semantic comparison\n */\nexport function extractUserMessage(\n messages: CacheMessage[] | Array<{ role: string; content: string }>,\n): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'user') {\n return messages[i].content;\n }\n }\n return '';\n}\n\n/**\n * Extract system prompt from messages\n */\nexport function extractSystemPrompt(\n messages: CacheMessage[],\n): string | undefined {\n const systemMessage = messages.find((m) => m.role === 'system');\n return systemMessage?.content;\n}\n\n/**\n * Generate a semantic key for embedding lookup\n * Uses only the user message and model for semantic matching\n */\nexport function generateSemanticKey(\n model: string,\n messages: CacheMessage[],\n): string {\n const userMessage = extractUserMessage(messages);\n const normalized = normalizeWhitespace(userMessage);\n return `${model}:${normalized}`;\n}\n\n/**\n * Generate a fingerprint for a conversation\n * Useful for detecting similar conversation patterns\n */\nexport function generateConversationFingerprint(\n messages: CacheMessage[],\n): string {\n const pattern = messages\n .map((m) => `${m.role}:${m.content.length}`)\n .join('|');\n return murmurhash.v3(pattern).toString(16);\n}\n\n/**\n * Parse a cache key to extract components\n */\nexport function parseCacheKey(key: string): {\n prefix: string;\n model: string;\n hash: string;\n} | null {\n const parts = key.split(':');\n if (parts.length !== 3 || parts[0] !== 'cache') {\n return null;\n }\n return {\n prefix: parts[0],\n model: parts[1],\n hash: parts[2],\n };\n}\n\n/**\n * Check if two cache keys are for the same model\n */\nexport function isSameModel(key1: string, key2: string): boolean {\n const parsed1 = parseCacheKey(key1);\n const parsed2 = parseCacheKey(key2);\n if (!parsed1 || !parsed2) return false;\n return parsed1.model === parsed2.model;\n}\n","/**\n * StreamCache\n *\n * Main streaming cache class for caching and replaying LLM streams.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport type {\n CacheMessage,\n RecordedStream,\n StreamCacheConfig,\n StreamCacheLookupResult,\n StreamCacheStats,\n StreamChunk,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\nimport { StreamRecorder } from './StreamRecorder.js';\nimport { StreamReplayer } from './StreamReplayer.js';\nimport { generateCacheKey } from '../core/CacheKey.js';\nimport { generateId, now } from '../core/utils.js';\n\n/**\n * StreamCache events\n */\nexport interface StreamCacheEvents {\n hit: (result: StreamCacheLookupResult) => void;\n miss: (key: string) => void;\n record: (stream: RecordedStream) => void;\n error: (error: Error) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<StreamCacheConfig> = {\n recorder: {},\n replayer: {},\n cacheIncomplete: false,\n minLengthToCache: 10,\n streamTtl: 3600, // 1 hour\n};\n\n/**\n * StreamCache\n *\n * Cache for LLM streaming responses.\n *\n * @example\n * ```typescript\n * const streamCache = new StreamCache({\n * store,\n * minLengthToCache: 50\n * });\n *\n * // Wrap a streaming call\n * const stream = streamCache.wrapStream({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: 'Hello' }],\n * stream: true\n * }, async function* () {\n * // Your streaming LLM call\n * for await (const chunk of llm.stream(request)) {\n * yield chunk;\n * }\n * });\n * ```\n */\nexport class StreamCache extends EventEmitter<StreamCacheEvents> {\n private store: BaseCacheStore;\n private similarity?: SimilarityEngine;\n private config: Required<StreamCacheConfig>;\n private recorder: StreamRecorder;\n private replayer: StreamReplayer;\n private stats: StreamCacheStats = {\n totalLookups: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgReplayLatencyMs: 0,\n totalStreamsCached: 0,\n totalBytesCached: 0,\n avgStreamDurationMs: 0,\n };\n private replayLatencies: number[] = [];\n private streamDurations: number[] = [];\n\n constructor(\n store: BaseCacheStore,\n config?: StreamCacheConfig,\n similarity?: SimilarityEngine,\n ) {\n super();\n this.store = store;\n this.similarity = similarity;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.recorder = new StreamRecorder(this.config.recorder);\n this.replayer = new StreamReplayer(this.config.replayer);\n }\n\n /**\n * Look up a cached stream\n */\n async lookup(\n model: string,\n messages: CacheMessage[],\n ): Promise<StreamCacheLookupResult> {\n const startTime = performance.now();\n this.stats.totalLookups++;\n\n const key = this.generateStreamKey(model, messages);\n\n try {\n // Try exact match first\n const entry = await this.store.get(key);\n\n if (entry) {\n const stream = this.deserializeStream(entry.response.content);\n if (stream) {\n this.stats.totalHits++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n this.replayLatencies.push(latencyMs);\n\n const result: StreamCacheLookupResult = {\n hit: true,\n stream,\n similarity: 1.0,\n source: 'exact',\n latencyMs,\n };\n\n this.emit('hit', result);\n return result;\n }\n }\n\n // Try semantic match if similarity engine is available\n if (this.similarity) {\n const userMessage = messages.find((m) => m.role === 'user')?.content;\n if (userMessage) {\n const embedding = await this.similarity.embed(userMessage);\n const results = await this.store.query(embedding, {\n topK: 1,\n minSimilarity: 0.92,\n });\n\n if (results.entries.length > 0) {\n const entry = results.entries[0];\n const stream = this.deserializeStream(entry.response.content);\n if (stream && entry.score >= 0.92) {\n this.stats.totalHits++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n this.replayLatencies.push(latencyMs);\n\n const result: StreamCacheLookupResult = {\n hit: true,\n stream,\n similarity: entry.score,\n source: 'semantic',\n latencyMs,\n };\n\n this.emit('hit', result);\n return result;\n }\n }\n }\n }\n\n // Cache miss\n this.stats.totalMisses++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n\n this.emit('miss', key);\n return {\n hit: false,\n source: 'miss',\n latencyMs,\n };\n } catch (error) {\n this.emit('error', error as Error);\n return {\n hit: false,\n source: 'miss',\n latencyMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Cache a recorded stream\n */\n async cache(stream: RecordedStream, embedding?: number[]): Promise<void> {\n // Don't cache incomplete streams unless configured\n if (!stream.complete && !this.config.cacheIncomplete) {\n return;\n }\n\n // Don't cache streams that are too short\n if (stream.totalChars < this.config.minLengthToCache) {\n return;\n }\n\n const key = this.generateStreamKey(stream.model, stream.messages);\n\n try {\n // Convert messages to CacheMessage format\n const cacheMessages: CacheMessage[] = stream.messages.map((m) => ({\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\n content: m.content,\n }));\n\n await this.store.set(key, {\n id: generateId(),\n key,\n request: {\n messages: cacheMessages,\n model: stream.model,\n },\n response: {\n content: this.serializeStream(stream),\n model: stream.model,\n finishReason: stream.complete ? 'stop' : 'error',\n usage: {\n promptTokens: stream.tokenUsage?.prompt ?? 0,\n completionTokens: stream.tokenUsage?.completion ?? 0,\n totalTokens: stream.tokenUsage?.total ?? 0,\n },\n },\n embedding,\n metadata: {\n createdAt: now(),\n accessedAt: now(),\n accessCount: 1,\n hitCount: 0,\n ttl: this.config.streamTtl,\n },\n });\n\n this.stats.totalStreamsCached++;\n this.stats.totalBytesCached += this.estimateStreamSize(stream);\n this.streamDurations.push(stream.durationMs);\n this.updateAvgStreamDuration();\n\n this.emit('record', stream);\n } catch (error) {\n this.emit('error', error as Error);\n }\n }\n\n /**\n * Wrap a streaming function with caching\n */\n async *wrapStream<T extends { content?: string }>(\n model: string,\n messages: CacheMessage[],\n streamFn: () => AsyncGenerator<T>,\n options?: { embedding?: number[] },\n ): AsyncGenerator<T> {\n // Check cache first\n const lookupResult = await this.lookup(model, messages);\n\n if (lookupResult.hit && lookupResult.stream) {\n // Replay from cache\n for await (const chunk of this.replayer.replay(lookupResult.stream)) {\n yield { content: chunk.content } as T;\n }\n return;\n }\n\n // Record new stream\n const key = this.generateStreamKey(model, messages);\n this.recorder.start(model, messages, key);\n\n try {\n for await (const chunk of streamFn()) {\n if (chunk.content) {\n this.recorder.recordText(chunk.content);\n }\n yield chunk;\n }\n\n // Complete recording and cache\n const stream = this.recorder.complete();\n await this.cache(stream, options?.embedding);\n } catch (error) {\n // Abort recording on error\n if (this.recorder.isRecording()) {\n this.recorder.abort((error as Error).message);\n }\n throw error;\n }\n }\n\n /**\n * Replay a cached stream\n */\n async *replay(stream: RecordedStream): AsyncGenerator<StreamChunk> {\n for await (const chunk of this.replayer.replay(stream)) {\n yield chunk;\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): StreamCacheStats {\n return { ...this.stats };\n }\n\n /**\n * Clear the stream cache\n */\n async clear(): Promise<void> {\n await this.store.clear();\n this.stats = {\n totalLookups: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgReplayLatencyMs: 0,\n totalStreamsCached: 0,\n totalBytesCached: 0,\n avgStreamDurationMs: 0,\n };\n this.replayLatencies = [];\n this.streamDurations = [];\n }\n\n /**\n * Destroy the stream cache\n */\n destroy(): void {\n this.recorder.destroy();\n this.replayer.stop();\n this.removeAllListeners();\n }\n\n private generateStreamKey(\n model: string,\n messages: Array<{ role: string; content: string }>,\n ): string {\n // Convert to CacheMessage format for key generation\n const cacheMessages: CacheMessage[] = messages.map((m) => ({\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\n content: m.content,\n }));\n return generateCacheKey(model, cacheMessages);\n }\n\n private serializeStream(stream: RecordedStream): string {\n return JSON.stringify(stream);\n }\n\n private deserializeStream(content: string): RecordedStream | null {\n try {\n return JSON.parse(content) as RecordedStream;\n } catch {\n return null;\n }\n }\n\n private estimateStreamSize(stream: RecordedStream): number {\n return JSON.stringify(stream).length;\n }\n\n private updateHitRate(): void {\n if (this.stats.totalLookups > 0) {\n this.stats.hitRate =\n (this.stats.totalHits / this.stats.totalLookups) * 100;\n }\n }\n\n private updateAvgStreamDuration(): void {\n if (this.streamDurations.length > 0) {\n this.stats.avgStreamDurationMs =\n this.streamDurations.reduce((a, b) => a + b, 0) /\n this.streamDurations.length;\n }\n }\n}\n\n/**\n * Create a StreamCache instance\n */\nexport function createStreamCache(\n store: BaseCacheStore,\n config?: StreamCacheConfig,\n similarity?: SimilarityEngine,\n): StreamCache {\n return new StreamCache(store, config, similarity);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "@lov3kaizen/agentsea-cache",
3
+ "version": "0.5.1",
4
+ "description": "Semantic caching layer for LLM responses - exact match, semantic similarity, and hybrid strategies",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./stores": {
15
+ "types": "./dist/stores/index.d.ts",
16
+ "import": "./dist/stores/index.js"
17
+ },
18
+ "./strategies": {
19
+ "types": "./dist/strategies/index.d.ts",
20
+ "import": "./dist/strategies/index.js"
21
+ },
22
+ "./streaming": {
23
+ "types": "./dist/streaming/index.d.ts",
24
+ "import": "./dist/streaming/index.js"
25
+ },
26
+ "./analytics": {
27
+ "types": "./dist/analytics/index.d.ts",
28
+ "import": "./dist/analytics/index.js"
29
+ },
30
+ "./agentsea": {
31
+ "types": "./dist/integrations/agentsea/index.d.ts",
32
+ "import": "./dist/integrations/agentsea/index.js"
33
+ },
34
+ "./gateway": {
35
+ "types": "./dist/integrations/gateway/index.d.ts",
36
+ "import": "./dist/integrations/gateway/index.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md"
42
+ ],
43
+ "keywords": [
44
+ "cache",
45
+ "semantic-cache",
46
+ "llm",
47
+ "gpt",
48
+ "openai",
49
+ "anthropic",
50
+ "claude",
51
+ "embedding",
52
+ "vector",
53
+ "ai",
54
+ "machine-learning",
55
+ "agentsea"
56
+ ],
57
+ "author": "lov3kaizen",
58
+ "license": "MIT",
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "https://github.com/lov3kaizen/agentsea.git",
62
+ "directory": "packages/cache"
63
+ },
64
+ "dependencies": {
65
+ "eventemitter3": "^5.0.1",
66
+ "lru-cache": "^10.4.3",
67
+ "murmurhash": "^2.0.1",
68
+ "nanoid": "^5.0.9"
69
+ },
70
+ "devDependencies": {
71
+ "@types/better-sqlite3": "^7.6.13",
72
+ "@types/murmurhash": "^2.0.0",
73
+ "@types/node": "^20.17.10",
74
+ "tsup": "^8.3.5",
75
+ "typescript": "^5.7.2",
76
+ "vitest": "^2.1.8"
77
+ },
78
+ "peerDependencies": {
79
+ "@lov3kaizen/agentsea-core": ">=0.5.0",
80
+ "@lov3kaizen/agentsea-embeddings": ">=0.5.0"
81
+ },
82
+ "peerDependenciesMeta": {
83
+ "@lov3kaizen/agentsea-core": {
84
+ "optional": true
85
+ },
86
+ "@lov3kaizen/agentsea-embeddings": {
87
+ "optional": true
88
+ }
89
+ },
90
+ "optionalDependencies": {
91
+ "@pinecone-database/pinecone": "^4.0.0",
92
+ "better-sqlite3": "^11.7.0",
93
+ "ioredis": "^5.4.1"
94
+ },
95
+ "engines": {
96
+ "node": ">=18.0.0"
97
+ },
98
+ "scripts": {
99
+ "build": "tsup",
100
+ "dev": "tsup --watch",
101
+ "test": "vitest run",
102
+ "test:watch": "vitest",
103
+ "test:coverage": "vitest run --coverage",
104
+ "lint": "eslint src --ext .ts",
105
+ "type-check": "tsc --noEmit",
106
+ "clean": "rm -rf dist"
107
+ }
108
+ }