ai_lib/provider/
chat_provider.rs1use 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}