devin15/cursor2api-rust
0
1use serde::{Deserialize, Serialize};2 3#[derive(Serialize, Deserialize)]4#[serde(untagged)]5pub enum MessageContent {6 Text(String),7 Vision(Vec<VisionMessageContent>),8}9 10#[derive(Serialize, Deserialize)]11pub struct VisionMessageContent {12 #[serde(rename = "type")]13 pub content_type: String,14 #[serde(skip_serializing_if = "Option::is_none")]15 pub text: Option<String>,16 #[serde(skip_serializing_if = "Option::is_none")]17 pub image_url: Option<ImageUrl>,18}19 20#[derive(Serialize, Deserialize)]21pub struct ImageUrl {22 pub url: String,23 #[serde(skip_serializing_if = "Option::is_none")]24 pub detail: Option<String>,25}26 27#[derive(Serialize, Deserialize)]28pub struct Message {29 pub role: Role,30 pub content: MessageContent,31}32 33#[derive(Serialize, Deserialize, PartialEq)]34pub enum Role {35 #[serde(rename = "system", alias = "developer")]36 System,37 #[serde(rename = "user", alias = "human")]38 User,39 #[serde(rename = "assistant", alias = "ai")]40 Assistant,41}42 43#[derive(Serialize)]44pub struct ChatResponse {45 pub id: String,46 pub object: String,47 pub created: i64,48 #[serde(skip_serializing_if = "Option::is_none")]49 pub model: Option<String>,50 pub choices: Vec<Choice>,51 #[serde(skip_serializing_if = "Option::is_none")]52 pub usage: Option<Usage>,53}54 55#[derive(Serialize)]56pub struct Choice {57 pub index: i32,58 #[serde(skip_serializing_if = "Option::is_none")]59 pub message: Option<Message>,60 #[serde(skip_serializing_if = "Option::is_none")]61 pub delta: Option<Delta>,62 pub finish_reason: Option<String>,63}64 65#[derive(Serialize)]66pub struct Delta {67 #[serde(skip_serializing_if = "Option::is_none")]68 pub role: Option<Role>,69 #[serde(skip_serializing_if = "Option::is_none")]70 pub content: Option<String>,71}72 73#[derive(Serialize)]74pub struct Usage {75 pub prompt_tokens: u32,76 pub completion_tokens: u32,77 pub total_tokens: u32,78}79 80// 模型定义81#[derive(Serialize, Clone)]82pub struct Model {83 pub id: &'static str,84 pub created: &'static i64,85 pub object: &'static str,86 pub owned_by: &'static str,87}88 89use crate::app::model::{AppConfig, UsageCheck};90use super::constant::USAGE_CHECK_MODELS;91 92impl Model {93 pub fn is_usage_check(&self) -> bool {94 match AppConfig::get_usage_check() {95 UsageCheck::None => false,96 UsageCheck::Default => USAGE_CHECK_MODELS.contains(&self.id),97 UsageCheck::All => true,98 UsageCheck::Custom(models) => models.contains(&self.id),99 }100 }101}102 103#[derive(Serialize)]104pub struct ModelsResponse {105 pub object: &'static str,106 pub data: &'static [Model],107}108 