Skip to main content

ds_api/raw/request/
message.rs

1use serde::{Deserialize, Serialize};
2
3// Unified message struct
4// This struct is used both for the `messages` array in requests and the `message` field in responses.
5// All fields are optional to cover different roles and scenarios.
6#[derive(Debug, Serialize, Deserialize, Default, Clone)]
7pub struct Message {
8    /// default role is User
9    pub role: Role,
10
11    /// The content may be null for assistant messages (only when `tool_calls` are present)
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub content: Option<String>,
14
15    /// Optional name to identify a user or function
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub name: Option<String>,
18
19    /// Required when role = "tool"; links to the previous tool call ID
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub tool_call_id: Option<String>,
22
23    /// Present when role = "assistant" and the model requested tool calls
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub tool_calls: Option<Vec<ToolCall>>,
26
27    /// Reasoning content produced by the model (may appear only in responses)
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub reasoning_content: Option<String>,
30
31    /// Beta: if true, forces the model to begin its reply with the prefix content provided in this assistant message
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub prefix: Option<bool>,
34}
35
36impl Message {
37    pub fn new(role: Role, message: &str) -> Self {
38        Self {
39            role,
40            content: Some(message.to_string()),
41            name: None,
42            tool_call_id: None,
43            tool_calls: None,
44            reasoning_content: None,
45            prefix: None,
46        }
47    }
48
49    pub fn user(message: &str) -> Self {
50        Self::new(Role::User, message)
51    }
52
53    pub fn assistant(message: &str) -> Self {
54        Self::new(Role::Assistant, message)
55    }
56
57    pub fn system(message: &str) -> Self {
58        Self::new(Role::System, message)
59    }
60}
61
62// Role enum (includes Tool variant)
63#[derive(Debug, Serialize, Deserialize, Clone, Default)]
64#[serde(rename_all = "lowercase")]
65pub enum Role {
66    System,
67    #[default]
68    User,
69    Assistant,
70    Tool,
71}
72
73// Tool call struct (reused in requests and responses)
74#[derive(Debug, Serialize, Deserialize, Clone)]
75pub struct ToolCall {
76    pub id: String,
77    pub r#type: ToolType,
78    pub function: FunctionCall,
79}
80
81#[derive(Debug, Serialize, Deserialize, Clone)]
82#[serde(rename_all = "lowercase")]
83pub enum ToolType {
84    Function,
85}
86
87#[derive(Debug, Serialize, Deserialize, Clone)]
88pub struct FunctionCall {
89    pub name: String,
90    pub arguments: String, // JSON string
91}