use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub mod support;
pub use support::*;
use super::{FunctionBehavior, FunctionCallingMode, SchemaType};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct Tool {
#[serde(skip_serializing_if = "Option::is_none")]
pub function_declarations: Option<Vec<FunctionDeclaration>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_search_retrieval: Option<GoogleSearchRetrieval>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_execution: Option<CodeExecution>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_search: Option<GoogleSearch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub computer_use: Option<ComputerUse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url_context: Option<UrlContext>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_search: Option<FileSearch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mcp_servers: Option<Vec<McpServer>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_maps: Option<GoogleMaps>,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
pub rest: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct FunctionDeclaration {
pub name: String,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub behavior: Option<FunctionBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Schema>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters_json_schema: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<Schema>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_json_schema: Option<Value>,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
pub rest: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct Schema {
pub r#type: SchemaType,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nullable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#enum: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<BTreeMap<String, Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub any_of: Option<Vec<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub property_ordering: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_items: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_items: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_properties: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_properties: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_length: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_length: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
pub rest: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct ToolConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub function_calling_config: Option<FunctionCallingConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub retrieval_config: Option<RetrievalConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_server_side_tool_invocations: Option<bool>,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
pub rest: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct FunctionCallingConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<FunctionCallingMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_function_names: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
pub rest: serde_json::Map<String, serde_json::Value>,
}