use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
System,
Assistant,
User,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)]
pub struct ChatMessage {
pub role: Role,
pub content: String,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize)]
pub struct CompletionRequest<'a> {
pub model: &'a str,
pub messages: &'a Vec<ChatMessage>,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)]
#[serde(untagged)]
pub enum ServerResponse {
Error {
error: CompletionError,
},
Completion(CompletionResponse),
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)]
pub struct CompletionError {
pub message: String,
#[serde(rename = "type")]
pub error_type: String,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)]
pub struct CompletionResponse {
#[serde(rename = "id")]
pub message_id: String,
#[serde(rename = "created")]
pub created_timestamp: u64,
pub model: String,
pub usage: TokenUsage,
#[serde(rename = "choices")]
pub message_choices: Vec<MessageChoice>,
}
impl CompletionResponse {
pub fn message(&self) -> &ChatMessage {
&self.message_choices.first().unwrap().message
}
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)]
pub struct MessageChoice {
pub message: ChatMessage,
pub finish_reason: String,
pub index: u32,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)]
pub struct TokenUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
}