1use super::super::base_types::data::*;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, Clone)]
6pub struct ChatRequest {
7 messages: Vec<Message>,
9 model: String,
11 #[serde(skip_serializing_if = "Option::is_none")]
14 frequency_penalty: Option<f64>,
15 #[serde(skip_serializing_if = "Option::is_none")]
19 max_tokens: Option<usize>,
20 #[serde(skip_serializing_if = "Option::is_none")]
23 presence_penalty: Option<f64>,
24 #[serde(skip_serializing_if = "Option::is_none")]
32 response_format: Option<RespinseFormat>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 stop: Option<Vec<String>>,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 stream: Option<bool>,
39 #[serde(skip_serializing_if = "Option::is_none")]
42 temperature: Option<f64>,
43 #[serde(skip_serializing_if = "Option::is_none")]
46 top_p: Option<f64>,
47 #[serde(skip_serializing_if = "Option::is_none")]
50 tools: Option<Vec<Tool>>,
51}
52
53impl ChatRequest {
54 pub fn to_json(&self) -> Result<String, serde_json::Error> {
55 serde_json::to_string(self)
56 }
57 pub fn add_message(&mut self, message: Message) {
58 self.messages.push(message);
59 }
60 pub fn add_messages(&mut self, messages: Vec<Message>) {
61 self.messages.extend(messages);
62 }
63}
64
65#[derive(Serialize, Deserialize, Debug, Clone)]
67pub struct ChatRequestBuilder{
68 messages: Vec<Message>,
70 model: ModelName,
72 #[serde(skip_serializing_if = "Option::is_none")]
75 frequency_penalty: Option<f64>,
76 #[serde(skip_serializing_if = "Option::is_none")]
80 max_tokens: Option<usize>,
81 #[serde(skip_serializing_if = "Option::is_none")]
84 presence_penalty: Option<f64>,
85 #[serde(skip_serializing_if = "Option::is_none")]
93 response_format: Option<RespinseFormat>,
94 #[serde(skip_serializing_if = "Option::is_none")]
96 stop: Option<Vec<String>>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 stream: Option<bool>,
100 #[serde(skip_serializing_if = "Option::is_none")]
103 temperature: Option<f64>,
104 #[serde(skip_serializing_if = "Option::is_none")]
107 top_p: Option<f64>,
108 #[serde(skip_serializing_if = "Option::is_none")]
111 tools: Option<Vec<Tool>>,
112}
113
114impl ChatRequestBuilder {
115 pub fn new() -> Self {
116 ChatRequestBuilder {
117 messages: Vec::new(),
118 model: ModelName::DeepseekChat,
119 frequency_penalty: None,
120 max_tokens: None,
121 presence_penalty: None,
122 response_format: None,
123 stop: None,
124 stream: None,
125 temperature: None,
126 top_p: None,
127 tools: None
128 }
129 }
130 pub fn add_message(mut self, message: Message) -> Self {
131 self.messages.push(message);
132 self
133 }
134
135 pub fn model(mut self, model: ModelName) -> Self {
136 self.model = model;
137 self
138 }
139 pub fn frequency_penalty(mut self, frequency_penalty: f64) -> Self {
140 self.frequency_penalty = Some(frequency_penalty);
141 self
142 }
143 pub fn max_tokens(mut self, max_tokens: usize) -> Self {
144 self.max_tokens = Some(max_tokens);
145 self
146 }
147 pub fn presence_penalty(mut self, presence_penalty: f64) -> Self {
148 self.presence_penalty = Some(presence_penalty);
149 self
150 }
151 pub fn response_format(mut self, response_format: RespinseFormat) -> Self {
152 self.response_format = Some(response_format);
153 self
154 }
155 pub fn stop(mut self, stop: Vec<String>) -> Self {
156 self.stop = Some(stop);
157 self
158 }
159 pub fn stream(mut self, stream: bool) -> Self {
160 self.stream = Some(stream);
161 self
162 }
163 pub fn temperature(mut self, temperature: f64) -> Self {
164 self.temperature = Some(temperature);
165 self
166 }
167 pub fn top_p(mut self, top_p: f64) -> Self {
168 self.top_p = Some(top_p);
169 self
170 }
171 pub fn tools(mut self, tools: Tool) -> Self {
172 self.tools.get_or_insert_with(Vec::new).push(tools);
173 self
174 }
175 pub fn build(self) -> (String, ChatRequest) {
176 let mut base_url = String::new();
177 if self.model == ModelName::DeepseekChat{
178 base_url = format!("{}https://api.deepseek.com/chat",base_url);
179 }else if self.model == ModelName::DeepseekReasoner{
180 base_url = format!("{}https://api.deepseek.com/chat",base_url);
181 }
182 base_url = format!("{}/completions",base_url);
183
184 (
185 base_url,
186 ChatRequest {
187 messages: self.messages,
188 model: self.model.to_string(),
189 frequency_penalty: self.frequency_penalty,
190 max_tokens: self.max_tokens,
191 presence_penalty: self.presence_penalty,
192 response_format: self.response_format,
193 stop: self.stop,
194 stream: self.stream,
195 temperature: self.temperature,
196 top_p: self.top_p,
197 tools: self.tools,
198 }
199 )
200 }
201}
202
203#[derive(Serialize, Deserialize, Debug, Clone)]
205pub struct Message{
206 content: String,
208 role: String,
210 #[serde(skip_serializing_if = "Option::is_none")]
211 name: Option<String>,
213 #[serde(skip_serializing_if = "Option::is_none")]
214 prefix: Option<bool>,
215 #[serde(skip_serializing_if = "Option::is_none")]
218 reasoning_content: Option<String>,
219 #[serde(skip_serializing_if = "Option::is_none")]
221 tool_call_id: Option<String>,
222}
223
224impl Message {
225 pub fn system_message(content: &str) -> Self {
226 Message {
227 content: String::from(content),
228 role: String::from("system"),
229 name: None,
230 prefix: None,
231 reasoning_content: None,
232 tool_call_id: None,
233 }
234 }
235 pub fn user_message(content: &str) -> Self {
236 Message {
237 content: String::from(content),
238 role: String::from("user"),
239 name: None,
240 prefix: None,
241 reasoning_content: None,
242 tool_call_id: None,
243 }
244 }
245 pub fn assistant_message(content: &str) -> Self {
246 Message {
247 content: String::from(content),
248 role: String::from("assistant"),
249 name: None,
250 prefix: None,
251 reasoning_content: None,
252 tool_call_id: None,
253 }
254 }
255 pub fn name(mut self, name: &str) -> Self {
257 if self.role == "system" || self.role == "user" || self.role == "assistant"{
258 self.name = Some(String::from(name));
259 }
260 self
261 }
262 pub fn prefix(mut self, prefix: bool) -> Self {
264 if self.role == "assistant" {
265 self.prefix = Some(prefix);
266 }
267 self
268 }
269 pub fn reasoning_content(mut self, content: &str) -> Self {
271 if self.role == "assistant" {
272 self.reasoning_content = Some(String::from(content));
273 }
274 self
275 }
276 pub fn tool_call_id(mut self, id: &str) -> Self {
278 if self.role == "tool"{
279 self.tool_call_id = Some(String::from(id));
280 }
281 self
282 }
283
284}
285
286#[derive(Serialize, Deserialize, Debug, Clone)]
287pub struct RespinseFormat{
288 #[serde(rename = "type")]
290 format_type: String,
291}
292
293impl RespinseFormat {
294 pub fn text() -> Self {
296 RespinseFormat {
297 format_type: String::from("text"),
298 }
299 }
300 pub fn json_object() -> Self {
302 RespinseFormat {
303 format_type: String::from("json_object"),
304 }
305 }
306}
307
308#[derive(Serialize, Deserialize, Debug, Clone)]
309pub struct Tool{
310 #[serde(rename = "type")]
312 fun_type: String,
313 function: Option<Function>,
315}
316
317impl Tool {
318 pub fn function() -> Self {
319 Tool {
320 fun_type: String::from("function"),
321 function: Some(Function::new()),
322 }
323 }
324 pub fn function_description(mut self, description: &str) -> Self {
325 if self.fun_type == "function" {
326 self.function.as_mut().unwrap().description(description);
327 }
328 self
329 }
330 pub fn function_name(mut self, name: &str) -> Self {
331 if self.fun_type == "function" {
332 self.function.as_mut().unwrap().name(name);
333 }
334 self
335 }
336 pub fn function_parameters(mut self, parameters: serde_json::Value) -> Self {
337 if self.fun_type == "function" {
338 self.function.as_mut().unwrap().parameters(parameters);
339 }
340 self
341 }
342}
343
344#[derive(Serialize, Deserialize, Debug, Clone)]
345pub struct Function{
346 description: String,
348 name: String,
350 parameters: serde_json::Value,
353}
354
355impl Function {
356 pub fn new() -> Self {
357 Function {
358 description: String::from("function one"),
359 name: String::from("function_one"),
360 parameters: serde_json::Value::Null,
361 }
362 }
363 pub fn description(&mut self, description: &str) {
364 self.description = description.to_string();
365 }
366 pub fn name(&mut self, name: &str) {
367 self.name = name.to_string();
368 }
369 pub fn parameters(&mut self, parameters: serde_json::Value) {
370 self.parameters = parameters;
371 }
372}