@revealui/ai 0.1.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/LICENSE +22 -0
- package/LICENSE.commercial +112 -0
- package/README.md +314 -0
- package/dist/a2a/card.d.ts +26 -0
- package/dist/a2a/card.d.ts.map +1 -0
- package/dist/a2a/card.js +173 -0
- package/dist/a2a/handler.d.ts +26 -0
- package/dist/a2a/handler.d.ts.map +1 -0
- package/dist/a2a/handler.js +170 -0
- package/dist/a2a/index.d.ts +10 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +9 -0
- package/dist/a2a/task-store.d.ts +42 -0
- package/dist/a2a/task-store.d.ts.map +1 -0
- package/dist/a2a/task-store.js +99 -0
- package/dist/audit/emitter.d.ts +34 -0
- package/dist/audit/emitter.d.ts.map +1 -0
- package/dist/audit/emitter.js +34 -0
- package/dist/audit/index.d.ts +44 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +48 -0
- package/dist/audit/observer.d.ts +108 -0
- package/dist/audit/observer.d.ts.map +1 -0
- package/dist/audit/observer.js +271 -0
- package/dist/audit/policy.d.ts +70 -0
- package/dist/audit/policy.d.ts.map +1 -0
- package/dist/audit/policy.js +209 -0
- package/dist/audit/store.d.ts +42 -0
- package/dist/audit/store.d.ts.map +1 -0
- package/dist/audit/store.js +80 -0
- package/dist/audit/types.d.ts +169 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +80 -0
- package/dist/client/hooks/index.d.ts +22 -0
- package/dist/client/hooks/index.d.ts.map +1 -0
- package/dist/client/hooks/index.js +21 -0
- package/dist/client/hooks/useAgentContext.d.ts +30 -0
- package/dist/client/hooks/useAgentContext.d.ts.map +1 -0
- package/dist/client/hooks/useAgentContext.js +161 -0
- package/dist/client/hooks/useAgentEvents.d.ts +126 -0
- package/dist/client/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/client/hooks/useAgentEvents.js +232 -0
- package/dist/client/hooks/useAgentStream.d.ts +44 -0
- package/dist/client/hooks/useAgentStream.d.ts.map +1 -0
- package/dist/client/hooks/useAgentStream.js +101 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts +25 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -0
- package/dist/client/hooks/useEpisodicMemory.js +174 -0
- package/dist/client/hooks/useWorkingMemory.d.ts +57 -0
- package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -0
- package/dist/client/hooks/useWorkingMemory.js +276 -0
- package/dist/client/index.d.ts +14 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/embeddings/index.d.ts +51 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +73 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/inference/context-assembly.d.ts +27 -0
- package/dist/inference/context-assembly.d.ts.map +1 -0
- package/dist/inference/context-assembly.js +81 -0
- package/dist/inference/overflow-compressor.d.ts +17 -0
- package/dist/inference/overflow-compressor.d.ts.map +1 -0
- package/dist/inference/overflow-compressor.js +40 -0
- package/dist/inference/runRag.d.ts +35 -0
- package/dist/inference/runRag.d.ts.map +1 -0
- package/dist/inference/runRag.js +53 -0
- package/dist/ingestion/bm25.d.ts +29 -0
- package/dist/ingestion/bm25.d.ts.map +1 -0
- package/dist/ingestion/bm25.js +161 -0
- package/dist/ingestion/cms-indexer.d.ts +39 -0
- package/dist/ingestion/cms-indexer.d.ts.map +1 -0
- package/dist/ingestion/cms-indexer.js +74 -0
- package/dist/ingestion/file-parsers.d.ts +51 -0
- package/dist/ingestion/file-parsers.d.ts.map +1 -0
- package/dist/ingestion/file-parsers.js +247 -0
- package/dist/ingestion/hybrid-search.d.ts +22 -0
- package/dist/ingestion/hybrid-search.d.ts.map +1 -0
- package/dist/ingestion/hybrid-search.js +63 -0
- package/dist/ingestion/index.d.ts +9 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +8 -0
- package/dist/ingestion/pipeline.d.ts +35 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +114 -0
- package/dist/ingestion/rag-vector-service.d.ts +34 -0
- package/dist/ingestion/rag-vector-service.d.ts.map +1 -0
- package/dist/ingestion/rag-vector-service.js +98 -0
- package/dist/ingestion/reranker.d.ts +10 -0
- package/dist/ingestion/reranker.d.ts.map +1 -0
- package/dist/ingestion/reranker.js +41 -0
- package/dist/ingestion/text-splitter.d.ts +25 -0
- package/dist/ingestion/text-splitter.d.ts.map +1 -0
- package/dist/ingestion/text-splitter.js +119 -0
- package/dist/llm/cache-utils.d.ts +146 -0
- package/dist/llm/cache-utils.d.ts.map +1 -0
- package/dist/llm/cache-utils.js +204 -0
- package/dist/llm/client.d.ts +134 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +497 -0
- package/dist/llm/key-validator.d.ts +25 -0
- package/dist/llm/key-validator.d.ts.map +1 -0
- package/dist/llm/key-validator.js +101 -0
- package/dist/llm/provider-health.d.ts +40 -0
- package/dist/llm/provider-health.d.ts.map +1 -0
- package/dist/llm/provider-health.js +97 -0
- package/dist/llm/providers/anthropic.d.ts +31 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +248 -0
- package/dist/llm/providers/base.d.ts +111 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +6 -0
- package/dist/llm/providers/groq.d.ts +23 -0
- package/dist/llm/providers/groq.d.ts.map +1 -0
- package/dist/llm/providers/groq.js +27 -0
- package/dist/llm/providers/ollama.d.ts +27 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +48 -0
- package/dist/llm/providers/openai.d.ts +19 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +245 -0
- package/dist/llm/providers/vultr.d.ts +18 -0
- package/dist/llm/providers/vultr.d.ts.map +1 -0
- package/dist/llm/providers/vultr.js +168 -0
- package/dist/llm/response-cache.d.ts +166 -0
- package/dist/llm/response-cache.d.ts.map +1 -0
- package/dist/llm/response-cache.js +233 -0
- package/dist/llm/semantic-cache.d.ts +179 -0
- package/dist/llm/semantic-cache.d.ts.map +1 -0
- package/dist/llm/semantic-cache.js +306 -0
- package/dist/llm/server.d.ts +14 -0
- package/dist/llm/server.d.ts.map +1 -0
- package/dist/llm/server.js +15 -0
- package/dist/llm/token-counter.d.ts +48 -0
- package/dist/llm/token-counter.d.ts.map +1 -0
- package/dist/llm/token-counter.js +77 -0
- package/dist/llm/workspace-provider-config.d.ts +38 -0
- package/dist/llm/workspace-provider-config.d.ts.map +1 -0
- package/dist/llm/workspace-provider-config.js +47 -0
- package/dist/memory/agent/context-manager.d.ts +148 -0
- package/dist/memory/agent/context-manager.d.ts.map +1 -0
- package/dist/memory/agent/context-manager.js +284 -0
- package/dist/memory/agent/index.d.ts +7 -0
- package/dist/memory/agent/index.d.ts.map +1 -0
- package/dist/memory/agent/index.js +6 -0
- package/dist/memory/crdt/index.d.ts +13 -0
- package/dist/memory/crdt/index.d.ts.map +1 -0
- package/dist/memory/crdt/index.js +12 -0
- package/dist/memory/crdt/lww-register.d.ts +108 -0
- package/dist/memory/crdt/lww-register.d.ts.map +1 -0
- package/dist/memory/crdt/lww-register.js +169 -0
- package/dist/memory/crdt/or-set.d.ts +141 -0
- package/dist/memory/crdt/or-set.d.ts.map +1 -0
- package/dist/memory/crdt/or-set.js +291 -0
- package/dist/memory/crdt/pn-counter.d.ts +116 -0
- package/dist/memory/crdt/pn-counter.d.ts.map +1 -0
- package/dist/memory/crdt/pn-counter.js +174 -0
- package/dist/memory/crdt/vector-clock.d.ts +115 -0
- package/dist/memory/crdt/vector-clock.d.ts.map +1 -0
- package/dist/memory/crdt/vector-clock.js +179 -0
- package/dist/memory/errors/index.d.ts +56 -0
- package/dist/memory/errors/index.d.ts.map +1 -0
- package/dist/memory/errors/index.js +85 -0
- package/dist/memory/index.d.ts +21 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +20 -0
- package/dist/memory/persistence/crdt-persistence.d.ts +85 -0
- package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -0
- package/dist/memory/persistence/crdt-persistence.js +204 -0
- package/dist/memory/persistence/index.d.ts +7 -0
- package/dist/memory/persistence/index.d.ts.map +1 -0
- package/dist/memory/persistence/index.js +6 -0
- package/dist/memory/preferences/index.d.ts +7 -0
- package/dist/memory/preferences/index.d.ts.map +1 -0
- package/dist/memory/preferences/index.js +6 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts +133 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -0
- package/dist/memory/preferences/user-preferences-manager.js +342 -0
- package/dist/memory/services/index.d.ts +8 -0
- package/dist/memory/services/index.d.ts.map +1 -0
- package/dist/memory/services/index.js +6 -0
- package/dist/memory/services/node-id-service.d.ts +75 -0
- package/dist/memory/services/node-id-service.d.ts.map +1 -0
- package/dist/memory/services/node-id-service.js +190 -0
- package/dist/memory/stores/episodic-memory.d.ts +182 -0
- package/dist/memory/stores/episodic-memory.d.ts.map +1 -0
- package/dist/memory/stores/episodic-memory.js +378 -0
- package/dist/memory/stores/index.d.ts +16 -0
- package/dist/memory/stores/index.d.ts.map +1 -0
- package/dist/memory/stores/index.js +15 -0
- package/dist/memory/stores/procedural-memory.d.ts +89 -0
- package/dist/memory/stores/procedural-memory.d.ts.map +1 -0
- package/dist/memory/stores/procedural-memory.js +152 -0
- package/dist/memory/stores/semantic-memory.d.ts +92 -0
- package/dist/memory/stores/semantic-memory.d.ts.map +1 -0
- package/dist/memory/stores/semantic-memory.js +155 -0
- package/dist/memory/stores/working-memory.d.ts +225 -0
- package/dist/memory/stores/working-memory.d.ts.map +1 -0
- package/dist/memory/stores/working-memory.js +336 -0
- package/dist/memory/utils/deep-clone.d.ts +10 -0
- package/dist/memory/utils/deep-clone.d.ts.map +1 -0
- package/dist/memory/utils/deep-clone.js +9 -0
- package/dist/memory/utils/index.d.ts +8 -0
- package/dist/memory/utils/index.d.ts.map +1 -0
- package/dist/memory/utils/index.js +7 -0
- package/dist/memory/utils/logger.d.ts +21 -0
- package/dist/memory/utils/logger.d.ts.map +1 -0
- package/dist/memory/utils/logger.js +62 -0
- package/dist/memory/utils/sql-helpers.d.ts +97 -0
- package/dist/memory/utils/sql-helpers.d.ts.map +1 -0
- package/dist/memory/utils/sql-helpers.js +214 -0
- package/dist/memory/utils/validation.d.ts +62 -0
- package/dist/memory/utils/validation.d.ts.map +1 -0
- package/dist/memory/utils/validation.js +244 -0
- package/dist/memory/vector/index.d.ts +12 -0
- package/dist/memory/vector/index.d.ts.map +1 -0
- package/dist/memory/vector/index.js +14 -0
- package/dist/memory/vector/vector-memory-service.d.ts +88 -0
- package/dist/memory/vector/vector-memory-service.d.ts.map +1 -0
- package/dist/memory/vector/vector-memory-service.js +335 -0
- package/dist/observability/logger.d.ts +79 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +165 -0
- package/dist/observability/metrics.d.ts +43 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +197 -0
- package/dist/observability/query.d.ts +150 -0
- package/dist/observability/query.d.ts.map +1 -0
- package/dist/observability/query.js +339 -0
- package/dist/observability/types.d.ts +140 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +6 -0
- package/dist/orchestration/agent.d.ts +98 -0
- package/dist/orchestration/agent.d.ts.map +1 -0
- package/dist/orchestration/agent.js +6 -0
- package/dist/orchestration/defaults.d.ts +21 -0
- package/dist/orchestration/defaults.d.ts.map +1 -0
- package/dist/orchestration/defaults.js +22 -0
- package/dist/orchestration/memory-integration.d.ts +58 -0
- package/dist/orchestration/memory-integration.d.ts.map +1 -0
- package/dist/orchestration/memory-integration.js +130 -0
- package/dist/orchestration/orchestrator.d.ts +67 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +174 -0
- package/dist/orchestration/runtime.d.ts +82 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +251 -0
- package/dist/orchestration/streaming-runtime.d.ts +36 -0
- package/dist/orchestration/streaming-runtime.d.ts.map +1 -0
- package/dist/orchestration/streaming-runtime.js +175 -0
- package/dist/orchestration/ticket-agent.d.ts +70 -0
- package/dist/orchestration/ticket-agent.d.ts.map +1 -0
- package/dist/orchestration/ticket-agent.js +146 -0
- package/dist/skills/activation/index.d.ts +7 -0
- package/dist/skills/activation/index.d.ts.map +1 -0
- package/dist/skills/activation/index.js +6 -0
- package/dist/skills/activation/skill-activator.d.ts +68 -0
- package/dist/skills/activation/skill-activator.d.ts.map +1 -0
- package/dist/skills/activation/skill-activator.js +224 -0
- package/dist/skills/catalog/catalog-search.d.ts +55 -0
- package/dist/skills/catalog/catalog-search.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-search.js +111 -0
- package/dist/skills/catalog/catalog-types.d.ts +81 -0
- package/dist/skills/catalog/catalog-types.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-types.js +66 -0
- package/dist/skills/catalog/index.d.ts +9 -0
- package/dist/skills/catalog/index.d.ts.map +1 -0
- package/dist/skills/catalog/index.js +7 -0
- package/dist/skills/catalog/vercel-catalog.d.ts +42 -0
- package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -0
- package/dist/skills/catalog/vercel-catalog.js +189 -0
- package/dist/skills/compat/index.d.ts +9 -0
- package/dist/skills/compat/index.d.ts.map +1 -0
- package/dist/skills/compat/index.js +8 -0
- package/dist/skills/compat/skill-enhancer.d.ts +37 -0
- package/dist/skills/compat/skill-enhancer.d.ts.map +1 -0
- package/dist/skills/compat/skill-enhancer.js +76 -0
- package/dist/skills/compat/tool-mapper.d.ts +61 -0
- package/dist/skills/compat/tool-mapper.d.ts.map +1 -0
- package/dist/skills/compat/tool-mapper.js +168 -0
- package/dist/skills/compat/vercel-compat.d.ts +33 -0
- package/dist/skills/compat/vercel-compat.d.ts.map +1 -0
- package/dist/skills/compat/vercel-compat.js +132 -0
- package/dist/skills/index.d.ts +40 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +47 -0
- package/dist/skills/integration/agent-skill-provider.d.ts +94 -0
- package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -0
- package/dist/skills/integration/agent-skill-provider.js +161 -0
- package/dist/skills/integration/index.d.ts +7 -0
- package/dist/skills/integration/index.d.ts.map +1 -0
- package/dist/skills/integration/index.js +6 -0
- package/dist/skills/loader/github-loader.d.ts +61 -0
- package/dist/skills/loader/github-loader.d.ts.map +1 -0
- package/dist/skills/loader/github-loader.js +176 -0
- package/dist/skills/loader/index.d.ts +10 -0
- package/dist/skills/loader/index.d.ts.map +1 -0
- package/dist/skills/loader/index.js +9 -0
- package/dist/skills/loader/local-loader.d.ts +56 -0
- package/dist/skills/loader/local-loader.d.ts.map +1 -0
- package/dist/skills/loader/local-loader.js +186 -0
- package/dist/skills/loader/vercel-loader.d.ts +64 -0
- package/dist/skills/loader/vercel-loader.d.ts.map +1 -0
- package/dist/skills/loader/vercel-loader.js +313 -0
- package/dist/skills/loader/vercel-types.d.ts +64 -0
- package/dist/skills/loader/vercel-types.d.ts.map +1 -0
- package/dist/skills/loader/vercel-types.js +55 -0
- package/dist/skills/parser/index.d.ts +7 -0
- package/dist/skills/parser/index.d.ts.map +1 -0
- package/dist/skills/parser/index.js +6 -0
- package/dist/skills/parser/skill-md-parser.d.ts +64 -0
- package/dist/skills/parser/skill-md-parser.d.ts.map +1 -0
- package/dist/skills/parser/skill-md-parser.js +242 -0
- package/dist/skills/registry/index.d.ts +7 -0
- package/dist/skills/registry/index.d.ts.map +1 -0
- package/dist/skills/registry/index.js +6 -0
- package/dist/skills/registry/skill-registry.d.ts +133 -0
- package/dist/skills/registry/skill-registry.d.ts.map +1 -0
- package/dist/skills/registry/skill-registry.js +373 -0
- package/dist/skills/types.d.ts +216 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +176 -0
- package/dist/templates/agent-spec.d.ts +138 -0
- package/dist/templates/agent-spec.d.ts.map +1 -0
- package/dist/templates/agent-spec.js +138 -0
- package/dist/templates/index.d.ts +56 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +58 -0
- package/dist/templates/prompt-spec.d.ts +140 -0
- package/dist/templates/prompt-spec.d.ts.map +1 -0
- package/dist/templates/prompt-spec.js +210 -0
- package/dist/templates/skill-spec.d.ts +106 -0
- package/dist/templates/skill-spec.d.ts.map +1 -0
- package/dist/templates/skill-spec.js +119 -0
- package/dist/tools/base.d.ts +74 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +6 -0
- package/dist/tools/cms/collection-tools.d.ts +36 -0
- package/dist/tools/cms/collection-tools.d.ts.map +1 -0
- package/dist/tools/cms/collection-tools.js +178 -0
- package/dist/tools/cms/factory.d.ts +89 -0
- package/dist/tools/cms/factory.d.ts.map +1 -0
- package/dist/tools/cms/factory.js +462 -0
- package/dist/tools/cms/global-tools.d.ts +21 -0
- package/dist/tools/cms/global-tools.d.ts.map +1 -0
- package/dist/tools/cms/global-tools.js +92 -0
- package/dist/tools/cms/index.d.ts +11 -0
- package/dist/tools/cms/index.d.ts.map +1 -0
- package/dist/tools/cms/index.js +11 -0
- package/dist/tools/cms/media-tools.d.ts +31 -0
- package/dist/tools/cms/media-tools.d.ts.map +1 -0
- package/dist/tools/cms/media-tools.js +140 -0
- package/dist/tools/cms/user-tools.d.ts +31 -0
- package/dist/tools/cms/user-tools.d.ts.map +1 -0
- package/dist/tools/cms/user-tools.js +135 -0
- package/dist/tools/deduplicator.d.ts +19 -0
- package/dist/tools/deduplicator.d.ts.map +1 -0
- package/dist/tools/deduplicator.js +53 -0
- package/dist/tools/document-summarizer.d.ts +11 -0
- package/dist/tools/document-summarizer.d.ts.map +1 -0
- package/dist/tools/document-summarizer.js +82 -0
- package/dist/tools/mcp-adapter.d.ts +66 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +152 -0
- package/dist/tools/memory/index.d.ts +3 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +1 -0
- package/dist/tools/memory/store-memory.d.ts +39 -0
- package/dist/tools/memory/store-memory.d.ts.map +1 -0
- package/dist/tools/memory/store-memory.js +94 -0
- package/dist/tools/registry.d.ts +14 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +48 -0
- package/dist/tools/ticket-tools.d.ts +31 -0
- package/dist/tools/ticket-tools.d.ts.map +1 -0
- package/dist/tools/ticket-tools.js +74 -0
- package/dist/tools/web/duck-duck-go.d.ts +52 -0
- package/dist/tools/web/duck-duck-go.d.ts.map +1 -0
- package/dist/tools/web/duck-duck-go.js +202 -0
- package/dist/tools/web/exa.d.ts +34 -0
- package/dist/tools/web/exa.d.ts.map +1 -0
- package/dist/tools/web/exa.js +80 -0
- package/dist/tools/web/index.d.ts +6 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +4 -0
- package/dist/tools/web/scraper.d.ts +9 -0
- package/dist/tools/web/scraper.d.ts.map +1 -0
- package/dist/tools/web/scraper.js +118 -0
- package/dist/tools/web/tavily.d.ts +32 -0
- package/dist/tools/web/tavily.d.ts.map +1 -0
- package/dist/tools/web/tavily.js +73 -0
- package/dist/tools/web/types.d.ts +31 -0
- package/dist/tools/web/types.d.ts.map +1 -0
- package/dist/tools/web/types.js +9 -0
- package/package.json +143 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Cache for LLM Providers
|
|
3
|
+
*
|
|
4
|
+
* Application-level caching for LLM responses. Works with any provider.
|
|
5
|
+
* Provides 100% cost savings on cache hits vs Anthropic's 90% token-level savings.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Vultr (doesn't have prompt caching)
|
|
9
|
+
* - OpenAI (doesn't have prompt caching)
|
|
10
|
+
* - Any provider without built-in caching
|
|
11
|
+
* - Supplement to Anthropic prompt caching for exact duplicates
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - LRU eviction policy
|
|
15
|
+
* - Configurable TTL (default: 5 minutes)
|
|
16
|
+
* - SHA-256 based cache keys
|
|
17
|
+
* - Hit/miss statistics
|
|
18
|
+
* - Memory-efficient storage
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from 'node:crypto';
|
|
21
|
+
import { LRUCache } from 'lru-cache';
|
|
22
|
+
/**
|
|
23
|
+
* Response cache for LLM completions
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const cache = new ResponseCache({ max: 1000, ttl: 5 * 60 * 1000 })
|
|
28
|
+
*
|
|
29
|
+
* const key = cache.getCacheKey(messages, options)
|
|
30
|
+
* const cached = cache.get(key)
|
|
31
|
+
*
|
|
32
|
+
* if (cached) {
|
|
33
|
+
* return { ...cached, cached: true }
|
|
34
|
+
* }
|
|
35
|
+
*
|
|
36
|
+
* const response = await llm.chat(messages, options)
|
|
37
|
+
* cache.set(key, response)
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export class ResponseCache {
|
|
41
|
+
cache;
|
|
42
|
+
stats;
|
|
43
|
+
enableStats;
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
this.enableStats = options.enableStats ?? true;
|
|
46
|
+
this.cache = new LRUCache({
|
|
47
|
+
max: options.max ?? 1000,
|
|
48
|
+
ttl: options.ttl ?? 5 * 60 * 1000, // 5 minutes default
|
|
49
|
+
updateAgeOnGet: true, // Reset TTL on access
|
|
50
|
+
dispose: () => {
|
|
51
|
+
if (this.enableStats) {
|
|
52
|
+
this.stats.evictions++;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
this.stats = {
|
|
57
|
+
hits: 0,
|
|
58
|
+
misses: 0,
|
|
59
|
+
evictions: 0,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate cache key from messages and options
|
|
64
|
+
*
|
|
65
|
+
* Uses SHA-256 hash of JSON-serialized payload for:
|
|
66
|
+
* - Consistent key generation
|
|
67
|
+
* - Fixed-length keys (64 chars)
|
|
68
|
+
* - Security (prevents key enumeration)
|
|
69
|
+
*/
|
|
70
|
+
getCacheKey(messages, options) {
|
|
71
|
+
// Normalize messages (remove non-deterministic fields)
|
|
72
|
+
const normalizedMessages = messages.map((msg) => ({
|
|
73
|
+
role: msg.role,
|
|
74
|
+
content: msg.content,
|
|
75
|
+
name: msg.name,
|
|
76
|
+
toolCallId: msg.toolCallId,
|
|
77
|
+
}));
|
|
78
|
+
const payload = {
|
|
79
|
+
messages: normalizedMessages,
|
|
80
|
+
temperature: options?.temperature,
|
|
81
|
+
maxTokens: options?.maxTokens,
|
|
82
|
+
tools: options?.tools,
|
|
83
|
+
model: options?.model,
|
|
84
|
+
};
|
|
85
|
+
const json = JSON.stringify(payload);
|
|
86
|
+
return createHash('sha256').update(json).digest('hex');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get cached response
|
|
90
|
+
*
|
|
91
|
+
* @returns Cached response or undefined if not found/expired
|
|
92
|
+
*/
|
|
93
|
+
get(key) {
|
|
94
|
+
const cached = this.cache.get(key);
|
|
95
|
+
if (cached) {
|
|
96
|
+
if (this.enableStats) {
|
|
97
|
+
this.stats.hits++;
|
|
98
|
+
}
|
|
99
|
+
return cached;
|
|
100
|
+
}
|
|
101
|
+
if (this.enableStats) {
|
|
102
|
+
this.stats.misses++;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Store response in cache
|
|
108
|
+
*/
|
|
109
|
+
set(key, response) {
|
|
110
|
+
// Ensure timestamp is set
|
|
111
|
+
if (!response.timestamp) {
|
|
112
|
+
response.timestamp = Date.now();
|
|
113
|
+
}
|
|
114
|
+
this.cache.set(key, response);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if key exists in cache (without updating stats)
|
|
118
|
+
*/
|
|
119
|
+
has(key) {
|
|
120
|
+
return this.cache.has(key);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Remove entry from cache
|
|
124
|
+
*/
|
|
125
|
+
delete(key) {
|
|
126
|
+
return this.cache.delete(key);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Clear all cached responses
|
|
130
|
+
*/
|
|
131
|
+
clear() {
|
|
132
|
+
this.cache.clear();
|
|
133
|
+
if (this.enableStats) {
|
|
134
|
+
// Reset stats but preserve eviction count
|
|
135
|
+
this.stats.hits = 0;
|
|
136
|
+
this.stats.misses = 0;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get cache statistics
|
|
141
|
+
*/
|
|
142
|
+
getStats() {
|
|
143
|
+
const totalRequests = this.stats.hits + this.stats.misses;
|
|
144
|
+
const hitRate = totalRequests > 0 ? (this.stats.hits / totalRequests) * 100 : 0;
|
|
145
|
+
return {
|
|
146
|
+
hits: this.stats.hits,
|
|
147
|
+
misses: this.stats.misses,
|
|
148
|
+
evictions: this.stats.evictions,
|
|
149
|
+
hitRate: Math.round(hitRate * 100) / 100, // 2 decimal places
|
|
150
|
+
size: this.cache.size,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Reset statistics
|
|
155
|
+
*/
|
|
156
|
+
resetStats() {
|
|
157
|
+
this.stats = {
|
|
158
|
+
hits: 0,
|
|
159
|
+
misses: 0,
|
|
160
|
+
evictions: 0,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get cache size (number of entries)
|
|
165
|
+
*/
|
|
166
|
+
get size() {
|
|
167
|
+
return this.cache.size;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get maximum cache size
|
|
171
|
+
*/
|
|
172
|
+
get maxSize() {
|
|
173
|
+
return this.cache.max;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Global response cache instance
|
|
178
|
+
* Shared across all LLM client instances in the process
|
|
179
|
+
*/
|
|
180
|
+
let globalCache = null;
|
|
181
|
+
/**
|
|
182
|
+
* Get or create global response cache
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const cache = getGlobalResponseCache()
|
|
187
|
+
* const stats = cache.getStats()
|
|
188
|
+
* // Hit rate: ${stats.hitRate}%
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export function getGlobalResponseCache(options) {
|
|
192
|
+
if (!globalCache) {
|
|
193
|
+
globalCache = new ResponseCache(options);
|
|
194
|
+
}
|
|
195
|
+
return globalCache;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Clear global response cache
|
|
199
|
+
*/
|
|
200
|
+
export function clearGlobalResponseCache() {
|
|
201
|
+
if (globalCache) {
|
|
202
|
+
globalCache.clear();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Calculate cost savings from response caching
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```typescript
|
|
210
|
+
* const stats = cache.getStats()
|
|
211
|
+
* const savings = calculateResponseCacheSavings(stats, {
|
|
212
|
+
* avgInputTokens: 3000,
|
|
213
|
+
* avgOutputTokens: 500,
|
|
214
|
+
* inputCostPerM: 3.0,
|
|
215
|
+
* outputCostPerM: 15.0,
|
|
216
|
+
* })
|
|
217
|
+
*
|
|
218
|
+
* // Saved: $${savings.totalSaved.toFixed(2)}
|
|
219
|
+
* // Avoided ${savings.tokensAvoided.toLocaleString()} tokens
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
export function calculateResponseCacheSavings(stats, pricing) {
|
|
223
|
+
const requestsAvoided = stats.hits;
|
|
224
|
+
const tokensAvoided = (pricing.avgInputTokens + pricing.avgOutputTokens) * requestsAvoided;
|
|
225
|
+
const inputSaved = (requestsAvoided * pricing.avgInputTokens * pricing.inputCostPerM) / 1_000_000;
|
|
226
|
+
const outputSaved = (requestsAvoided * pricing.avgOutputTokens * pricing.outputCostPerM) / 1_000_000;
|
|
227
|
+
const totalSaved = inputSaved + outputSaved;
|
|
228
|
+
return {
|
|
229
|
+
totalSaved,
|
|
230
|
+
tokensAvoided,
|
|
231
|
+
requestsAvoided,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic Cache for LLM Responses
|
|
3
|
+
*
|
|
4
|
+
* Caches responses based on semantic similarity rather than exact matches.
|
|
5
|
+
* Provides 73% cost reduction vs 20% from exact match caching.
|
|
6
|
+
*
|
|
7
|
+
* Key Features:
|
|
8
|
+
* - Vector-based similarity search (cosine similarity)
|
|
9
|
+
* - Configurable similarity threshold (default: 0.95)
|
|
10
|
+
* - Automatic cache warming
|
|
11
|
+
* - TTL-based expiration
|
|
12
|
+
* - Hit/miss statistics
|
|
13
|
+
*
|
|
14
|
+
* Real-world impact:
|
|
15
|
+
* - 73% cost reduction (vs 20% for exact matches)
|
|
16
|
+
* - 96.9% latency reduction on cache hits
|
|
17
|
+
* - 65% cache hit rate (vs 18% for exact matches)
|
|
18
|
+
*
|
|
19
|
+
* Examples of semantic matches:
|
|
20
|
+
* - "How do I reset my password?" ✅ cached
|
|
21
|
+
* - "What's the process to reset my password?" ✅ also cached (same meaning)
|
|
22
|
+
* - "Help me reset my password" ✅ also cached (same meaning)
|
|
23
|
+
*
|
|
24
|
+
* @see https://redis.io/blog/what-is-semantic-caching/
|
|
25
|
+
*/
|
|
26
|
+
import type { Message } from './providers/base.js';
|
|
27
|
+
export interface SemanticCacheOptions {
|
|
28
|
+
/** Similarity threshold for cache hits (0-1, default: 0.95) */
|
|
29
|
+
similarityThreshold?: number;
|
|
30
|
+
/** Time to live in milliseconds (default: 1 hour) */
|
|
31
|
+
ttl?: number;
|
|
32
|
+
/** Enable statistics tracking (default: true) */
|
|
33
|
+
enableStats?: boolean;
|
|
34
|
+
/** User ID for multi-tenant caching */
|
|
35
|
+
userId?: string;
|
|
36
|
+
/** Site ID for multi-tenant caching */
|
|
37
|
+
siteId?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface SemanticCacheStats {
|
|
40
|
+
hits: number;
|
|
41
|
+
misses: number;
|
|
42
|
+
hitRate: number;
|
|
43
|
+
avgSimilarity: number;
|
|
44
|
+
totalQueries: number;
|
|
45
|
+
}
|
|
46
|
+
export interface CachedSemanticResponse {
|
|
47
|
+
query: string;
|
|
48
|
+
response: string;
|
|
49
|
+
embedding: number[];
|
|
50
|
+
similarity: number;
|
|
51
|
+
timestamp: number;
|
|
52
|
+
usage?: {
|
|
53
|
+
promptTokens: number;
|
|
54
|
+
completionTokens: number;
|
|
55
|
+
totalTokens: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Semantic cache that uses vector similarity for intelligent caching
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const cache = new SemanticCache({ similarityThreshold: 0.95 })
|
|
64
|
+
*
|
|
65
|
+
* // Check cache
|
|
66
|
+
* const cached = await cache.get("How do I reset my password?")
|
|
67
|
+
* if (cached) {
|
|
68
|
+
* return cached.response // 100% cost savings!
|
|
69
|
+
* }
|
|
70
|
+
*
|
|
71
|
+
* // Cache miss - call LLM
|
|
72
|
+
* const response = await llm.chat(messages)
|
|
73
|
+
*
|
|
74
|
+
* // Store in cache
|
|
75
|
+
* await cache.set("How do I reset my password?", response)
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare class SemanticCache {
|
|
79
|
+
private vectorService;
|
|
80
|
+
private options;
|
|
81
|
+
private stats;
|
|
82
|
+
private logger;
|
|
83
|
+
constructor(options?: SemanticCacheOptions);
|
|
84
|
+
/**
|
|
85
|
+
* Get cached response for semantically similar query
|
|
86
|
+
*
|
|
87
|
+
* @param query - User query to search for
|
|
88
|
+
* @returns Cached response if similar query found, undefined otherwise
|
|
89
|
+
*/
|
|
90
|
+
get(query: string): Promise<CachedSemanticResponse | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Store response in semantic cache
|
|
93
|
+
*
|
|
94
|
+
* @param query - Original user query
|
|
95
|
+
* @param response - LLM response to cache
|
|
96
|
+
* @param usage - Optional token usage stats
|
|
97
|
+
*/
|
|
98
|
+
set(query: string, response: string, usage?: {
|
|
99
|
+
promptTokens: number;
|
|
100
|
+
completionTokens: number;
|
|
101
|
+
totalTokens: number;
|
|
102
|
+
}): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Extract query text from messages
|
|
105
|
+
*
|
|
106
|
+
* Combines all user messages into a single query string for caching
|
|
107
|
+
*/
|
|
108
|
+
extractQuery(messages: Message[]): string;
|
|
109
|
+
/**
|
|
110
|
+
* Get cache statistics
|
|
111
|
+
*/
|
|
112
|
+
getStats(): SemanticCacheStats;
|
|
113
|
+
/**
|
|
114
|
+
* Reset statistics
|
|
115
|
+
*/
|
|
116
|
+
resetStats(): void;
|
|
117
|
+
/**
|
|
118
|
+
* Clear expired cache entries
|
|
119
|
+
*
|
|
120
|
+
* @returns Number of entries cleared
|
|
121
|
+
*/
|
|
122
|
+
clearExpired(): Promise<number>;
|
|
123
|
+
/**
|
|
124
|
+
* Warm cache with common queries
|
|
125
|
+
*
|
|
126
|
+
* Pre-populate cache with FAQ responses
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* await cache.warmCache([
|
|
131
|
+
* { query: 'How do I reset my password?', response: 'Go to...' },
|
|
132
|
+
* { query: 'What are your hours?', response: 'We are open...' },
|
|
133
|
+
* ])
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
warmCache(entries: Array<{
|
|
137
|
+
query: string;
|
|
138
|
+
response: string;
|
|
139
|
+
}>): Promise<void>;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Calculate cost savings from semantic caching
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const stats = cache.getStats()
|
|
147
|
+
* const savings = calculateSemanticCacheSavings(stats, {
|
|
148
|
+
* avgTokensPerQuery: 3500,
|
|
149
|
+
* costPerMTokens: 3.0,
|
|
150
|
+
* })
|
|
151
|
+
*
|
|
152
|
+
* // Saved: $X.XX, Avoided: N API calls
|
|
153
|
+
* logger.info('Cache savings', { saved: savings.totalSaved, avoided: savings.queriesAvoided })
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function calculateSemanticCacheSavings(stats: SemanticCacheStats, pricing: {
|
|
157
|
+
avgTokensPerQuery: number;
|
|
158
|
+
costPerMTokens: number;
|
|
159
|
+
}): {
|
|
160
|
+
totalSaved: number;
|
|
161
|
+
queriesAvoided: number;
|
|
162
|
+
tokensAvoided: number;
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Get or create global semantic cache
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* const cache = getGlobalSemanticCache({ similarityThreshold: 0.95 })
|
|
170
|
+
* const stats = cache.getStats()
|
|
171
|
+
* // Access stats.hitRate, stats.hits, stats.misses, etc.
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export declare function getGlobalSemanticCache(options?: SemanticCacheOptions): SemanticCache;
|
|
175
|
+
/**
|
|
176
|
+
* Clear global semantic cache
|
|
177
|
+
*/
|
|
178
|
+
export declare function clearGlobalSemanticCache(): void;
|
|
179
|
+
//# sourceMappingURL=semantic-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-cache.d.ts","sourceRoot":"","sources":["../../src/llm/semantic-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAA;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,KAAK,CAIZ;IACD,OAAO,CAAC,MAAM,CAAkC;gBAEpC,OAAO,GAAE,oBAAyB;IAiB9C;;;;;OAKG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAwFrE;;;;;;OAMG;IACG,GAAG,CACP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAA;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;KACpB,GACA,OAAO,CAAC,IAAI,CAAC;IAqChB;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM;IAOzC;;OAEG;IACH,QAAQ,IAAI,kBAAkB;IAmB9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAMrC;;;;;;;;;;;;OAYG;IACG,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE;IACP,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;CACvB,GACA;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;CACtB,CAUA;AAQD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAKpF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|