Skip to main content

gproxy_protocol/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::{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}