Skip to main content

gproxy_protocol/gemini/generate_content/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::gemini::generate_content::types::{
6    GeminiContent, GeminiGenerationConfig, GeminiSafetySetting, GeminiTool, GeminiToolConfig,
7    HttpMethod,
8};
9
10/// Request descriptor for Gemini `models.generateContent` endpoint.
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct GeminiGenerateContentRequest {
13    /// HTTP method.
14    pub method: HttpMethod,
15    /// Path parameters.
16    pub path: PathParameters,
17    /// Query parameters.
18    pub query: QueryParameters,
19    /// Request headers.
20    pub headers: RequestHeaders,
21    /// Request body.
22    pub body: RequestBody,
23}
24
25impl Default for GeminiGenerateContentRequest {
26    fn default() -> Self {
27        Self {
28            method: HttpMethod::Post,
29            path: PathParameters::default(),
30            query: QueryParameters::default(),
31            headers: RequestHeaders::default(),
32            body: RequestBody::default(),
33        }
34    }
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
38pub struct PathParameters {
39    /// Resource name in form `models/{model}`.
40    pub model: String,
41}
42
43/// Proxy-side request model does not carry query parameters.
44#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
45pub struct QueryParameters {}
46
47/// Proxy-side request model does not carry auth headers.
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
49pub struct RequestHeaders {
50    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
51    pub extra: BTreeMap<String, String>,
52}
53
54#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
55pub struct RequestBody {
56    /// Conversation content for this turn.
57    pub contents: Vec<GeminiContent>,
58    /// Optional tool definitions.
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub tools: Option<Vec<GeminiTool>>,
61    /// Optional tool configuration.
62    #[serde(
63        rename = "toolConfig",
64        default,
65        skip_serializing_if = "Option::is_none"
66    )]
67    pub tool_config: Option<GeminiToolConfig>,
68    /// Optional safety settings.
69    #[serde(
70        rename = "safetySettings",
71        default,
72        skip_serializing_if = "Option::is_none"
73    )]
74    pub safety_settings: Option<Vec<GeminiSafetySetting>>,
75    /// Optional system instruction content.
76    #[serde(
77        rename = "systemInstruction",
78        default,
79        skip_serializing_if = "Option::is_none"
80    )]
81    pub system_instruction: Option<GeminiContent>,
82    /// Optional generation controls.
83    #[serde(
84        rename = "generationConfig",
85        default,
86        skip_serializing_if = "Option::is_none"
87    )]
88    pub generation_config: Option<GeminiGenerationConfig>,
89    /// Optional cache reference, e.g. `cachedContents/{id}`.
90    #[serde(
91        rename = "cachedContent",
92        default,
93        skip_serializing_if = "Option::is_none"
94    )]
95    pub cached_content: Option<String>,
96    /// Optional logging behavior override.
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub store: Option<bool>,
99}