use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[must_use]
#[derive(Debug, Serialize)]
pub struct ChatRequest {
#[serde(rename = "message")]
pub message: ChatMessage,
#[serde(rename = "message_history", skip_serializing_if = "Option::is_none")]
pub message_history: Option<Vec<ChatMessage>>,
#[serde(rename = "override_params", skip_serializing_if = "Option::is_none")]
pub override_params: Option<HashMap<String, ChatRequestOverride>>,
}
impl ChatRequest {
#[inline]
pub fn new(message: impl Into<ChatMessage>) -> Self {
Self::from(message.into())
}
}
impl<T> From<T> for ChatRequest
where
T: Into<ChatMessage>,
{
fn from(message: T) -> Self {
Self {
message: message.into(),
message_history: None,
override_params: None,
}
}
}
#[must_use]
#[derive(Debug, Deserialize)]
pub struct ChatResponse {
pub cached: bool,
pub created_at: i32,
pub id: String,
pub model_id: String,
pub model_name: String,
pub model_response: ModelResponse,
pub provider_id: String,
pub router_id: String,
}
impl ChatResponse {
#[inline]
pub fn content(&self) -> &str {
&self.model_response.message.content
}
}
#[derive(Debug, Deserialize)]
pub struct ModelResponse {
pub message: ChatMessage,
pub metadata: Option<HashMap<String, String>>,
pub token_count: TokenUsage,
}
#[derive(Debug, Deserialize)]
pub struct TokenUsage {
pub prompt_tokens: i32,
pub response_tokens: i32,
pub total_tokens: i32,
}
#[must_use]
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatMessage {
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub role: Option<Role>,
}
impl ChatMessage {
pub fn new(content: &str) -> Self {
Self {
content: content.to_owned(),
name: None,
role: None,
}
}
pub const fn with_system(mut self) -> Self {
self.role = Some(Role::System);
self
}
}
impl From<String> for ChatMessage {
fn from(value: String) -> Self {
Self::new(&value)
}
}
impl From<&str> for ChatMessage {
fn from(value: &str) -> Self {
Self::new(value)
}
}
#[must_use]
#[derive(Debug, Default, Serialize, Deserialize)]
pub enum Role {
#[serde(rename = "system")]
System,
#[default]
#[serde(rename = "user")]
User,
#[serde(rename = "assistant")]
Assistant,
}
#[derive(Debug, Serialize)]
pub struct ChatRequestOverride {
#[serde(rename = "message")]
pub message: ChatMessage,
}