use crate::RunState;
use futures::future::BoxFuture;
use llm_sdk::{JSONSchema, Part, Tool};
use serde_json::Value;
use std::{error::Error, fmt::Debug};
pub trait AgentTool<TCtx>: Send + Sync {
fn name(&self) -> String;
fn description(&self) -> String;
fn parameters(&self) -> JSONSchema;
fn execute<'a>(
&'a self,
args: Value,
context: &'a TCtx,
state: &'a RunState,
) -> BoxFuture<'a, Result<AgentToolResult, Box<dyn Error + Send + Sync>>>;
}
impl<TCtx> Debug for dyn AgentTool<TCtx> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("AgentTool")
.field("name", &self.name())
.field("description", &self.description())
.field("parameters", &self.parameters())
.field("execute", &"Function")
.finish()
}
}
#[derive(Clone)]
pub struct AgentToolResult {
pub content: Vec<Part>,
pub is_error: bool,
}
impl<TCtx> From<&dyn AgentTool<TCtx>> for Tool {
fn from(agent_tool: &dyn AgentTool<TCtx>) -> Self {
Self {
name: agent_tool.name(),
description: agent_tool.description(),
parameters: agent_tool.parameters(),
}
}
}