lsp-ai 0.7.0

LSP-AI is an open-source language server that serves as a backend for AI-powered functionality, designed to assist and empower software engineers, not replace them.
use crate::config::ValidEmbeddingModel;

mod ollama;

fn normalize(mut vector: Vec<f32>) -> Vec<f32> {
    let magnitude = (vector.iter().map(|&x| x * x).sum::<f32>()).sqrt();

    if magnitude != 0.0 {
        for element in &mut vector {
            *element /= magnitude;
        }
    }

    vector
}

#[derive(Clone, Copy)]
pub(crate) enum EmbeddingPurpose {
    Storage,
    Retrieval,
}

#[async_trait::async_trait]
pub(crate) trait EmbeddingModel {
    async fn embed(
        &self,
        batch: Vec<&str>,
        purpose: EmbeddingPurpose,
    ) -> anyhow::Result<Vec<Vec<f32>>>;
}

impl TryFrom<ValidEmbeddingModel> for Box<dyn EmbeddingModel + Send + Sync> {
    type Error = anyhow::Error;

    fn try_from(value: ValidEmbeddingModel) -> Result<Self, Self::Error> {
        match value {
            ValidEmbeddingModel::Ollama(config) => Ok(Box::new(ollama::Ollama::new(config))),
        }
    }
}