Skip to main content

gproxy_protocol/gemini/common/tools/
mod.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6pub mod support;
7
8pub use support::*;
9
10use super::{FunctionBehavior, FunctionCallingMode, SchemaType};
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14#[derive(gproxy_protocol_macros::WireBuilder)]
15#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
16pub struct Tool {
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub function_declarations: Option<Vec<FunctionDeclaration>>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub google_search_retrieval: Option<GoogleSearchRetrieval>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub code_execution: Option<CodeExecution>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub google_search: Option<GoogleSearch>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub computer_use: Option<ComputerUse>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub url_context: Option<UrlContext>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub file_search: Option<FileSearch>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub mcp_servers: Option<Vec<McpServer>>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub google_maps: Option<GoogleMaps>,
35    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
36    pub rest: serde_json::Map<String, serde_json::Value>,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
40#[serde(rename_all = "camelCase")]
41#[derive(gproxy_protocol_macros::WireBuilder)]
42#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
43pub struct FunctionDeclaration {
44    pub name: String,
45    pub description: String,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub behavior: Option<FunctionBehavior>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub parameters: Option<Schema>,
50    /// `upstream_docs/gemini/docs/Caching.md`, `FunctionDeclaration.parametersJsonSchema`:
51    /// the function parameter JSON Schema as `google.protobuf.Value`.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub parameters_json_schema: Option<Value>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub response: Option<Schema>,
56    /// `upstream_docs/gemini/docs/Caching.md`, `FunctionDeclaration.responseJsonSchema`:
57    /// the function result JSON Schema as `google.protobuf.Value`.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub response_json_schema: Option<Value>,
60    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
61    pub rest: serde_json::Map<String, serde_json::Value>,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
65#[serde(rename_all = "camelCase")]
66#[derive(gproxy_protocol_macros::WireBuilder)]
67#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
68pub struct Schema {
69    pub r#type: SchemaType,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub format: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub title: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub description: Option<String>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub nullable: Option<bool>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub r#enum: Option<Vec<String>>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub properties: Option<BTreeMap<String, Schema>>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub required: Option<Vec<String>>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub any_of: Option<Vec<Schema>>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub property_ordering: Option<Vec<String>>,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub items: Option<Box<Schema>>,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub minimum: Option<f64>,
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub maximum: Option<f64>,
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub max_items: Option<String>,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub min_items: Option<String>,
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub min_properties: Option<String>,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub max_properties: Option<String>,
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub min_length: Option<String>,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub max_length: Option<String>,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub pattern: Option<String>,
108    /// `upstream_docs/gemini/docs/Caching.md`, `Schema.example`:
109    /// an open JSON value documented as `google.protobuf.Value`.
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub example: Option<Value>,
112    /// `upstream_docs/gemini/docs/Caching.md`, `Schema.default`:
113    /// an open JSON value documented as `google.protobuf.Value`.
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub default: Option<Value>,
116    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
117    pub rest: serde_json::Map<String, serde_json::Value>,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
121#[serde(rename_all = "camelCase")]
122#[derive(gproxy_protocol_macros::WireBuilder)]
123#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
124pub struct ToolConfig {
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub function_calling_config: Option<FunctionCallingConfig>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub retrieval_config: Option<RetrievalConfig>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub include_server_side_tool_invocations: Option<bool>,
131    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
132    pub rest: serde_json::Map<String, serde_json::Value>,
133}
134
135#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
136#[serde(rename_all = "camelCase")]
137#[derive(gproxy_protocol_macros::WireBuilder)]
138#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
139pub struct FunctionCallingConfig {
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub mode: Option<FunctionCallingMode>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub allowed_function_names: Option<Vec<String>>,
144    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
145    pub rest: serde_json::Map<String, serde_json::Value>,
146}