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")]
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}