ai-lib 0.4.0

A unified AI SDK for Rust providing a single interface for multiple AI providers with hybrid architecture
Documentation
use async_trait::async_trait;
use futures::stream::Stream;

use crate::api::ChatCompletionChunk;
pub use crate::api::ChatProvider;
use crate::types::{AiLibError, ChatCompletionRequest, ChatCompletionResponse};

pub struct AdapterProvider {
    name: String,
    inner: Box<dyn ChatProvider>,
}

impl AdapterProvider {
    pub fn new(name: impl Into<String>, inner: Box<dyn ChatProvider>) -> Self {
        Self {
            name: name.into(),
            inner,
        }
    }

    pub fn boxed(self) -> Box<dyn ChatProvider> {
        Box::new(self)
    }
}

#[async_trait]
impl ChatProvider for AdapterProvider {
    fn name(&self) -> &str {
        &self.name
    }

    async fn chat(
        &self,
        request: ChatCompletionRequest,
    ) -> Result<ChatCompletionResponse, AiLibError> {
        self.inner.chat(request).await
    }

    async fn stream(
        &self,
        request: ChatCompletionRequest,
    ) -> Result<
        Box<dyn Stream<Item = Result<ChatCompletionChunk, AiLibError>> + Send + Unpin>,
        AiLibError,
    > {
        self.inner.stream(request).await
    }

    async fn batch(
        &self,
        requests: Vec<ChatCompletionRequest>,
        concurrency_limit: Option<usize>,
    ) -> Result<Vec<Result<ChatCompletionResponse, AiLibError>>, AiLibError> {
        self.inner.batch(requests, concurrency_limit).await
    }

    async fn list_models(&self) -> Result<Vec<String>, AiLibError> {
        self.inner.list_models().await
    }

    async fn get_model_info(&self, model_id: &str) -> Result<crate::api::ModelInfo, AiLibError> {
        self.inner.get_model_info(model_id).await
    }
}