use std::sync::Arc;
use async_trait::async_trait;
use crate::cm_types::{ChatRequest, Message};
use super::backend::ChatCompletionsBackend;
use super::chat_params::StreamChatParams;
struct SharedChatBackendPtr {
ptr: *const dyn ChatCompletionsBackend,
}
unsafe impl Send for SharedChatBackendPtr {}
unsafe impl Sync for SharedChatBackendPtr {}
#[async_trait]
impl ChatCompletionsBackend for SharedChatBackendPtr {
async fn stream_chat(
&self,
params: &StreamChatParams<'_>,
req: &mut ChatRequest,
) -> Result<(Message, String), Box<dyn std::error::Error + Send + Sync>> {
let backend = unsafe { &*self.ptr };
backend.stream_chat(params, req).await
}
}
pub fn shared_chat_backend(
backend: &(dyn ChatCompletionsBackend + 'static),
) -> Arc<dyn ChatCompletionsBackend> {
Arc::new(SharedChatBackendPtr {
ptr: backend as *const dyn ChatCompletionsBackend,
})
}
pub fn shared_static_chat_backend(
backend: &(dyn ChatCompletionsBackend + 'static),
) -> Arc<dyn ChatCompletionsBackend> {
shared_chat_backend(backend)
}