Skip to main content

vv_agent/types/
messages.rs

1use serde::{Deserialize, Serialize};
2
3use super::{Metadata, TokenUsage, ToolCall};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "lowercase")]
7pub enum MessageRole {
8    System,
9    User,
10    Assistant,
11    Tool,
12}
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15pub struct Message {
16    pub role: MessageRole,
17    pub content: String,
18    pub name: Option<String>,
19    pub tool_call_id: Option<String>,
20    pub tool_calls: Vec<ToolCall>,
21    pub reasoning_content: Option<String>,
22    pub image_url: Option<String>,
23    pub metadata: Metadata,
24}
25
26impl Message {
27    pub fn new(role: MessageRole, content: impl Into<String>) -> Self {
28        Self {
29            role,
30            content: content.into(),
31            name: None,
32            tool_call_id: None,
33            tool_calls: Vec::new(),
34            reasoning_content: None,
35            image_url: None,
36            metadata: Metadata::new(),
37        }
38    }
39
40    pub fn system(content: impl Into<String>) -> Self {
41        Self::new(MessageRole::System, content)
42    }
43
44    pub fn user(content: impl Into<String>) -> Self {
45        Self::new(MessageRole::User, content)
46    }
47
48    pub fn assistant(content: impl Into<String>) -> Self {
49        Self::new(MessageRole::Assistant, content)
50    }
51
52    pub fn tool(content: impl Into<String>, tool_call_id: impl Into<String>) -> Self {
53        let mut message = Self::new(MessageRole::Tool, content);
54        message.tool_call_id = Some(tool_call_id.into());
55        message
56    }
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
60pub struct LLMResponse {
61    pub content: String,
62    pub tool_calls: Vec<ToolCall>,
63    pub raw: Metadata,
64    pub token_usage: TokenUsage,
65}
66
67impl LLMResponse {
68    pub fn new(content: impl Into<String>) -> Self {
69        Self {
70            content: content.into(),
71            tool_calls: Vec::new(),
72            raw: Metadata::new(),
73            token_usage: TokenUsage::default(),
74        }
75    }
76
77    pub fn with_tool_calls(content: impl Into<String>, tool_calls: Vec<ToolCall>) -> Self {
78        Self {
79            content: content.into(),
80            tool_calls,
81            raw: Metadata::new(),
82            token_usage: TokenUsage::default(),
83        }
84    }
85}