use std::pin::Pin;
use futures_core::Stream;
use crate::client::Client;
use crate::error::Result;
use crate::logoi::input::payload::ChatPayLoad;
use crate::logoi::output::stream::ChatCompletionChunk;
use crate::logoi::output::AiMsgResponse;
pub struct Chat<'a> {
client: &'a Client,
}
impl<'a> Chat<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "debug", skip_all, fields(endpoint = "chat.completions", model = %payload.model))
)]
pub async fn create(&self, payload: ChatPayLoad) -> Result<AiMsgResponse> {
super::post_json(self.client, "/chat/completions", &payload).await
}
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "debug", skip_all, fields(endpoint = "chat.completions.stream", model = %payload.model))
)]
pub async fn create_stream(
&self,
mut payload: ChatPayLoad,
) -> Result<Pin<Box<dyn Stream<Item = Result<ChatCompletionChunk>> + Send>>> {
payload.stream = Some(true);
let body = serde_json::to_value(&payload)?;
super::stream::post_sse_stream(self.client, "/chat/completions", body).await
}
pub fn completions(&self) -> Completions<'a> {
Completions {
client: self.client,
}
}
}
pub struct Completions<'a> {
client: &'a Client,
}
impl<'a> Completions<'a> {
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "debug", skip_all, fields(endpoint = "chat.completions", model = %payload.model))
)]
pub async fn create(&self, payload: ChatPayLoad) -> Result<AiMsgResponse> {
super::post_json(self.client, "/chat/completions", &payload).await
}
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "debug", skip_all, fields(endpoint = "chat.completions.stream", model = %payload.model))
)]
pub async fn create_stream(
&self,
mut payload: ChatPayLoad,
) -> Result<Pin<Box<dyn Stream<Item = Result<ChatCompletionChunk>> + Send>>> {
payload.stream = Some(true);
let body = serde_json::to_value(&payload)?;
super::stream::post_sse_stream(self.client, "/chat/completions", body).await
}
}