use crate::client::OpenModex;
use crate::error::Error;
use crate::streaming::ChatCompletionStream;
use crate::types::{ChatCompletionRequest, ChatCompletionResponse};
#[derive(Debug)]
pub struct ChatService<'a> {
client: &'a OpenModex,
}
impl<'a> ChatService<'a> {
pub(crate) fn new(client: &'a OpenModex) -> Self {
Self { client }
}
pub fn completions(&self) -> ChatCompletions<'_> {
ChatCompletions {
client: self.client,
}
}
}
#[derive(Debug)]
pub struct ChatCompletions<'a> {
client: &'a OpenModex,
}
impl<'a> ChatCompletions<'a> {
pub async fn create(
&self,
mut req: ChatCompletionRequest,
) -> Result<ChatCompletionResponse, Error> {
if req.model.is_empty() {
if let Some(ref default) = self.client.default_model {
req.model = default.clone();
}
}
req.stream = Some(false);
let model = req.model.clone();
self.client
.with_fallback(&model, |m| {
let mut r = req.clone();
r.model = m;
let client = self.client;
async move { client.post("/chat/completions", &r).await }
})
.await
}
pub async fn create_stream(
&self,
mut req: ChatCompletionRequest,
) -> Result<ChatCompletionStream, Error> {
if req.model.is_empty() {
if let Some(ref default) = self.client.default_model {
req.model = default.clone();
}
}
req.stream = Some(true);
let model = req.model.clone();
self.client
.with_fallback(&model, |m| {
let mut r = req.clone();
r.model = m;
let client = self.client;
async move {
let resp = client.post_stream("/chat/completions", &r).await?;
Ok(ChatCompletionStream::new(resp))
}
})
.await
}
}