diff --git a/src/llm/cache.rs b/src/llm/cache.rs index 087d2e400..cb753c8ab 100644 --- a/src/llm/cache.rs +++ b/src/llm/cache.rs @@ -632,10 +632,39 @@ impl EmbeddingService for LocalEmbeddingService { .send() .await?; - let result: Value = response.json().await?; + let status = response.status(); + let response_text = response.text().await?; + + if !status.is_success() { + debug!( + "Embedding service HTTP error {}: {}", + status, + response_text + ); + return Err(format!( + "Embedding service returned HTTP {}: {}", + status, + response_text + ).into()); + } + + let result: Value = serde_json::from_str(&response_text) + .map_err(|e| { + debug!("Failed to parse embedding JSON: {} - Response: {}", e, response_text); + format!("Failed to parse embedding response JSON: {} - Response: {}", e, response_text) + })?; + + if let Some(error) = result.get("error") { + debug!("Embedding service returned error: {}", error); + return Err(format!("Embedding service error: {}", error).into()); + } + let embedding = result["data"][0]["embedding"] .as_array() - .ok_or("Invalid embedding response")? + .ok_or_else(|| { + debug!("Invalid embedding response format. Expected data[0].embedding array. Got: {}", response_text); + format!("Invalid embedding response format - Expected data[0].embedding array, got: {}", response_text) + })? .iter() .filter_map(|v| v.as_f64().map(|f| f as f32)) .collect(); diff --git a/src/main_module/bootstrap.rs b/src/main_module/bootstrap.rs index cf4a0ca12..85a984d4c 100644 --- a/src/main_module/bootstrap.rs +++ b/src/main_module/bootstrap.rs @@ -748,17 +748,27 @@ fn init_llm_provider( let embedding_model = config_manager .get_config(&bot_id, "embedding-model", Some("all-MiniLM-L6-v2")) .unwrap_or_else(|_| "all-MiniLM-L6-v2".to_string()); + let semantic_cache_enabled = config_manager + .get_config(&bot_id, "semantic-cache-enabled", Some("true")) + .unwrap_or_else(|_| "true".to_string()) + .to_lowercase() == "true"; + info!("Embedding URL: {}", embedding_url); info!("Embedding Model: {}", embedding_model); + info!("Semantic Cache Enabled: {}", semantic_cache_enabled); - let embedding_service = Some(Arc::new(LocalEmbeddingService::new( - embedding_url, - embedding_model, - )) as Arc); + let embedding_service = if semantic_cache_enabled { + Some(Arc::new(LocalEmbeddingService::new( + embedding_url, + embedding_model, + )) as Arc) + } else { + None + }; let cache_config = CacheConfig { ttl: 3600, - semantic_matching: true, + semantic_matching: semantic_cache_enabled, similarity_threshold: 0.85, max_similarity_checks: 100, key_prefix: "llm_cache".to_string(),