use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct Base {
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
pub stream: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<usize>,
pub user: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<usize>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Usage {
pub prompt_tokens: i64,
pub completion_tokens: i64,
pub total_tokens: i64,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Response {
pub id: String,
pub object: String,
pub created: i64,
pub usage: Usage,
}
pub trait BaseExt {
fn with_max_tokens(self, max_tokens: usize) -> Self;
fn with_temperature(self, temperature: f64) -> Self;
fn with_user(self, user: impl Into<String>) -> Self;
}
#[macro_export]
macro_rules! base_ext {
($l:ident) => {
use super::BaseExt;
impl BaseExt for $l {
fn with_max_tokens(mut self, max_tokens: usize) -> Self {
self.base.max_tokens = Some(max_tokens);
self
}
fn with_temperature(mut self, temperature: f64) -> Self {
self.base.temperature = Some(temperature);
self
}
fn with_user(mut self, user: impl Into<String>) -> Self {
self.base.user = user.into();
self
}
}
};
}