1use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct Message {
16 pub role: Role,
17 pub content: MessageContent,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "lowercase")]
22pub enum Role {
23 System,
24 User,
25 Assistant,
26 Tool,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(untagged)]
31pub enum MessageContent {
32 Text(String),
33 Parts(Vec<ContentPart>),
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[serde(tag = "type", rename_all = "snake_case")]
38pub enum ContentPart {
39 Text {
40 text: String,
41 },
42 ImageBase64 {
45 mime: String,
46 data: String,
47 },
48 ImageUrl {
50 url: String,
51 },
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, Default)]
55pub struct SamplingParams {
56 pub temperature: Option<f32>,
57 pub top_p: Option<f32>,
58 pub top_k: Option<u32>,
59 pub max_tokens: Option<u32>,
60 pub stop: Vec<String>,
61 pub presence_penalty: Option<f32>,
62 pub frequency_penalty: Option<f32>,
63 pub seed: Option<u64>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct ExecuteBatch {
70 pub request_id: String,
71 pub model: String,
72 pub messages: Vec<Message>,
73 pub sampling: SamplingParams,
74 pub stream: bool,
77 pub estimated_tokens: u32,
81}
82
83impl ExecuteBatch {
84 pub fn estimated_tokens(&self) -> u32 {
85 self.estimated_tokens.max(1)
86 }
87}