use serde::{Deserialize, Serialize};
use crate::chat::WebSearchUserLocation;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct FunctionTool {
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<serde_json::Value>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseRankingOptions {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f64>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub ranker: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum ResponseTool {
#[serde(rename = "function")]
Function {
name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
parameters: Option<serde_json::Value>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
strict: Option<bool>,
},
#[serde(rename = "web_search")]
WebSearch {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
search_context_size: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
user_location: Option<WebSearchUserLocation>,
},
#[serde(rename = "file_search")]
FileSearch {
vector_store_ids: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
max_num_results: Option<i64>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
ranking_options: Option<ResponseRankingOptions>,
},
#[serde(rename = "code_interpreter")]
CodeInterpreter {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
container: Option<String>,
},
#[serde(rename = "computer")]
ComputerUse {},
#[serde(rename = "mcp")]
Mcp {
server_label: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
server_url: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
allowed_tools: Option<Vec<String>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
require_approval: Option<serde_json::Value>,
},
#[serde(rename = "image_generation")]
ImageGeneration {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
model: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
quality: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
size: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(untagged)]
#[non_exhaustive]
pub enum ResponseToolChoice {
Mode(String),
Named {
#[serde(rename = "type")]
type_: String,
function: ResponseToolChoiceFunction,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseToolChoiceFunction {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(untagged)]
#[non_exhaustive]
pub enum ToolChoiceParam {
Mode(ToolChoiceOptions),
Function(ToolChoiceFunction),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum ToolChoiceOptions {
None,
Auto,
Required,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ToolChoiceFunction {
pub name: String,
#[serde(rename = "type")]
#[serde(default = "default_function_type")]
pub type_: String,
}
fn default_function_type() -> String {
"function".to_string()
}