| use serde::{Deserialize, Serialize}; |
|
|
| #[derive(Serialize, Deserialize)] |
| #[serde(untagged)] |
| pub enum MessageContent { |
| Text(String), |
| Vision(Vec<VisionMessageContent>), |
| } |
|
|
| #[derive(Serialize, Deserialize)] |
| pub struct VisionMessageContent { |
| #[serde(rename = "type")] |
| pub content_type: String, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub text: Option<String>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub image_url: Option<ImageUrl>, |
| } |
|
|
| #[derive(Serialize, Deserialize)] |
| pub struct ImageUrl { |
| pub url: String, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub detail: Option<String>, |
| } |
|
|
| #[derive(Serialize, Deserialize)] |
| pub struct Message { |
| pub role: Role, |
| pub content: MessageContent, |
| } |
|
|
| #[derive(Serialize, Deserialize, PartialEq)] |
| pub enum Role { |
| #[serde(rename = "system", alias = "developer")] |
| System, |
| #[serde(rename = "user", alias = "human")] |
| User, |
| #[serde(rename = "assistant", alias = "ai")] |
| Assistant, |
| } |
|
|
| #[derive(Serialize)] |
| pub struct ChatResponse { |
| pub id: String, |
| pub object: String, |
| pub created: i64, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub model: Option<String>, |
| pub choices: Vec<Choice>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub usage: Option<Usage>, |
| } |
|
|
| #[derive(Serialize)] |
| pub struct Choice { |
| pub index: i32, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub message: Option<Message>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub delta: Option<Delta>, |
| pub finish_reason: Option<String>, |
| } |
|
|
| #[derive(Serialize)] |
| pub struct Delta { |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub role: Option<Role>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub content: Option<String>, |
| } |
|
|
| #[derive(Serialize)] |
| pub struct Usage { |
| pub prompt_tokens: u32, |
| pub completion_tokens: u32, |
| pub total_tokens: u32, |
| } |
|
|
| |
| #[derive(Serialize, Clone)] |
| pub struct Model { |
| pub id: &'static str, |
| pub created: &'static i64, |
| pub object: &'static str, |
| pub owned_by: &'static str, |
| } |
|
|
| use super::constant::USAGE_CHECK_MODELS; |
| use crate::app::model::{AppConfig, UsageCheck}; |
|
|
| impl Model { |
| pub fn is_usage_check(&self, usage_check: Option<UsageCheck>) -> bool { |
| match usage_check.unwrap_or(AppConfig::get_usage_check()) { |
| UsageCheck::None => false, |
| UsageCheck::Default => USAGE_CHECK_MODELS.contains(&self.id), |
| UsageCheck::All => true, |
| UsageCheck::Custom(models) => models.contains(&self.id), |
| } |
| } |
| } |
|
|
| #[derive(Serialize)] |
| pub struct ModelsResponse { |
| pub object: &'static str, |
| pub data: &'static [Model], |
| } |
|
|