fix: add explicit embedding initialization with error logging

When embeddings fail to initialize in the MCP server context (e.g., due
to working directory issues), the error was silently swallowed and
smart_ingest would fall back to regular ingest without explanation.

Changes:
- Add init_embeddings() method to Storage for explicit initialization
- Initialize embeddings at MCP server startup with error logging
- Add check_ready() method to EmbeddingService for error access
- Log warning when is_ready() returns false

Now users will see clear error messages like:
"Failed to initialize embedding service: ..."
"Hint: Check FASTEMBED_CACHE_PATH or ensure ~/.fastembed_cache exists"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Sam Valladares 2026-01-27 01:04:06 -06:00
parent 6ccbc7d2c0
commit f10367ecd0
3 changed files with 40 additions and 2 deletions

View file

@ -186,7 +186,18 @@ impl EmbeddingService {
/// Check if the model is ready
pub fn is_ready(&self) -> bool {
get_model().is_ok()
match get_model() {
Ok(_) => true,
Err(e) => {
tracing::warn!("Embedding model not ready: {}", e);
false
}
}
}
/// Check if the model is ready and return the error if not
pub fn check_ready(&self) -> Result<(), EmbeddingError> {
get_model().map(|_| ())
}
/// Initialize the model (downloads if necessary)

View file

@ -1072,6 +1072,20 @@ impl Storage {
false
}
/// Initialize the embedding service explicitly
/// Call this at startup to catch initialization errors early
#[cfg(feature = "embeddings")]
pub fn init_embeddings(&mut self) -> Result<()> {
self.embedding_service.init().map_err(|e| {
StorageError::Init(format!("Embedding service initialization failed: {}", e))
})
}
#[cfg(not(feature = "embeddings"))]
pub fn init_embeddings(&mut self) -> Result<()> {
Ok(()) // No-op when embeddings feature is disabled
}
/// Get query embedding from cache or compute it
#[cfg(feature = "embeddings")]
fn get_query_embedding(&self, query: &str) -> Result<Vec<f32>> {