use std::cell::RefCell;
use std::fmt::Debug;
use sapiens::tools::{
Describe, Format, ProtoToolDescribe, ProtoToolInvoke, TerminalTool, TerminationMessage,
ToolDescription, ToolUseError,
};
use sapiens_derive::{Describe, ProtoToolDescribe, ProtoToolInvoke};
use serde::{Deserialize, Serialize};
#[derive(Default, ProtoToolDescribe, ProtoToolInvoke)]
#[tool(
name = "Conclude",
input = "ConcludeToolInput",
output = "ConcludeToolOutput"
)]
pub struct ConcludeTool {
done: RefCell<Option<ConcludeToolInput>>,
}
impl TerminalTool for ConcludeTool {
fn is_done(&self) -> bool {
self.done.borrow().is_some()
}
fn take_done(&self) -> Option<TerminationMessage> {
self.done.borrow_mut().take().map(|input| input.into())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Describe)]
pub struct ConcludeToolInput {
pub conclusion: String,
pub original_question: String,
}
impl From<ConcludeToolInput> for TerminationMessage {
fn from(input: ConcludeToolInput) -> Self {
Self {
conclusion: input.conclusion,
original_question: input.original_question,
}
}
}
#[derive(Serialize, Deserialize, Describe)]
pub struct ConcludeToolOutput {}
impl ConcludeTool {
fn invoke_typed(&self, input: &ConcludeToolInput) -> Result<ConcludeToolOutput, ToolUseError> {
if self.done.borrow().is_some() {
return Err(ToolUseError::ToolInvocationFailed(
"This task is already done.".to_string(),
));
}
*self.done.borrow_mut() = Some(input.clone());
Ok(ConcludeToolOutput {})
}
}