1use crate::types::Message;
2use crate::types::{FunctionCallPolicy, Tool};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct ChatCompletionRequest {
7 pub model: String,
8 pub messages: Vec<Message>,
9 pub temperature: Option<f32>,
10 pub max_tokens: Option<u32>,
11 pub stream: Option<bool>,
12 pub top_p: Option<f32>,
13 pub frequency_penalty: Option<f32>,
14 pub presence_penalty: Option<f32>,
15 pub functions: Option<Vec<Tool>>,
17 pub function_call: Option<FunctionCallPolicy>,
19}
20
21impl ChatCompletionRequest {
22 pub fn new(model: String, messages: Vec<Message>) -> Self {
23 Self {
24 model,
25 messages,
26 temperature: None,
27 max_tokens: None,
28 stream: None,
29 top_p: None,
30 frequency_penalty: None,
31 presence_penalty: None,
32 functions: None,
33 function_call: None,
34 }
35 }
36
37 pub fn with_temperature(mut self, temperature: f32) -> Self {
38 self.temperature = Some(temperature);
39 self
40 }
41
42 pub fn with_max_tokens(mut self, max_tokens: u32) -> Self {
43 self.max_tokens = Some(max_tokens);
44 self
45 }
46
47 pub fn ignore_previous(mut self) -> Self {
50 use crate::types::Role;
51 let mut new_msgs: Vec<Message> = self
52 .messages
53 .iter()
54 .filter(|m| matches!(m.role, Role::System))
55 .cloned()
56 .collect();
57 if let Some(last) = self
58 .messages
59 .iter()
60 .rev()
61 .find(|m| !matches!(m.role, Role::System))
62 {
63 new_msgs.push(last.clone());
64 }
65 self.messages = new_msgs;
66 self
67 }
68}