1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Serialize)]
4pub struct ChatRequest {
5 pub model: String,
6 pub messages: Vec<Message>,
7 #[serde(skip_serializing_if = "Option::is_none")]
8 pub temperature: Option<f32>,
9 #[serde(skip_serializing_if = "Option::is_none")]
10 pub max_tokens: Option<u32>,
11}
12
13#[derive(Debug, Serialize, Deserialize)]
14pub struct Message {
15 pub role: String,
16 pub content: Content,
17}
18
19#[derive(Debug, Serialize, Deserialize)]
20#[serde(untagged)]
21pub enum Content {
22 Text(String),
23 Multi(Vec<ContentPart>),
24}
25
26#[derive(Debug, Serialize, Deserialize)]
27pub struct ContentPart {
28 #[serde(rename = "type")]
29 pub type_: String,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub text: Option<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub image_url: Option<ImageUrl>,
34}
35
36#[derive(Debug, Serialize, Deserialize)]
37pub struct ImageUrl {
38 pub url: String,
39}
40
41#[derive(Debug, Deserialize)]
42pub struct ChatResponse {
43 pub choices: Vec<Choice>,
44 pub created: u64,
45 pub model: String,
46}
47
48#[derive(Debug, Deserialize)]
49pub struct Choice {
50 pub message: Message,
51 pub finish_reason: String,
52 pub index: u32,
53}