quorumrag 0.1.0

Quorum-based retrieval-augmented generation: fuse multiple retrievers and keep only the evidence they agree on.
Documentation
use anyhow::Result;
use reqwest::Client;
use serde::{Deserialize, Serialize};

#[derive(Serialize)]
struct GenerateRequest {
    model: String,
    prompt: String,
    stream: bool,
}

#[derive(Deserialize)]
struct GenerateResponse {
    response: String,
}

pub struct Generator {
    client: Client,
    url: String,
    model: String,
}

impl Generator {
    pub fn new(base_url: &str, model: &str) -> Self {
        Self {
            client: Client::new(),
            url: format!("{}/api/generate", base_url),
            model: model.to_string(),
        }
    }

    pub async fn generate(&self, context: &str, question: &str) -> Result<String> {
        let prompt = format!(
            "Use the following evidence to answer the question.\n\nEvidence:\n{}\n\nQuestion: {}\n\nAnswer:",
            context, question
        );

        let response = self
            .client
            .post(&self.url)
            .json(&GenerateRequest {
                model: self.model.clone(),
                prompt,
                stream: false,
            })
            .send()
            .await?
            .json::<GenerateResponse>()
            .await?;

        Ok(response.response)
    }
}