use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolCall {
pub id: String,
#[serde(rename = "type")]
pub call_type: String,
pub function: ToolFunction,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolFunction {
pub name: String,
pub arguments: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolDefinition {
pub name: String,
pub description: String,
pub parameters: ToolParametersDefinition,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolParametersDefinition {
#[serde(rename = "type")]
pub param_type: String,
pub properties: HashMap<String, ToolParameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub required: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolParameter {
#[serde(rename = "type")]
pub param_type: ToolParameterType,
pub description: String,
#[serde(rename = "enum", skip_serializing_if = "Option::is_none")]
pub enum_values: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<ToolParameter>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ToolParameterType {
String,
Integer,
Number,
Boolean,
Array,
Object,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ToolInput {
pub arguments: HashMap<String, JsonValue>,
}