gproxy_protocol/gemini/generate_content/
response.rs1use 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#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
11pub struct ResponseBody {
12 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub candidates: Option<Vec<GeminiCandidate>>,
15 #[serde(
17 rename = "promptFeedback",
18 default,
19 skip_serializing_if = "Option::is_none"
20 )]
21 pub prompt_feedback: Option<GeminiPromptFeedback>,
22 #[serde(
24 rename = "usageMetadata",
25 default,
26 skip_serializing_if = "Option::is_none"
27 )]
28 pub usage_metadata: Option<GeminiUsageMetadata>,
29 #[serde(
31 rename = "modelVersion",
32 default,
33 skip_serializing_if = "Option::is_none"
34 )]
35 pub model_version: Option<String>,
36 #[serde(
38 rename = "responseId",
39 default,
40 skip_serializing_if = "Option::is_none"
41 )]
42 pub response_id: Option<String>,
43 #[serde(
45 rename = "modelStatus",
46 default,
47 skip_serializing_if = "Option::is_none"
48 )]
49 pub model_status: Option<GeminiModelStatus>,
50}
51
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54#[serde(untagged)]
55#[allow(clippy::large_enum_variant)]
56pub enum GeminiGenerateContentResponse {
57 Success {
58 #[serde(with = "crate::gemini::types::status_code_serde")]
60 stats_code: StatusCode,
61 headers: GeminiResponseHeaders,
63 body: ResponseBody,
65 },
66 Error {
67 #[serde(with = "crate::gemini::types::status_code_serde")]
69 stats_code: StatusCode,
70 headers: GeminiResponseHeaders,
72 body: GeminiApiErrorResponse,
74 },
75}