use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub mod support;
pub use support::*;
use super::{ExtraFields, FunctionBehavior, FunctionCallingMode, SchemaType};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[non_exhaustive]
pub struct Tool {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub function_declarations: 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(default, skip_serializing_if = "Vec::is_empty")]
pub mcp_servers: Vec<McpServer>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_maps: Option<GoogleMaps>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[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 = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[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(default, skip_serializing_if = "Vec::is_empty")]
pub r#enum: Vec<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub properties: BTreeMap<String, Schema>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub required: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub any_of: Vec<Schema>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub property_ordering: 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 = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[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 = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[non_exhaustive]
pub struct FunctionCallingConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<FunctionCallingMode>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub allowed_function_names: Vec<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}