From 832facf5ef4aed96b14dd7ea1eec862d0aa1bdf4 Mon Sep 17 00:00:00 2001 From: Edvard Date: Thu, 19 Feb 2026 15:10:25 -0500 Subject: [PATCH] fix(memory): add openrouter as recognized embedding provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The embedding provider factory only recognized "openai" and "custom:*", causing "openrouter" to silently fall through to NoopEmbedding. This made vector/semantic search completely non-functional — memory recall fell back to BM25 keyword-only matching, with 70% of the hybrid score always returning zero. Route "openrouter" through OpenAiEmbedding with the OpenRouter API base URL (https://openrouter.ai/api/v1), which is OpenAI-compatible. Co-Authored-By: Claude Opus 4.6 --- src/memory/embeddings.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/memory/embeddings.rs b/src/memory/embeddings.rs index 058d077..4557ed4 100644 --- a/src/memory/embeddings.rs +++ b/src/memory/embeddings.rs @@ -172,6 +172,15 @@ pub fn create_embedding_provider( dims, )) } + "openrouter" => { + let key = api_key.unwrap_or(""); + Box::new(OpenAiEmbedding::new( + "https://openrouter.ai/api/v1", + key, + model, + dims, + )) + } name if name.starts_with("custom:") => { let base_url = name.strip_prefix("custom:").unwrap_or(""); let key = api_key.unwrap_or(""); @@ -212,6 +221,18 @@ mod tests { assert_eq!(p.dimensions(), 1536); } + #[test] + fn factory_openrouter() { + let p = create_embedding_provider( + "openrouter", + Some("sk-or-test"), + "openai/text-embedding-3-small", + 1536, + ); + assert_eq!(p.name(), "openai"); // uses OpenAiEmbedding internally + assert_eq!(p.dimensions(), 1536); + } + #[test] fn factory_custom_url() { let p = create_embedding_provider("custom:http://localhost:1234", None, "model", 768); @@ -281,6 +302,20 @@ mod tests { assert_eq!(p.dimensions(), 384); } + #[test] + fn embeddings_url_openrouter() { + let p = OpenAiEmbedding::new( + "https://openrouter.ai/api/v1", + "key", + "openai/text-embedding-3-small", + 1536, + ); + assert_eq!( + p.embeddings_url(), + "https://openrouter.ai/api/v1/embeddings" + ); + } + #[test] fn embeddings_url_standard_openai() { let p = OpenAiEmbedding::new("https://api.openai.com", "key", "model", 1536);