gproxy_protocol/gemini/common/tools/
mod.rs1use 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 #[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 #[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 #[serde(skip_serializing_if = "Option::is_none")]
111 pub example: Option<Value>,
112 #[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}