use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::sync::Arc;
pub type ToolCallback = dyn Fn(&CalledFunction) -> anyhow::Result<String> + Send + Sync;
#[derive(Clone)]
pub struct ToolCallbackWithTool {
pub callback: Arc<ToolCallback>,
pub tool: Tool,
}
pub type ToolCallbacks = HashMap<String, Arc<ToolCallback>>;
pub type ToolCallbacksWithTools = HashMap<String, ToolCallbackWithTool>;
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ToolType {
#[serde(rename = "function")]
Function,
}
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Function {
pub description: Option<String>,
pub name: String,
#[serde(alias = "arguments")]
pub parameters: Option<HashMap<String, Value>>,
}
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Tool {
#[serde(rename = "type")]
pub tp: ToolType,
pub function: Function,
}
#[cfg_attr(feature = "pyo3_macros", pyo3::pyclass)]
#[cfg_attr(feature = "pyo3_macros", pyo3(get_all))]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CalledFunction {
pub name: String,
pub arguments: String,
}