use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ToolDefinition {
pub description: String,
pub parameters: Vec<ParameterDefinition>,
pub env_vars: Vec<EnvVarDefinition>,
pub required_tools: Vec<String>,
pub metadata: HashMap<String, serde_json::Value>,
}
impl ToolDefinition {
pub fn to_function_declaration(
&self,
name: &str,
) -> crate::Result<crate::core::function::FunctionDeclaration> {
use crate::core::function::{FunctionDeclaration, Parameter};
let parameters = self
.parameters
.iter()
.map(|p| {
let param_type = match &p.param_type {
ParameterType::String => {
if let Some(ref enum_values) = p.enum_values {
crate::core::function::ParameterType::Enum(enum_values.clone())
} else {
crate::core::function::ParameterType::String
}
}
ParameterType::Integer => crate::core::function::ParameterType::Integer,
ParameterType::Number => crate::core::function::ParameterType::Number,
ParameterType::Boolean => crate::core::function::ParameterType::Boolean,
ParameterType::Array => crate::core::function::ParameterType::Array,
ParameterType::Object => crate::core::function::ParameterType::Object,
ParameterType::Enum(values) => {
crate::core::function::ParameterType::Enum(values.clone())
}
};
Parameter {
name: p.name.clone(),
param_type,
description: p.description.clone(),
required: p.required,
default: p.default.clone(),
}
})
.collect();
Ok(FunctionDeclaration {
name: name.to_string(),
description: self.description.clone(),
parameters,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ParameterDefinition {
pub name: String,
pub param_type: ParameterType,
pub description: String,
pub required: bool,
pub default: Option<serde_json::Value>,
pub enum_values: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ParameterType {
String,
Integer,
Number,
Boolean,
Array,
Object,
#[serde(rename = "enum")]
Enum(Vec<String>),
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct EnvVarDefinition {
pub name: String,
pub description: String,
pub required: bool,
pub default: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AgentDefinition {
pub name: String,
pub description: String,
pub version: String,
pub instructions: String,
#[serde(default)]
pub variables: Vec<AgentVariable>,
#[serde(default)]
pub documents: Vec<String>,
#[serde(default)]
pub conversation_starters: Vec<String>,
#[serde(default)]
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AgentVariable {
pub name: String,
pub description: String,
pub default: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionResult {
pub success: bool,
pub output: String,
pub error: Option<String>,
pub duration: std::time::Duration,
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionCall {
pub name: String,
pub arguments: serde_json::Value,
pub request_id: String,
pub timestamp: chrono::DateTime<chrono::Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionResponse {
pub request_id: String,
pub result: ExecutionResult,
pub timestamp: chrono::DateTime<chrono::Utc>,
}