deepseek/agent/
messages.rs1use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10use crate::types::UsageInfo;
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(tag = "type", rename_all = "snake_case")]
15pub enum ContentBlock {
16 Text { text: String },
18
19 ToolUse {
21 id: String,
22 name: String,
23 input: Value,
24 },
25
26 ToolResult {
28 tool_use_id: String,
29 content: String,
30 #[serde(default, skip_serializing_if = "std::ops::Not::not")]
31 is_error: bool,
32 },
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
43#[serde(rename_all = "snake_case")]
44pub enum SystemSubtype {
45 Init,
46 Compact,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
51#[serde(rename_all = "snake_case")]
52pub enum ResultSubtype {
53 Success,
54 ErrorMaxTurns,
55 ErrorMaxBudgetUsd,
56 ErrorDuringExecution,
57}
58
59impl ResultSubtype {
60 pub fn is_success(self) -> bool {
61 matches!(self, Self::Success)
62 }
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
71#[serde(tag = "type", rename_all = "snake_case")]
72pub enum SdkMessage {
73 System {
75 subtype: SystemSubtype,
76 session_id: String,
77 #[serde(default, skip_serializing_if = "Value::is_null")]
78 data: Value,
79 },
80
81 Assistant {
84 content: Vec<ContentBlock>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 stop_reason: Option<String>,
87 },
88
89 User { content: Vec<ContentBlock> },
91
92 Result {
94 subtype: ResultSubtype,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 result: Option<String>,
97 #[serde(skip_serializing_if = "Option::is_none")]
98 total_cost_usd: Option<f64>,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 usage: Option<UsageInfo>,
101 num_turns: u32,
102 session_id: String,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 stop_reason: Option<String>,
105 },
106}
107
108impl SdkMessage {
109 pub fn is_terminal(&self) -> bool {
111 matches!(self, SdkMessage::Result { .. })
112 }
113}