vv_agent/types/
messages.rs1use 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}