use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCall {
pub id: String,
pub r#type: String,
pub function: Option<FunctionCall>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
pub r#type: String,
pub function: ToolFunction,
}
impl Tool {
pub fn function(name: String, description: String, parameters: serde_json::Value) -> Self {
Self {
r#type: "function".to_string(),
function: ToolFunction {
name,
description,
parameters,
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolFunction {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ToolType {
#[serde(rename = "function")]
Function,
#[serde(rename = "code_interpreter")]
CodeInterpreter,
#[serde(rename = "file_search")]
FileSearch,
#[serde(rename = "web_search")]
WebSearch,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OpenAiBuiltInTool {
WebSearch,
FileSearch {
vector_store_ids: Option<Vec<String>>,
},
ComputerUse {
display_width: u32,
display_height: u32,
environment: String,
},
}
impl OpenAiBuiltInTool {
pub fn to_json(&self) -> serde_json::Value {
match self {
Self::WebSearch => serde_json::json!({
"type": "web_search_preview"
}),
Self::FileSearch { vector_store_ids } => {
let mut json = serde_json::json!({
"type": "file_search"
});
if let Some(ids) = vector_store_ids {
json["vector_store_ids"] = serde_json::Value::Array(
ids.iter()
.map(|id| serde_json::Value::String(id.clone()))
.collect(),
);
}
json
}
Self::ComputerUse {
display_width,
display_height,
environment,
} => serde_json::json!({
"type": "computer_use_preview",
"display_width": display_width,
"display_height": display_height,
"environment": environment
}),
}
}
}