swiftide-integrations 0.33.0

Composable LLM agents, typed task graphs, and streaming RAG pipelines in Rust
Documentation
use async_trait::async_trait;
use swiftide_core::chat_completion::errors::LanguageModelError;
use swiftide_core::{SparseEmbedding, SparseEmbeddingModel, SparseEmbeddings};

use super::{EmbeddingModelType, FastEmbed};
#[async_trait]
impl SparseEmbeddingModel for FastEmbed {
    #[tracing::instrument(skip_all)]
    async fn sparse_embed(
        &self,
        input: Vec<String>,
    ) -> Result<SparseEmbeddings, LanguageModelError> {
        let mut embedding_model = self.embedding_model.lock().await;

        match &mut *embedding_model {
            EmbeddingModelType::Sparse(model) => model
                .embed(input, self.batch_size)
                .map_err(LanguageModelError::permanent)
                .and_then(|embeddings| {
                    embeddings
                        .into_iter()
                        .map(|embedding| {
                            let indices = embedding
                                .indices
                                .iter()
                                .map(|v| u32::try_from(*v).map_err(LanguageModelError::permanent))
                                .collect::<Result<Vec<_>, LanguageModelError>>()?;

                            Ok(SparseEmbedding {
                                indices,
                                values: embedding.values,
                            })
                        })
                        .collect()
                }),
            EmbeddingModelType::Dense(_) => Err(LanguageModelError::PermanentError(
                "Expected sparse model, got dense".into(),
            )),
        }
    }
}