use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::types::ids::ToolCallId;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FunctionDescription {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub parameters: Value,
pub strict: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum Tool {
Function {
#[serde(rename = "function")]
function: FunctionDescription,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum ToolType {
Function,
}
impl std::fmt::Display for ToolType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ToolType::Function => write!(f, "function"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolCall {
pub id: ToolCallId,
#[serde(rename = "type")]
pub kind: ToolType,
#[serde(rename = "function")]
pub function_call: FunctionCall,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FunctionCallChunk {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallChunk {
pub index: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<ToolType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function: Option<FunctionCallChunk>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ToolChoice {
None(String),
Auto(String),
FunctionChoice {
#[serde(rename = "type")]
kind: ToolType,
function: FunctionName,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionName {
pub name: String,
}