gproxy_protocol/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::{ExtraFields, FunctionBehavior, FunctionCallingMode, SchemaType};
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14#[derive(gproxy_protocol_macros::WireBuilder)]
15#[non_exhaustive]
16pub struct Tool {
17 #[serde(default, skip_serializing_if = "Vec::is_empty")]
18 pub function_declarations: 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(default, skip_serializing_if = "Vec::is_empty")]
32 pub mcp_servers: Vec<McpServer>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub google_maps: Option<GoogleMaps>,
35 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
36 pub extra: ExtraFields,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
40#[serde(rename_all = "camelCase")]
41#[derive(gproxy_protocol_macros::WireBuilder)]
42#[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")]
51 pub parameters_json_schema: Option<Value>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub response: Option<Schema>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub response_json_schema: Option<Value>,
56 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
57 pub extra: ExtraFields,
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
61#[serde(rename_all = "camelCase")]
62#[derive(gproxy_protocol_macros::WireBuilder)]
63#[non_exhaustive]
64pub struct Schema {
65 pub r#type: SchemaType,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub format: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub title: Option<String>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub description: Option<String>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub nullable: Option<bool>,
74 #[serde(default, skip_serializing_if = "Vec::is_empty")]
75 pub r#enum: Vec<String>,
76 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
77 pub properties: BTreeMap<String, Schema>,
78 #[serde(default, skip_serializing_if = "Vec::is_empty")]
79 pub required: Vec<String>,
80 #[serde(default, skip_serializing_if = "Vec::is_empty")]
81 pub any_of: Vec<Schema>,
82 #[serde(default, skip_serializing_if = "Vec::is_empty")]
83 pub property_ordering: Vec<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub items: Option<Box<Schema>>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub minimum: Option<f64>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub maximum: Option<f64>,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub max_items: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub min_items: Option<String>,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub min_properties: Option<String>,
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub max_properties: Option<String>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub min_length: Option<String>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub max_length: Option<String>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub pattern: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub example: Option<Value>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub default: Option<Value>,
108 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
109 pub extra: ExtraFields,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
113#[serde(rename_all = "camelCase")]
114#[derive(gproxy_protocol_macros::WireBuilder)]
115#[non_exhaustive]
116pub struct ToolConfig {
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub function_calling_config: Option<FunctionCallingConfig>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub retrieval_config: Option<RetrievalConfig>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub include_server_side_tool_invocations: Option<bool>,
123 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
124 pub extra: ExtraFields,
125}
126
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
128#[serde(rename_all = "camelCase")]
129#[derive(gproxy_protocol_macros::WireBuilder)]
130#[non_exhaustive]
131pub struct FunctionCallingConfig {
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub mode: Option<FunctionCallingMode>,
134 #[serde(default, skip_serializing_if = "Vec::is_empty")]
135 pub allowed_function_names: Vec<String>,
136 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
137 pub extra: ExtraFields,
138}