use serde_json::Value;
#[derive(Debug, Clone)]
pub enum ToolCallState {
Started { tool_name: String, call_id: String },
ArgumentsStreaming {
tool_name: String,
call_id: String,
partial_args: String,
},
ArgumentsComplete {
tool_name: String,
call_id: String,
args: Value,
},
Executing { tool_name: String, call_id: String },
Completed {
tool_name: String,
call_id: String,
result: String,
},
Failed {
tool_name: String,
call_id: String,
error: String,
},
}
impl ToolCallState {
pub fn tool_name(&self) -> &str {
match self {
ToolCallState::Started { tool_name, .. }
| ToolCallState::ArgumentsStreaming { tool_name, .. }
| ToolCallState::ArgumentsComplete { tool_name, .. }
| ToolCallState::Executing { tool_name, .. }
| ToolCallState::Completed { tool_name, .. }
| ToolCallState::Failed { tool_name, .. } => tool_name,
}
}
pub fn call_id(&self) -> &str {
match self {
ToolCallState::Started { call_id, .. }
| ToolCallState::ArgumentsStreaming { call_id, .. }
| ToolCallState::ArgumentsComplete { call_id, .. }
| ToolCallState::Executing { call_id, .. }
| ToolCallState::Completed { call_id, .. }
| ToolCallState::Failed { call_id, .. } => call_id,
}
}
}
#[derive(Debug, Clone)]
pub enum AgentStreamEvent {
Text { content: String },
ToolCall { state: ToolCallState },
FinalAnswer { content: String },
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tool_call_state_accessors() {
let s = ToolCallState::Started {
tool_name: "calc".to_string(),
call_id: "call_1".to_string(),
};
assert_eq!(s.tool_name(), "calc");
assert_eq!(s.call_id(), "call_1");
}
#[test]
fn test_completed_state() {
let s = ToolCallState::Completed {
tool_name: "search".to_string(),
call_id: "call_2".to_string(),
result: "结果".to_string(),
};
assert_eq!(s.tool_name(), "search");
assert_eq!(s.call_id(), "call_2");
}
#[test]
fn test_agent_stream_event_text() {
let e = AgentStreamEvent::Text {
content: "hello".to_string(),
};
assert!(matches!(e, AgentStreamEvent::Text { .. }));
}
#[test]
fn test_agent_stream_event_final() {
let e = AgentStreamEvent::FinalAnswer {
content: "done".to_string(),
};
assert!(matches!(e, AgentStreamEvent::FinalAnswer { .. }));
}
}