rag-server-mcp 2.3.3

Sovereign, high-performance RAG MCP server written in Rust for local code and legal search.
use reqwest::Client;
use serde_json::json;
use tracing::{debug, warn};
use std::time::Duration;
use regex::Regex;

const EXPAND_URL: &str = "http://localhost:4000/v1/chat/completions";

pub async fn expand_query(client: &Client, query: &str) -> String {
    let broad_keywords = vec![
        "berätta om", "vad är", "förklara", "beskriv", "vad handlar om",
        "vad innebär", "vad betyder", "hur fungerar", "vad gör",
    ];
    let query_lower = query.to_lowercase();
    let needs_expansion = broad_keywords.iter().any(|kw| query_lower.contains(kw));
    if !needs_expansion {
        return query.to_string();
    }

    debug!("Broad query detected. Expanding: '{}'", query);

    let prompt = format!(
        "Du är en sökmotorsassistent. Generera 3-5 synonymer eller relaterade juridiska/tekniska sökord på svenska \
        för att bredda en sökning på: \"{}\". Svara ENDAST med sökorden separerade med mellanslag. \
        Ingen introduktion, inga punktlistor och inga citattecken.",
        query
    );
    let payload = json!({
        "model": "local-llama-server",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.1,
        "max_tokens": 50,
    });

    match client.post(EXPAND_URL)
        .json(&payload)
        .header("Authorization", "Bearer sk-unused")
        .timeout(Duration::from_secs(3))
        .send()
        .await
    {
        Ok(resp) => {
            if let Ok(data) = resp.json::<serde_json::Value>().await {
                if let Some(content) = data["choices"][0]["message"]["content"].as_str() {
                    let expanded = content.trim();
                    let expanded = Regex::new(r#"["']"#).unwrap().replace_all(expanded, "").to_string();
                    let expanded = expanded.split_whitespace().collect::<Vec<_>>().join(" ");
                    if !expanded.is_empty() && expanded.to_lowercase() != "null" {
                        let optimized = format!("{} {}", query, expanded);
                        debug!("Query expanded to: '{}'", optimized);
                        return optimized;
                    }
                }
            }
        }
        Err(e) => {
            warn!("Query expansion API call failed ({}). Using static fallback.", e);
        }
    }

    let optimized = if query_lower.contains("rf") || query_lower.contains("regeringsform") || query_lower.contains("lag") {
        format!("{} grundlag författning lagstiftning rättskälla paragrafer riksdag", query)
    } else {
        format!("{} definition förklaring sammanfattning bakgrund information", query)
    };
    debug!("Query expanded (fallback) to: '{}'", optimized);
    optimized
}