markhor_core 0.1.0-alpha.0.2

Core library for Markhor, a project connecting AI models, documents, and workflows for knowledge work
Documentation
use std::sync::Arc;

use serde::{Deserialize, Serialize};

use crate::{chat::{chat::ChatApi, prompter::Prompter}, chunking::Chunker, convert::Converter, embedding::Embedder};

use super::{Extension, F11y, FunctionalityType};


#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ExtensionConfig {

}

#[derive(Clone)]
pub struct ActiveExtension {
    inner: Arc<(Box<dyn Extension>, ExtensionConfig)>,
}

impl ActiveExtension {
    pub fn new(extension: impl Extension + 'static, config: ExtensionConfig) -> Self {
        Self {
            inner: Arc::new((Box::new(extension), config)),
        }
    }

    fn extension(&self) -> &dyn Extension {
        &*self.inner.0
    }

    fn config(&self) -> &ExtensionConfig {
        &self.inner.1
    }

    pub fn uri(&self) -> &str {
        self.extension().uri()
    }

    pub fn name(&self) -> &str {
        self.extension().name()
    }

    pub fn description(&self) -> &str {
        self.extension().description()
    }

    pub fn chat_providers(&self) -> impl Iterator<Item = F11y<dyn ChatApi>> {
        self.extension().chat_model().into_iter().map(|model| F11y {
            trait_object: model,
            functionality_type: FunctionalityType::ChatProvider,
            extension: self.clone(),
        })
    }

    pub fn embedders(&self) -> impl Iterator<Item = F11y<dyn Embedder>> {
        self.extension().embedding_model().into_iter().map(|model| F11y {
            trait_object: model,
            functionality_type: FunctionalityType::Embedder,
            extension: self.clone(),
        })
    }

    pub fn chunkers(&self) -> impl Iterator<Item = F11y<dyn Chunker>> {
        self.extension().chunker().into_iter().map(|model| F11y {
            trait_object: model,
            functionality_type: FunctionalityType::Chunker,
            extension: self.clone(),
        })
    }

    pub fn converters(&self) -> impl Iterator<Item = F11y<dyn Converter>> {
        self.extension().converter().into_iter().map(|model| F11y {
            trait_object: model,
            functionality_type: FunctionalityType::Converter,
            extension: self.clone(),
        })
    }

    pub fn prompters(&self) -> impl Iterator<Item = F11y<dyn Prompter>> {
        self.extension().prompters().into_iter().map(|model| F11y {
            trait_object: model,
            functionality_type: FunctionalityType::Prompter,
            extension: self.clone(),
        })
    }
}