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")]
14pub struct Tool {
15    #[serde(default, skip_serializing_if = "Vec::is_empty")]
16    pub function_declarations: Vec<FunctionDeclaration>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub google_search_retrieval: Option<GoogleSearchRetrieval>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub code_execution: Option<CodeExecution>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub google_search: Option<GoogleSearch>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub computer_use: Option<ComputerUse>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub url_context: Option<UrlContext>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub file_search: Option<FileSearch>,
29    #[serde(default, skip_serializing_if = "Vec::is_empty")]
30    pub mcp_servers: Vec<McpServer>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub google_maps: Option<GoogleMaps>,
33    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
34    pub extra: ExtraFields,
35}
36
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
38#[serde(rename_all = "camelCase")]
39pub struct FunctionDeclaration {
40    pub name: String,
41    pub description: String,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub behavior: Option<FunctionBehavior>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub parameters: Option<Schema>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub parameters_json_schema: Option<Value>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub response: Option<Schema>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub response_json_schema: Option<Value>,
52    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
53    pub extra: ExtraFields,
54}
55
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
57#[serde(rename_all = "camelCase")]
58pub struct Schema {
59    pub r#type: SchemaType,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub format: Option<String>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub title: Option<String>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub description: Option<String>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub nullable: Option<bool>,
68    #[serde(default, skip_serializing_if = "Vec::is_empty")]
69    pub r#enum: Vec<String>,
70    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
71    pub properties: BTreeMap<String, Schema>,
72    #[serde(default, skip_serializing_if = "Vec::is_empty")]
73    pub required: Vec<String>,
74    #[serde(default, skip_serializing_if = "Vec::is_empty")]
75    pub any_of: Vec<Schema>,
76    #[serde(default, skip_serializing_if = "Vec::is_empty")]
77    pub property_ordering: Vec<String>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub items: Option<Box<Schema>>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub minimum: Option<f64>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub maximum: Option<f64>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub max_items: Option<String>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub min_items: Option<String>,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub min_properties: Option<String>,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub max_properties: Option<String>,
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub min_length: Option<String>,
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub max_length: Option<String>,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub pattern: Option<String>,
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub example: Option<Value>,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub default: Option<Value>,
102    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
103    pub extra: ExtraFields,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
107#[serde(rename_all = "camelCase")]
108pub struct ToolConfig {
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub function_calling_config: Option<FunctionCallingConfig>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub retrieval_config: Option<RetrievalConfig>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub include_server_side_tool_invocations: Option<bool>,
115    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
116    pub extra: ExtraFields,
117}
118
119#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
120#[serde(rename_all = "camelCase")]
121pub struct FunctionCallingConfig {
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub mode: Option<FunctionCallingMode>,
124    #[serde(default, skip_serializing_if = "Vec::is_empty")]
125    pub allowed_function_names: Vec<String>,
126    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
127    pub extra: ExtraFields,
128}