Skip to main content

gproxy_protocol/gemini/generate_content/
response.rs

1use http::StatusCode;
2use serde::{Deserialize, Serialize};
3
4use crate::gemini::generate_content::types::{
5    GeminiCandidate, GeminiModelStatus, GeminiPromptFeedback, GeminiUsageMetadata,
6};
7use crate::gemini::types::{GeminiApiErrorResponse, GeminiResponseHeaders};
8
9/// Successful response body for Gemini `models.generateContent`.
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
11pub struct ResponseBody {
12    /// Candidate responses generated by the model.
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub candidates: Option<Vec<GeminiCandidate>>,
15    /// Feedback about prompt safety filtering.
16    #[serde(
17        rename = "promptFeedback",
18        default,
19        skip_serializing_if = "Option::is_none"
20    )]
21    pub prompt_feedback: Option<GeminiPromptFeedback>,
22    /// Token usage metadata for this generation.
23    #[serde(
24        rename = "usageMetadata",
25        default,
26        skip_serializing_if = "Option::is_none"
27    )]
28    pub usage_metadata: Option<GeminiUsageMetadata>,
29    /// Version of the model that served this response.
30    #[serde(
31        rename = "modelVersion",
32        default,
33        skip_serializing_if = "Option::is_none"
34    )]
35    pub model_version: Option<String>,
36    /// Opaque response identifier.
37    #[serde(
38        rename = "responseId",
39        default,
40        skip_serializing_if = "Option::is_none"
41    )]
42    pub response_id: Option<String>,
43    /// Lifecycle/status metadata for the model.
44    #[serde(
45        rename = "modelStatus",
46        default,
47        skip_serializing_if = "Option::is_none"
48    )]
49    pub model_status: Option<GeminiModelStatus>,
50}
51
52/// Full HTTP response for Gemini `models.generateContent` endpoint.
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54#[serde(untagged)]
55#[allow(clippy::large_enum_variant)]
56pub enum GeminiGenerateContentResponse {
57    Success {
58        /// HTTP status code returned by server (should be `200 OK`).
59        #[serde(with = "crate::gemini::types::status_code_serde")]
60        stats_code: StatusCode,
61        /// Response headers.
62        headers: GeminiResponseHeaders,
63        /// Successful body.
64        body: ResponseBody,
65    },
66    Error {
67        /// HTTP status code returned by server (typically non-2xx).
68        #[serde(with = "crate::gemini::types::status_code_serde")]
69        stats_code: StatusCode,
70        /// Response headers.
71        headers: GeminiResponseHeaders,
72        /// Error body.
73        body: GeminiApiErrorResponse,
74    },
75}