@framers/agentos 0.1.120 → 0.1.121
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 +21 -0
- package/dist/api/agency.d.ts.map +1 -1
- package/dist/api/agency.js +227 -84
- package/dist/api/agency.js.map +1 -1
- package/dist/api/analyzeVideo.d.ts +127 -0
- package/dist/api/analyzeVideo.d.ts.map +1 -0
- package/dist/api/analyzeVideo.js +136 -0
- package/dist/api/analyzeVideo.js.map +1 -0
- package/dist/api/detectScenes.d.ts +82 -0
- package/dist/api/detectScenes.d.ts.map +1 -0
- package/dist/api/detectScenes.js +67 -0
- package/dist/api/detectScenes.js.map +1 -0
- package/dist/api/generateImage.d.ts +7 -0
- package/dist/api/generateImage.d.ts.map +1 -1
- package/dist/api/generateImage.js +133 -9
- package/dist/api/generateImage.js.map +1 -1
- package/dist/api/generateMusic.d.ts +98 -0
- package/dist/api/generateMusic.d.ts.map +1 -0
- package/dist/api/generateMusic.js +319 -0
- package/dist/api/generateMusic.js.map +1 -0
- package/dist/api/generateSFX.d.ts +96 -0
- package/dist/api/generateSFX.d.ts.map +1 -0
- package/dist/api/generateSFX.js +317 -0
- package/dist/api/generateSFX.js.map +1 -0
- package/dist/api/generateVideo.d.ts +113 -0
- package/dist/api/generateVideo.d.ts.map +1 -0
- package/dist/api/generateVideo.js +342 -0
- package/dist/api/generateVideo.js.map +1 -0
- package/dist/api/model.d.ts.map +1 -1
- package/dist/api/model.js +8 -4
- package/dist/api/model.js.map +1 -1
- package/dist/api/performOCR.d.ts +169 -0
- package/dist/api/performOCR.d.ts.map +1 -0
- package/dist/api/performOCR.js +198 -0
- package/dist/api/performOCR.js.map +1 -0
- package/dist/api/provider-defaults.d.ts +7 -5
- package/dist/api/provider-defaults.d.ts.map +1 -1
- package/dist/api/provider-defaults.js +32 -10
- package/dist/api/provider-defaults.js.map +1 -1
- package/dist/api/strategies/debate.d.ts.map +1 -1
- package/dist/api/strategies/debate.js +1 -0
- package/dist/api/strategies/debate.js.map +1 -1
- package/dist/api/strategies/graph.d.ts.map +1 -1
- package/dist/api/strategies/graph.js +69 -13
- package/dist/api/strategies/graph.js.map +1 -1
- package/dist/api/strategies/hierarchical.d.ts.map +1 -1
- package/dist/api/strategies/hierarchical.js +1 -0
- package/dist/api/strategies/hierarchical.js.map +1 -1
- package/dist/api/strategies/parallel.d.ts.map +1 -1
- package/dist/api/strategies/parallel.js +1 -0
- package/dist/api/strategies/parallel.js.map +1 -1
- package/dist/api/strategies/review-loop.d.ts.map +1 -1
- package/dist/api/strategies/review-loop.js +1 -0
- package/dist/api/strategies/review-loop.js.map +1 -1
- package/dist/api/strategies/sequential.d.ts.map +1 -1
- package/dist/api/strategies/sequential.js +54 -48
- package/dist/api/strategies/sequential.js.map +1 -1
- package/dist/api/streamBuffer.d.ts +20 -0
- package/dist/api/streamBuffer.d.ts.map +1 -0
- package/dist/api/streamBuffer.js +81 -0
- package/dist/api/streamBuffer.js.map +1 -0
- package/dist/api/types.d.ts +145 -5
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -1
- package/dist/core/audio/AudioProcessor.d.ts.map +1 -1
- package/dist/core/audio/AudioProcessor.js +1 -0
- package/dist/core/audio/AudioProcessor.js.map +1 -1
- package/dist/core/audio/EnvironmentalCalibrator.d.ts.map +1 -1
- package/dist/core/audio/EnvironmentalCalibrator.js +1 -0
- package/dist/core/audio/EnvironmentalCalibrator.js.map +1 -1
- package/dist/core/audio/FallbackAudioProxy.d.ts +169 -0
- package/dist/core/audio/FallbackAudioProxy.d.ts.map +1 -0
- package/dist/core/audio/FallbackAudioProxy.js +236 -0
- package/dist/core/audio/FallbackAudioProxy.js.map +1 -0
- package/dist/core/audio/IAudioGenerator.d.ts +103 -0
- package/dist/core/audio/IAudioGenerator.d.ts.map +1 -0
- package/dist/core/audio/IAudioGenerator.js +24 -0
- package/dist/core/audio/IAudioGenerator.js.map +1 -0
- package/dist/core/audio/index.d.ts +54 -0
- package/dist/core/audio/index.d.ts.map +1 -1
- package/dist/core/audio/index.js +93 -0
- package/dist/core/audio/index.js.map +1 -1
- package/dist/core/audio/providers/AudioGenLocalProvider.d.ts +136 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.js +235 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.js.map +1 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts +107 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.js +154 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.js.map +1 -0
- package/dist/core/audio/providers/FalAudioProvider.d.ts +207 -0
- package/dist/core/audio/providers/FalAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/FalAudioProvider.js +315 -0
- package/dist/core/audio/providers/FalAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.d.ts +136 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.js +235 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.js.map +1 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.d.ts +200 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.js +346 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/StableAudioProvider.d.ts +138 -0
- package/dist/core/audio/providers/StableAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/StableAudioProvider.js +192 -0
- package/dist/core/audio/providers/StableAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/SunoProvider.d.ts +182 -0
- package/dist/core/audio/providers/SunoProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/SunoProvider.js +312 -0
- package/dist/core/audio/providers/SunoProvider.js.map +1 -0
- package/dist/core/audio/providers/UdioProvider.d.ts +177 -0
- package/dist/core/audio/providers/UdioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/UdioProvider.js +305 -0
- package/dist/core/audio/providers/UdioProvider.js.map +1 -0
- package/dist/core/audio/types.d.ts +257 -0
- package/dist/core/audio/types.d.ts.map +1 -0
- package/dist/core/audio/types.js +21 -0
- package/dist/core/audio/types.js.map +1 -0
- package/dist/core/images/FallbackImageProxy.d.ts +183 -0
- package/dist/core/images/FallbackImageProxy.d.ts.map +1 -0
- package/dist/core/images/FallbackImageProxy.js +283 -0
- package/dist/core/images/FallbackImageProxy.js.map +1 -0
- package/dist/core/images/IImageProvider.d.ts +1 -1
- package/dist/core/images/IImageProvider.d.ts.map +1 -1
- package/dist/core/images/index.d.ts +1 -0
- package/dist/core/images/index.d.ts.map +1 -1
- package/dist/core/images/index.js +1 -0
- package/dist/core/images/index.js.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts +3 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.js +8 -0
- package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts +52 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js +36 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts +32 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.js +27 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.js.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts +38 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js +128 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts +107 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js +504 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts +60 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.js +177 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.js.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts +55 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.js +447 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.js.map +1 -0
- package/dist/core/media/ProviderPreferences.d.ts +158 -0
- package/dist/core/media/ProviderPreferences.d.ts.map +1 -0
- package/dist/core/media/ProviderPreferences.js +183 -0
- package/dist/core/media/ProviderPreferences.js.map +1 -0
- package/dist/core/subprocess/CLIRegistry.d.ts +71 -0
- package/dist/core/subprocess/CLIRegistry.d.ts.map +1 -0
- package/dist/core/subprocess/CLIRegistry.js +210 -0
- package/dist/core/subprocess/CLIRegistry.js.map +1 -0
- package/dist/core/subprocess/CLISubprocessBridge.d.ts +117 -0
- package/dist/core/subprocess/CLISubprocessBridge.d.ts.map +1 -0
- package/dist/core/subprocess/CLISubprocessBridge.js +199 -0
- package/dist/core/subprocess/CLISubprocessBridge.js.map +1 -0
- package/dist/core/subprocess/errors.d.ts +76 -0
- package/dist/core/subprocess/errors.d.ts.map +1 -0
- package/dist/core/subprocess/errors.js +75 -0
- package/dist/core/subprocess/errors.js.map +1 -0
- package/dist/core/subprocess/index.d.ts +11 -0
- package/dist/core/subprocess/index.d.ts.map +1 -0
- package/dist/core/subprocess/index.js +10 -0
- package/dist/core/subprocess/index.js.map +1 -0
- package/dist/core/subprocess/types.d.ts +100 -0
- package/dist/core/subprocess/types.d.ts.map +1 -0
- package/dist/core/subprocess/types.js +9 -0
- package/dist/core/subprocess/types.js.map +1 -0
- package/dist/core/video/FallbackVideoProxy.d.ts +166 -0
- package/dist/core/video/FallbackVideoProxy.d.ts.map +1 -0
- package/dist/core/video/FallbackVideoProxy.js +228 -0
- package/dist/core/video/FallbackVideoProxy.js.map +1 -0
- package/dist/core/video/IVideoAnalyzer.d.ts +29 -0
- package/dist/core/video/IVideoAnalyzer.d.ts.map +1 -0
- package/dist/core/video/IVideoAnalyzer.js +12 -0
- package/dist/core/video/IVideoAnalyzer.js.map +1 -0
- package/dist/core/video/IVideoGenerator.d.ts +76 -0
- package/dist/core/video/IVideoGenerator.d.ts.map +1 -0
- package/dist/core/video/IVideoGenerator.js +13 -0
- package/dist/core/video/IVideoGenerator.js.map +1 -0
- package/dist/core/video/VideoAnalyzer.d.ts +278 -0
- package/dist/core/video/VideoAnalyzer.d.ts.map +1 -0
- package/dist/core/video/VideoAnalyzer.js +648 -0
- package/dist/core/video/VideoAnalyzer.js.map +1 -0
- package/dist/core/video/index.d.ts +55 -0
- package/dist/core/video/index.d.ts.map +1 -0
- package/dist/core/video/index.js +78 -0
- package/dist/core/video/index.js.map +1 -0
- package/dist/core/video/providers/FalVideoProvider.d.ts +195 -0
- package/dist/core/video/providers/FalVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/FalVideoProvider.js +322 -0
- package/dist/core/video/providers/FalVideoProvider.js.map +1 -0
- package/dist/core/video/providers/ReplicateVideoProvider.d.ts +194 -0
- package/dist/core/video/providers/ReplicateVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/ReplicateVideoProvider.js +356 -0
- package/dist/core/video/providers/ReplicateVideoProvider.js.map +1 -0
- package/dist/core/video/providers/RunwayVideoProvider.d.ts +175 -0
- package/dist/core/video/providers/RunwayVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/RunwayVideoProvider.js +293 -0
- package/dist/core/video/providers/RunwayVideoProvider.js.map +1 -0
- package/dist/core/video/types.d.ts +441 -0
- package/dist/core/video/types.d.ts.map +1 -0
- package/dist/core/video/types.js +10 -0
- package/dist/core/video/types.js.map +1 -0
- package/dist/core/vision/SceneDetector.d.ts +180 -0
- package/dist/core/vision/SceneDetector.d.ts.map +1 -0
- package/dist/core/vision/SceneDetector.js +366 -0
- package/dist/core/vision/SceneDetector.js.map +1 -0
- package/dist/core/vision/index.d.ts +2 -1
- package/dist/core/vision/index.d.ts.map +1 -1
- package/dist/core/vision/index.js +1 -0
- package/dist/core/vision/index.js.map +1 -1
- package/dist/core/vision/types.d.ts +125 -0
- package/dist/core/vision/types.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +32 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +46 -0
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/extensions/MultiRegistryLoader.js.map +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/CognitiveMemoryManager.d.ts +40 -0
- package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -1
- package/dist/memory/CognitiveMemoryManager.js +54 -1
- package/dist/memory/CognitiveMemoryManager.js.map +1 -1
- package/dist/memory/facade/Memory.d.ts +4 -0
- package/dist/memory/facade/Memory.d.ts.map +1 -1
- package/dist/memory/facade/Memory.js +140 -4
- package/dist/memory/facade/Memory.js.map +1 -1
- package/dist/memory/facade/types.d.ts +30 -2
- package/dist/memory/facade/types.d.ts.map +1 -1
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/types.d.ts +15 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/query-router/QueryClassifier.d.ts +192 -21
- package/dist/query-router/QueryClassifier.d.ts.map +1 -1
- package/dist/query-router/QueryClassifier.js +604 -23
- package/dist/query-router/QueryClassifier.js.map +1 -1
- package/dist/query-router/QueryDispatcher.d.ts +106 -8
- package/dist/query-router/QueryDispatcher.d.ts.map +1 -1
- package/dist/query-router/QueryDispatcher.js +387 -8
- package/dist/query-router/QueryDispatcher.js.map +1 -1
- package/dist/query-router/QueryRouter.d.ts +198 -14
- package/dist/query-router/QueryRouter.d.ts.map +1 -1
- package/dist/query-router/QueryRouter.js +738 -50
- package/dist/query-router/QueryRouter.js.map +1 -1
- package/dist/query-router/index.d.ts +1 -1
- package/dist/query-router/index.d.ts.map +1 -1
- package/dist/query-router/index.js +1 -1
- package/dist/query-router/index.js.map +1 -1
- package/dist/query-router/types.d.ts +396 -3
- package/dist/query-router/types.d.ts.map +1 -1
- package/dist/query-router/types.js +35 -0
- package/dist/query-router/types.js.map +1 -1
- package/dist/rag/HydeRetriever.d.ts +108 -0
- package/dist/rag/HydeRetriever.d.ts.map +1 -1
- package/dist/rag/HydeRetriever.js +184 -0
- package/dist/rag/HydeRetriever.js.map +1 -1
- package/dist/rag/IRetrievalAugmentor.d.ts +15 -0
- package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.d.ts +58 -0
- package/dist/rag/RetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.js +200 -32
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- package/dist/rag/VectorStoreManager.js +1 -1
- package/dist/rag/audit/RAGAuditCollector.d.ts +7 -0
- package/dist/rag/audit/RAGAuditCollector.d.ts.map +1 -1
- package/dist/rag/audit/RAGAuditCollector.js +10 -0
- package/dist/rag/audit/RAGAuditCollector.js.map +1 -1
- package/dist/rag/audit/RAGAuditTypes.d.ts +10 -1
- package/dist/rag/audit/RAGAuditTypes.d.ts.map +1 -1
- package/dist/rag/chunking/SemanticChunker.d.ts +210 -0
- package/dist/rag/chunking/SemanticChunker.d.ts.map +1 -0
- package/dist/rag/chunking/SemanticChunker.js +460 -0
- package/dist/rag/chunking/SemanticChunker.js.map +1 -0
- package/dist/rag/chunking/index.d.ts +10 -0
- package/dist/rag/chunking/index.d.ts.map +1 -0
- package/dist/rag/chunking/index.js +10 -0
- package/dist/rag/chunking/index.js.map +1 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts +103 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.js +315 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.js.map +1 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts +107 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.js +438 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.js.map +1 -0
- package/dist/rag/index.d.ts +15 -1
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +32 -0
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/migration/MigrationEngine.d.ts +47 -0
- package/dist/rag/migration/MigrationEngine.d.ts.map +1 -0
- package/dist/rag/migration/MigrationEngine.js +168 -0
- package/dist/rag/migration/MigrationEngine.js.map +1 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts +23 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.js +63 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts +30 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.js +71 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts +38 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.js +114 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts +36 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.js +109 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts +35 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.js +110 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts +37 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.js +72 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts +47 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.js +93 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.js.map +1 -0
- package/dist/rag/migration/types.d.ts +108 -0
- package/dist/rag/migration/types.d.ts.map +1 -0
- package/dist/rag/migration/types.js +11 -0
- package/dist/rag/migration/types.js.map +1 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts +35 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts.map +1 -1
- package/dist/rag/multimodal/MultimodalIndexer.js +66 -1
- package/dist/rag/multimodal/MultimodalIndexer.js.map +1 -1
- package/dist/rag/multimodal/types.d.ts +24 -0
- package/dist/rag/multimodal/types.d.ts.map +1 -1
- package/dist/rag/raptor/RaptorTree.d.ts +268 -0
- package/dist/rag/raptor/RaptorTree.d.ts.map +1 -0
- package/dist/rag/raptor/RaptorTree.js +443 -0
- package/dist/rag/raptor/RaptorTree.js.map +1 -0
- package/dist/rag/raptor/index.d.ts +11 -0
- package/dist/rag/raptor/index.d.ts.map +1 -0
- package/dist/rag/raptor/index.js +11 -0
- package/dist/rag/raptor/index.js.map +1 -0
- package/dist/rag/reranking/providers/CohereReranker.js.map +1 -1
- package/dist/rag/search/BM25Index.d.ts +282 -0
- package/dist/rag/search/BM25Index.d.ts.map +1 -0
- package/dist/rag/search/BM25Index.js +344 -0
- package/dist/rag/search/BM25Index.js.map +1 -0
- package/dist/rag/search/HybridSearcher.d.ts +198 -0
- package/dist/rag/search/HybridSearcher.d.ts.map +1 -0
- package/dist/rag/search/HybridSearcher.js +316 -0
- package/dist/rag/search/HybridSearcher.js.map +1 -0
- package/dist/rag/search/index.d.ts +12 -0
- package/dist/rag/search/index.d.ts.map +1 -0
- package/dist/rag/search/index.js +12 -0
- package/dist/rag/search/index.js.map +1 -0
- package/dist/rag/setup/DockerDetector.d.ts +67 -0
- package/dist/rag/setup/DockerDetector.d.ts.map +1 -0
- package/dist/rag/setup/DockerDetector.js +125 -0
- package/dist/rag/setup/DockerDetector.js.map +1 -0
- package/dist/rag/setup/PostgresSetup.d.ts +20 -0
- package/dist/rag/setup/PostgresSetup.d.ts.map +1 -0
- package/dist/rag/setup/PostgresSetup.js +133 -0
- package/dist/rag/setup/PostgresSetup.js.map +1 -0
- package/dist/rag/setup/QdrantSetup.d.ts +26 -0
- package/dist/rag/setup/QdrantSetup.d.ts.map +1 -0
- package/dist/rag/setup/QdrantSetup.js +96 -0
- package/dist/rag/setup/QdrantSetup.js.map +1 -0
- package/dist/rag/setup/types.d.ts +55 -0
- package/dist/rag/setup/types.d.ts.map +1 -0
- package/dist/rag/setup/types.js +6 -0
- package/dist/rag/setup/types.js.map +1 -0
- package/dist/rag/unified/UnifiedRetriever.d.ts +472 -0
- package/dist/rag/unified/UnifiedRetriever.d.ts.map +1 -0
- package/dist/rag/unified/UnifiedRetriever.js +887 -0
- package/dist/rag/unified/UnifiedRetriever.js.map +1 -0
- package/dist/rag/unified/index.d.ts +24 -0
- package/dist/rag/unified/index.d.ts.map +1 -0
- package/dist/rag/unified/index.js +23 -0
- package/dist/rag/unified/index.js.map +1 -0
- package/dist/rag/unified/types.d.ts +546 -0
- package/dist/rag/unified/types.d.ts.map +1 -0
- package/dist/rag/unified/types.js +177 -0
- package/dist/rag/unified/types.js.map +1 -0
- package/dist/speech/providers/AssemblyAISTTProvider.js.map +1 -1
- package/dist/speech/providers/AzureSpeechSTTProvider.js.map +1 -1
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +1 -1
- package/dist/speech/providers/DeepgramBatchSTTProvider.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview BM25 sparse keyword index for hybrid retrieval.
|
|
3
|
+
*
|
|
4
|
+
* Dense embeddings excel at semantic similarity but miss exact keyword matches
|
|
5
|
+
* (e.g., error codes, function names, product IDs). BM25 catches these by
|
|
6
|
+
* scoring documents based on term frequency, inverse document frequency,
|
|
7
|
+
* and document length normalization.
|
|
8
|
+
*
|
|
9
|
+
* Used alongside vector search in a hybrid fusion strategy:
|
|
10
|
+
* - Vector search handles semantic "what does this mean?" queries
|
|
11
|
+
* - BM25 handles lexical "find this exact thing" queries
|
|
12
|
+
* - Reciprocal Rank Fusion (RRF) merges both result sets
|
|
13
|
+
*
|
|
14
|
+
* The BM25 ranking function is:
|
|
15
|
+
* ```
|
|
16
|
+
* score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Where:
|
|
20
|
+
* - `k1` controls term frequency saturation (default 1.2)
|
|
21
|
+
* - `b` controls document length normalization (default 0.75)
|
|
22
|
+
* - `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)` (Robertson-Walker IDF)
|
|
23
|
+
*
|
|
24
|
+
* @module agentos/rag/search/BM25Index
|
|
25
|
+
* @see HybridSearcher for combining BM25 with dense vector search
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Internal document representation stored in the BM25 index.
|
|
29
|
+
*
|
|
30
|
+
* @interface BM25Document
|
|
31
|
+
* @property {string} id - Unique document identifier.
|
|
32
|
+
* @property {number} length - Number of tokens in the document after tokenization.
|
|
33
|
+
* @property {Record<string, unknown>} [metadata] - Optional metadata attached to the document.
|
|
34
|
+
*/
|
|
35
|
+
export interface BM25Document {
|
|
36
|
+
/** Unique document identifier. */
|
|
37
|
+
id: string;
|
|
38
|
+
/** Number of tokens in the document after tokenization. */
|
|
39
|
+
length: number;
|
|
40
|
+
/** Optional metadata attached to the document. */
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A single BM25 search result with relevance score.
|
|
45
|
+
*
|
|
46
|
+
* @interface BM25Result
|
|
47
|
+
* @property {string} id - Document identifier.
|
|
48
|
+
* @property {number} score - BM25 relevance score (higher = more relevant).
|
|
49
|
+
* @property {Record<string, unknown>} [metadata] - Document metadata if available.
|
|
50
|
+
*/
|
|
51
|
+
export interface BM25Result {
|
|
52
|
+
/** Document identifier. */
|
|
53
|
+
id: string;
|
|
54
|
+
/** BM25 relevance score (higher = more relevant). */
|
|
55
|
+
score: number;
|
|
56
|
+
/** Document metadata if available. */
|
|
57
|
+
metadata?: Record<string, unknown>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Configuration options for the BM25 index.
|
|
61
|
+
*
|
|
62
|
+
* @interface BM25Config
|
|
63
|
+
* @property {number} [k1=1.2] - Term saturation parameter. Higher values increase
|
|
64
|
+
* the influence of term frequency. Range: 1.2-2.0 typical.
|
|
65
|
+
* @property {number} [b=0.75] - Document length normalization factor.
|
|
66
|
+
* 0 = no normalization, 1 = full normalization. Range: 0-1.
|
|
67
|
+
*/
|
|
68
|
+
export interface BM25Config {
|
|
69
|
+
/** Term saturation parameter. Default: 1.2. */
|
|
70
|
+
k1?: number;
|
|
71
|
+
/** Document length normalization factor. Default: 0.75. */
|
|
72
|
+
b?: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Index statistics for monitoring and debugging.
|
|
76
|
+
*
|
|
77
|
+
* @interface BM25Stats
|
|
78
|
+
* @property {number} documentCount - Total documents in the index.
|
|
79
|
+
* @property {number} termCount - Total unique terms across all documents.
|
|
80
|
+
* @property {number} avgDocLength - Average document length in tokens.
|
|
81
|
+
*/
|
|
82
|
+
export interface BM25Stats {
|
|
83
|
+
/** Total documents in the index. */
|
|
84
|
+
documentCount: number;
|
|
85
|
+
/** Total unique terms across all documents. */
|
|
86
|
+
termCount: number;
|
|
87
|
+
/** Average document length in tokens. */
|
|
88
|
+
avgDocLength: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* BM25 sparse keyword index for hybrid retrieval.
|
|
92
|
+
*
|
|
93
|
+
* Dense embeddings excel at semantic similarity but miss exact keyword matches
|
|
94
|
+
* (e.g., error codes, function names, product IDs). BM25 catches these by
|
|
95
|
+
* scoring documents based on term frequency, inverse document frequency,
|
|
96
|
+
* and document length normalization.
|
|
97
|
+
*
|
|
98
|
+
* @example Basic usage
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const index = new BM25Index({ k1: 1.5, b: 0.75 });
|
|
101
|
+
*
|
|
102
|
+
* index.addDocuments([
|
|
103
|
+
* { id: 'doc-1', text: 'TypeScript compiler error TS2304' },
|
|
104
|
+
* { id: 'doc-2', text: 'JavaScript runtime TypeError explanation' },
|
|
105
|
+
* { id: 'doc-3', text: 'Fix error TS2304 by adding type declarations' },
|
|
106
|
+
* ]);
|
|
107
|
+
*
|
|
108
|
+
* const results = index.search('error TS2304', 5);
|
|
109
|
+
* // results[0].id === 'doc-3' (exact match on "error" + "TS2304")
|
|
110
|
+
* // results[1].id === 'doc-1' (exact match on "error" + "TS2304")
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @example Combined with HybridSearcher
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const hybrid = new HybridSearcher(vectorStore, embeddingManager, bm25Index, {
|
|
116
|
+
* denseWeight: 0.7,
|
|
117
|
+
* sparseWeight: 0.3,
|
|
118
|
+
* });
|
|
119
|
+
* const results = await hybrid.search('What does error TS2304 mean?');
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export declare class BM25Index {
|
|
123
|
+
/** Term saturation parameter (typical range: 1.2-2.0). */
|
|
124
|
+
private k1;
|
|
125
|
+
/** Document length normalization (0 = none, 1 = full). */
|
|
126
|
+
private b;
|
|
127
|
+
/** Map of document ID to internal document representation. */
|
|
128
|
+
private documents;
|
|
129
|
+
/**
|
|
130
|
+
* Inverted index mapping each term to a map of document IDs and their
|
|
131
|
+
* raw term frequencies: `term -> { docId -> termFrequency }`.
|
|
132
|
+
*/
|
|
133
|
+
private invertedIndex;
|
|
134
|
+
/**
|
|
135
|
+
* Pre-computed IDF (Inverse Document Frequency) for each indexed term.
|
|
136
|
+
* Recomputed when documents are added or removed.
|
|
137
|
+
*/
|
|
138
|
+
private idf;
|
|
139
|
+
/** Average document length across the entire corpus (in tokens). */
|
|
140
|
+
private avgDocLength;
|
|
141
|
+
/** Whether the IDF cache needs recomputation. */
|
|
142
|
+
private idfDirty;
|
|
143
|
+
/**
|
|
144
|
+
* Creates a new BM25 index.
|
|
145
|
+
*
|
|
146
|
+
* @param {BM25Config} [config] - Optional BM25 tuning parameters.
|
|
147
|
+
* @param {number} [config.k1=1.2] - Term saturation parameter.
|
|
148
|
+
* @param {number} [config.b=0.75] - Document length normalization.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* // Use defaults (k1=1.2, b=0.75)
|
|
153
|
+
* const index = new BM25Index();
|
|
154
|
+
*
|
|
155
|
+
* // Custom parameters for short documents
|
|
156
|
+
* const shortDocIndex = new BM25Index({ k1: 1.5, b: 0.5 });
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
constructor(config?: BM25Config);
|
|
160
|
+
/**
|
|
161
|
+
* Tokenizes raw text into an array of normalized terms.
|
|
162
|
+
*
|
|
163
|
+
* Processing pipeline:
|
|
164
|
+
* 1. Convert to lowercase
|
|
165
|
+
* 2. Split on whitespace and punctuation boundaries
|
|
166
|
+
* 3. Filter out stop words and tokens shorter than 2 characters
|
|
167
|
+
*
|
|
168
|
+
* @param {string} text - Raw text to tokenize.
|
|
169
|
+
* @returns {string[]} Array of normalized tokens.
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* // "The Quick Brown FOX!" -> ["quick", "brown", "fox"]
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
private tokenize;
|
|
177
|
+
/**
|
|
178
|
+
* Recomputes IDF values for all terms in the index.
|
|
179
|
+
*
|
|
180
|
+
* Uses the Robertson-Walker IDF formula:
|
|
181
|
+
* `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)`
|
|
182
|
+
*
|
|
183
|
+
* Where:
|
|
184
|
+
* - N = total number of documents
|
|
185
|
+
* - n(t) = number of documents containing term t
|
|
186
|
+
*
|
|
187
|
+
* The `+ 1` prevents negative IDF values for extremely common terms.
|
|
188
|
+
*/
|
|
189
|
+
private recomputeIdf;
|
|
190
|
+
/**
|
|
191
|
+
* Adds a single document to the BM25 index.
|
|
192
|
+
*
|
|
193
|
+
* The text is tokenized, stop words are removed, and term frequencies
|
|
194
|
+
* are recorded in the inverted index. IDF values are lazily recomputed
|
|
195
|
+
* on the next search.
|
|
196
|
+
*
|
|
197
|
+
* @param {string} id - Unique document identifier.
|
|
198
|
+
* @param {string} text - Document text content to index.
|
|
199
|
+
* @param {Record<string, unknown>} [metadata] - Optional metadata to store.
|
|
200
|
+
* @throws {Error} If `id` is empty or `text` is empty.
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* index.addDocument('readme', 'AgentOS is a framework for building AI agents');
|
|
205
|
+
* index.addDocument('changelog', 'v2.0: Added BM25 hybrid search', { version: '2.0' });
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
addDocument(id: string, text: string, metadata?: Record<string, unknown>): void;
|
|
209
|
+
/**
|
|
210
|
+
* Adds multiple documents to the index in a single batch.
|
|
211
|
+
*
|
|
212
|
+
* More efficient than calling {@link addDocument} repeatedly because
|
|
213
|
+
* IDF recomputation is deferred until the next search.
|
|
214
|
+
*
|
|
215
|
+
* @param {Array<{ id: string; text: string; metadata?: Record<string, unknown> }>} docs
|
|
216
|
+
* Array of documents to index.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```typescript
|
|
220
|
+
* index.addDocuments([
|
|
221
|
+
* { id: 'doc-1', text: 'First document content' },
|
|
222
|
+
* { id: 'doc-2', text: 'Second document content', metadata: { source: 'api' } },
|
|
223
|
+
* ]);
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
addDocuments(docs: Array<{
|
|
227
|
+
id: string;
|
|
228
|
+
text: string;
|
|
229
|
+
metadata?: Record<string, unknown>;
|
|
230
|
+
}>): void;
|
|
231
|
+
/**
|
|
232
|
+
* Searches the BM25 index for documents matching the query.
|
|
233
|
+
*
|
|
234
|
+
* Scoring formula per document D and query Q:
|
|
235
|
+
* ```
|
|
236
|
+
* score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
|
|
237
|
+
* ```
|
|
238
|
+
*
|
|
239
|
+
* @param {string} query - Search query text.
|
|
240
|
+
* @param {number} [topK=10] - Maximum number of results to return.
|
|
241
|
+
* @returns {BM25Result[]} Array of results sorted by BM25 score descending.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* const results = index.search('typescript error TS2304', 5);
|
|
246
|
+
* for (const r of results) {
|
|
247
|
+
* console.log(`${r.id}: score=${r.score.toFixed(4)}`);
|
|
248
|
+
* }
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
search(query: string, topK?: number): BM25Result[];
|
|
252
|
+
/**
|
|
253
|
+
* Removes a document from the index by its ID.
|
|
254
|
+
*
|
|
255
|
+
* Cleans up all term frequency entries in the inverted index and
|
|
256
|
+
* marks IDF for recomputation.
|
|
257
|
+
*
|
|
258
|
+
* @param {string} id - Document ID to remove.
|
|
259
|
+
* @returns {boolean} `true` if the document existed and was removed, `false` otherwise.
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```typescript
|
|
263
|
+
* const removed = index.removeDocument('doc-obsolete');
|
|
264
|
+
* console.log(removed ? 'Removed' : 'Not found');
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
removeDocument(id: string): boolean;
|
|
268
|
+
/**
|
|
269
|
+
* Returns current index statistics.
|
|
270
|
+
*
|
|
271
|
+
* @returns {BM25Stats} Object containing document count, term count,
|
|
272
|
+
* and average document length.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const stats = index.getStats();
|
|
277
|
+
* console.log(`${stats.documentCount} docs, ${stats.termCount} unique terms`);
|
|
278
|
+
* ```
|
|
279
|
+
*/
|
|
280
|
+
getStats(): BM25Stats;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=BM25Index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BM25Index.d.ts","sourceRoot":"","sources":["../../../src/rag/search/BM25Index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;CACtB;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,SAAS;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAS;IAEnB,0DAA0D;IAC1D,OAAO,CAAC,CAAC,CAAS;IAElB,8DAA8D;IAC9D,OAAO,CAAC,SAAS,CAA4B;IAE7C;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAmC;IAExD;;;OAGG;IACH,OAAO,CAAC,GAAG,CAAsB;IAEjC,oEAAoE;IACpE,OAAO,CAAC,YAAY,CAAS;IAE7B,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAU;IAE1B;;;;;;;;;;;;;;;OAeG;gBACS,MAAM,CAAC,EAAE,UAAU;IAU/B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqC/E;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CACV,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAC5E,IAAI;IAMP;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,UAAU,EAAE;IAyCtD;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiBnC;;;;;;;;;;;OAWG;IACH,QAAQ,IAAI,SAAS;CAUtB"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview BM25 sparse keyword index for hybrid retrieval.
|
|
3
|
+
*
|
|
4
|
+
* Dense embeddings excel at semantic similarity but miss exact keyword matches
|
|
5
|
+
* (e.g., error codes, function names, product IDs). BM25 catches these by
|
|
6
|
+
* scoring documents based on term frequency, inverse document frequency,
|
|
7
|
+
* and document length normalization.
|
|
8
|
+
*
|
|
9
|
+
* Used alongside vector search in a hybrid fusion strategy:
|
|
10
|
+
* - Vector search handles semantic "what does this mean?" queries
|
|
11
|
+
* - BM25 handles lexical "find this exact thing" queries
|
|
12
|
+
* - Reciprocal Rank Fusion (RRF) merges both result sets
|
|
13
|
+
*
|
|
14
|
+
* The BM25 ranking function is:
|
|
15
|
+
* ```
|
|
16
|
+
* score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Where:
|
|
20
|
+
* - `k1` controls term frequency saturation (default 1.2)
|
|
21
|
+
* - `b` controls document length normalization (default 0.75)
|
|
22
|
+
* - `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)` (Robertson-Walker IDF)
|
|
23
|
+
*
|
|
24
|
+
* @module agentos/rag/search/BM25Index
|
|
25
|
+
* @see HybridSearcher for combining BM25 with dense vector search
|
|
26
|
+
*/
|
|
27
|
+
// ── Stop Words ────────────────────────────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Common English stop words excluded from indexing and querying.
|
|
30
|
+
* These words occur so frequently they provide minimal discriminative value
|
|
31
|
+
* in BM25 scoring and only inflate index size.
|
|
32
|
+
*/
|
|
33
|
+
const STOP_WORDS = new Set([
|
|
34
|
+
'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
35
|
+
'of', 'with', 'by', 'from', 'is', 'it', 'as', 'was', 'are', 'be',
|
|
36
|
+
'been', 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will',
|
|
37
|
+
'would', 'could', 'should', 'may', 'might', 'shall', 'can', 'need',
|
|
38
|
+
'dare', 'ought', 'used', 'not', 'no', 'nor', 'so', 'if', 'then',
|
|
39
|
+
'than', 'too', 'very', 'just', 'about', 'above', 'after', 'again',
|
|
40
|
+
'all', 'also', 'am', 'any', 'because', 'before', 'between', 'both',
|
|
41
|
+
'each', 'few', 'further', 'get', 'got', 'he', 'her', 'here', 'him',
|
|
42
|
+
'his', 'how', 'i', 'into', 'its', 'let', 'me', 'more', 'most', 'my',
|
|
43
|
+
'new', 'now', 'off', 'old', 'once', 'only', 'other', 'our', 'out',
|
|
44
|
+
'own', 'part', 'per', 'put', 'said', 'same', 'she', 'some', 'still',
|
|
45
|
+
'such', 'take', 'that', 'their', 'them', 'these', 'they', 'this',
|
|
46
|
+
'those', 'through', 'under', 'until', 'up', 'us', 'want', 'we',
|
|
47
|
+
'well', 'what', 'when', 'where', 'which', 'while', 'who', 'whom',
|
|
48
|
+
'why', 'you', 'your',
|
|
49
|
+
]);
|
|
50
|
+
// ── BM25 Index ────────────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* BM25 sparse keyword index for hybrid retrieval.
|
|
53
|
+
*
|
|
54
|
+
* Dense embeddings excel at semantic similarity but miss exact keyword matches
|
|
55
|
+
* (e.g., error codes, function names, product IDs). BM25 catches these by
|
|
56
|
+
* scoring documents based on term frequency, inverse document frequency,
|
|
57
|
+
* and document length normalization.
|
|
58
|
+
*
|
|
59
|
+
* @example Basic usage
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const index = new BM25Index({ k1: 1.5, b: 0.75 });
|
|
62
|
+
*
|
|
63
|
+
* index.addDocuments([
|
|
64
|
+
* { id: 'doc-1', text: 'TypeScript compiler error TS2304' },
|
|
65
|
+
* { id: 'doc-2', text: 'JavaScript runtime TypeError explanation' },
|
|
66
|
+
* { id: 'doc-3', text: 'Fix error TS2304 by adding type declarations' },
|
|
67
|
+
* ]);
|
|
68
|
+
*
|
|
69
|
+
* const results = index.search('error TS2304', 5);
|
|
70
|
+
* // results[0].id === 'doc-3' (exact match on "error" + "TS2304")
|
|
71
|
+
* // results[1].id === 'doc-1' (exact match on "error" + "TS2304")
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* @example Combined with HybridSearcher
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const hybrid = new HybridSearcher(vectorStore, embeddingManager, bm25Index, {
|
|
77
|
+
* denseWeight: 0.7,
|
|
78
|
+
* sparseWeight: 0.3,
|
|
79
|
+
* });
|
|
80
|
+
* const results = await hybrid.search('What does error TS2304 mean?');
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export class BM25Index {
|
|
84
|
+
/**
|
|
85
|
+
* Creates a new BM25 index.
|
|
86
|
+
*
|
|
87
|
+
* @param {BM25Config} [config] - Optional BM25 tuning parameters.
|
|
88
|
+
* @param {number} [config.k1=1.2] - Term saturation parameter.
|
|
89
|
+
* @param {number} [config.b=0.75] - Document length normalization.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* // Use defaults (k1=1.2, b=0.75)
|
|
94
|
+
* const index = new BM25Index();
|
|
95
|
+
*
|
|
96
|
+
* // Custom parameters for short documents
|
|
97
|
+
* const shortDocIndex = new BM25Index({ k1: 1.5, b: 0.5 });
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
constructor(config) {
|
|
101
|
+
this.k1 = config?.k1 ?? 1.2;
|
|
102
|
+
this.b = config?.b ?? 0.75;
|
|
103
|
+
this.documents = new Map();
|
|
104
|
+
this.invertedIndex = new Map();
|
|
105
|
+
this.idf = new Map();
|
|
106
|
+
this.avgDocLength = 0;
|
|
107
|
+
this.idfDirty = false;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Tokenizes raw text into an array of normalized terms.
|
|
111
|
+
*
|
|
112
|
+
* Processing pipeline:
|
|
113
|
+
* 1. Convert to lowercase
|
|
114
|
+
* 2. Split on whitespace and punctuation boundaries
|
|
115
|
+
* 3. Filter out stop words and tokens shorter than 2 characters
|
|
116
|
+
*
|
|
117
|
+
* @param {string} text - Raw text to tokenize.
|
|
118
|
+
* @returns {string[]} Array of normalized tokens.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* // "The Quick Brown FOX!" -> ["quick", "brown", "fox"]
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
tokenize(text) {
|
|
126
|
+
return text
|
|
127
|
+
.toLowerCase()
|
|
128
|
+
.split(/[\s\-_.,;:!?'"()\[\]{}<>\/\\|@#$%^&*~`+=]+/)
|
|
129
|
+
.filter((token) => token.length >= 2 && !STOP_WORDS.has(token));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Recomputes IDF values for all terms in the index.
|
|
133
|
+
*
|
|
134
|
+
* Uses the Robertson-Walker IDF formula:
|
|
135
|
+
* `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)`
|
|
136
|
+
*
|
|
137
|
+
* Where:
|
|
138
|
+
* - N = total number of documents
|
|
139
|
+
* - n(t) = number of documents containing term t
|
|
140
|
+
*
|
|
141
|
+
* The `+ 1` prevents negative IDF values for extremely common terms.
|
|
142
|
+
*/
|
|
143
|
+
recomputeIdf() {
|
|
144
|
+
if (!this.idfDirty)
|
|
145
|
+
return;
|
|
146
|
+
const N = this.documents.size;
|
|
147
|
+
this.idf.clear();
|
|
148
|
+
for (const [term, docMap] of this.invertedIndex) {
|
|
149
|
+
const n = docMap.size;
|
|
150
|
+
// Robertson-Walker IDF: log((N - n + 0.5) / (n + 0.5) + 1)
|
|
151
|
+
this.idf.set(term, Math.log((N - n + 0.5) / (n + 0.5) + 1));
|
|
152
|
+
}
|
|
153
|
+
// Recompute average document length
|
|
154
|
+
if (N === 0) {
|
|
155
|
+
this.avgDocLength = 0;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
let totalLength = 0;
|
|
159
|
+
for (const doc of this.documents.values()) {
|
|
160
|
+
totalLength += doc.length;
|
|
161
|
+
}
|
|
162
|
+
this.avgDocLength = totalLength / N;
|
|
163
|
+
}
|
|
164
|
+
this.idfDirty = false;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Adds a single document to the BM25 index.
|
|
168
|
+
*
|
|
169
|
+
* The text is tokenized, stop words are removed, and term frequencies
|
|
170
|
+
* are recorded in the inverted index. IDF values are lazily recomputed
|
|
171
|
+
* on the next search.
|
|
172
|
+
*
|
|
173
|
+
* @param {string} id - Unique document identifier.
|
|
174
|
+
* @param {string} text - Document text content to index.
|
|
175
|
+
* @param {Record<string, unknown>} [metadata] - Optional metadata to store.
|
|
176
|
+
* @throws {Error} If `id` is empty or `text` is empty.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* index.addDocument('readme', 'AgentOS is a framework for building AI agents');
|
|
181
|
+
* index.addDocument('changelog', 'v2.0: Added BM25 hybrid search', { version: '2.0' });
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
addDocument(id, text, metadata) {
|
|
185
|
+
if (!id)
|
|
186
|
+
throw new Error('BM25Index.addDocument: id must not be empty.');
|
|
187
|
+
if (!text)
|
|
188
|
+
throw new Error('BM25Index.addDocument: text must not be empty.');
|
|
189
|
+
// Remove previous version if exists
|
|
190
|
+
if (this.documents.has(id)) {
|
|
191
|
+
this.removeDocument(id);
|
|
192
|
+
}
|
|
193
|
+
const tokens = this.tokenize(text);
|
|
194
|
+
// Count term frequencies for this document
|
|
195
|
+
const termFreqs = new Map();
|
|
196
|
+
for (const token of tokens) {
|
|
197
|
+
termFreqs.set(token, (termFreqs.get(token) ?? 0) + 1);
|
|
198
|
+
}
|
|
199
|
+
// Store document metadata
|
|
200
|
+
this.documents.set(id, {
|
|
201
|
+
id,
|
|
202
|
+
length: tokens.length,
|
|
203
|
+
metadata,
|
|
204
|
+
});
|
|
205
|
+
// Update inverted index
|
|
206
|
+
for (const [term, freq] of termFreqs) {
|
|
207
|
+
let docMap = this.invertedIndex.get(term);
|
|
208
|
+
if (!docMap) {
|
|
209
|
+
docMap = new Map();
|
|
210
|
+
this.invertedIndex.set(term, docMap);
|
|
211
|
+
}
|
|
212
|
+
docMap.set(id, freq);
|
|
213
|
+
}
|
|
214
|
+
this.idfDirty = true;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Adds multiple documents to the index in a single batch.
|
|
218
|
+
*
|
|
219
|
+
* More efficient than calling {@link addDocument} repeatedly because
|
|
220
|
+
* IDF recomputation is deferred until the next search.
|
|
221
|
+
*
|
|
222
|
+
* @param {Array<{ id: string; text: string; metadata?: Record<string, unknown> }>} docs
|
|
223
|
+
* Array of documents to index.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```typescript
|
|
227
|
+
* index.addDocuments([
|
|
228
|
+
* { id: 'doc-1', text: 'First document content' },
|
|
229
|
+
* { id: 'doc-2', text: 'Second document content', metadata: { source: 'api' } },
|
|
230
|
+
* ]);
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
addDocuments(docs) {
|
|
234
|
+
for (const doc of docs) {
|
|
235
|
+
this.addDocument(doc.id, doc.text, doc.metadata);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Searches the BM25 index for documents matching the query.
|
|
240
|
+
*
|
|
241
|
+
* Scoring formula per document D and query Q:
|
|
242
|
+
* ```
|
|
243
|
+
* score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
|
|
244
|
+
* ```
|
|
245
|
+
*
|
|
246
|
+
* @param {string} query - Search query text.
|
|
247
|
+
* @param {number} [topK=10] - Maximum number of results to return.
|
|
248
|
+
* @returns {BM25Result[]} Array of results sorted by BM25 score descending.
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* const results = index.search('typescript error TS2304', 5);
|
|
253
|
+
* for (const r of results) {
|
|
254
|
+
* console.log(`${r.id}: score=${r.score.toFixed(4)}`);
|
|
255
|
+
* }
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
search(query, topK = 10) {
|
|
259
|
+
// Ensure IDF is up-to-date
|
|
260
|
+
this.recomputeIdf();
|
|
261
|
+
const queryTokens = this.tokenize(query);
|
|
262
|
+
if (queryTokens.length === 0)
|
|
263
|
+
return [];
|
|
264
|
+
const scores = new Map();
|
|
265
|
+
for (const term of queryTokens) {
|
|
266
|
+
const idfValue = this.idf.get(term);
|
|
267
|
+
if (idfValue === undefined)
|
|
268
|
+
continue;
|
|
269
|
+
const docMap = this.invertedIndex.get(term);
|
|
270
|
+
if (!docMap)
|
|
271
|
+
continue;
|
|
272
|
+
for (const [docId, tf] of docMap) {
|
|
273
|
+
const doc = this.documents.get(docId);
|
|
274
|
+
const dl = doc.length;
|
|
275
|
+
const avgdl = this.avgDocLength || 1;
|
|
276
|
+
// BM25 score for this term in this document
|
|
277
|
+
const numerator = tf * (this.k1 + 1);
|
|
278
|
+
const denominator = tf + this.k1 * (1 - this.b + this.b * (dl / avgdl));
|
|
279
|
+
const termScore = idfValue * (numerator / denominator);
|
|
280
|
+
scores.set(docId, (scores.get(docId) ?? 0) + termScore);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Sort by score descending and return top K
|
|
284
|
+
const results = [];
|
|
285
|
+
for (const [id, score] of scores) {
|
|
286
|
+
const doc = this.documents.get(id);
|
|
287
|
+
results.push({ id, score, metadata: doc.metadata });
|
|
288
|
+
}
|
|
289
|
+
results.sort((a, b) => b.score - a.score);
|
|
290
|
+
return results.slice(0, topK);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Removes a document from the index by its ID.
|
|
294
|
+
*
|
|
295
|
+
* Cleans up all term frequency entries in the inverted index and
|
|
296
|
+
* marks IDF for recomputation.
|
|
297
|
+
*
|
|
298
|
+
* @param {string} id - Document ID to remove.
|
|
299
|
+
* @returns {boolean} `true` if the document existed and was removed, `false` otherwise.
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* ```typescript
|
|
303
|
+
* const removed = index.removeDocument('doc-obsolete');
|
|
304
|
+
* console.log(removed ? 'Removed' : 'Not found');
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
removeDocument(id) {
|
|
308
|
+
const doc = this.documents.get(id);
|
|
309
|
+
if (!doc)
|
|
310
|
+
return false;
|
|
311
|
+
// Remove all entries for this document from the inverted index
|
|
312
|
+
for (const [term, docMap] of this.invertedIndex) {
|
|
313
|
+
docMap.delete(id);
|
|
314
|
+
if (docMap.size === 0) {
|
|
315
|
+
this.invertedIndex.delete(term);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
this.documents.delete(id);
|
|
319
|
+
this.idfDirty = true;
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Returns current index statistics.
|
|
324
|
+
*
|
|
325
|
+
* @returns {BM25Stats} Object containing document count, term count,
|
|
326
|
+
* and average document length.
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* const stats = index.getStats();
|
|
331
|
+
* console.log(`${stats.documentCount} docs, ${stats.termCount} unique terms`);
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
getStats() {
|
|
335
|
+
// Ensure avgDocLength is current
|
|
336
|
+
this.recomputeIdf();
|
|
337
|
+
return {
|
|
338
|
+
documentCount: this.documents.size,
|
|
339
|
+
termCount: this.invertedIndex.size,
|
|
340
|
+
avgDocLength: this.avgDocLength,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=BM25Index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BM25Index.js","sourceRoot":"","sources":["../../../src/rag/search/BM25Index.ts"],"names":[],"mappings":"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"}
|