ai_lib/provider/
chat_provider.rs

1use async_trait::async_trait;
2use futures::stream::Stream;
3
4use crate::api::ChatCompletionChunk;
5pub use crate::api::ChatProvider;
6use crate::types::{AiLibError, ChatCompletionRequest, ChatCompletionResponse};
7
8pub struct AdapterProvider {
9    name: String,
10    inner: Box<dyn ChatProvider>,
11}
12
13impl AdapterProvider {
14    pub fn new(name: impl Into<String>, inner: Box<dyn ChatProvider>) -> Self {
15        Self {
16            name: name.into(),
17            inner,
18        }
19    }
20
21    pub fn boxed(self) -> Box<dyn ChatProvider> {
22        Box::new(self)
23    }
24}
25
26#[async_trait]
27impl ChatProvider for AdapterProvider {
28    fn name(&self) -> &str {
29        &self.name
30    }
31
32    async fn chat(
33        &self,
34        request: ChatCompletionRequest,
35    ) -> Result<ChatCompletionResponse, AiLibError> {
36        self.inner.chat(request).await
37    }
38
39    async fn stream(
40        &self,
41        request: ChatCompletionRequest,
42    ) -> Result<
43        Box<dyn Stream<Item = Result<ChatCompletionChunk, AiLibError>> + Send + Unpin>,
44        AiLibError,
45    > {
46        self.inner.stream(request).await
47    }
48
49    async fn batch(
50        &self,
51        requests: Vec<ChatCompletionRequest>,
52        concurrency_limit: Option<usize>,
53    ) -> Result<Vec<Result<ChatCompletionResponse, AiLibError>>, AiLibError> {
54        self.inner.batch(requests, concurrency_limit).await
55    }
56
57    async fn list_models(&self) -> Result<Vec<String>, AiLibError> {
58        self.inner.list_models().await
59    }
60
61    async fn get_model_info(&self, model_id: &str) -> Result<crate::api::ModelInfo, AiLibError> {
62        self.inner.get_model_info(model_id).await
63    }
64}