Skip to main content

gproxy_protocol/gemini/live/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::gemini::live::types::{GeminiBidiGenerateContentClientMessage, HttpMethod};
6
7/// Request descriptor for Gemini Live WebSocket endpoint (`BidiGenerateContent`).
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct GeminiLiveConnectRequest {
10    /// HTTP method used by WebSocket handshake.
11    pub method: HttpMethod,
12    /// Path selector for Live RPC.
13    pub path: PathParameters,
14    /// Optional query parameters for authentication.
15    pub query: QueryParameters,
16    /// Optional HTTP headers for authentication.
17    pub headers: RequestHeaders,
18    /// Optional first WebSocket frame to send after connect.
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub body: Option<RequestBody>,
21}
22
23impl Default for GeminiLiveConnectRequest {
24    fn default() -> Self {
25        Self {
26            method: HttpMethod::Get,
27            path: PathParameters::default(),
28            query: QueryParameters::default(),
29            headers: RequestHeaders::default(),
30            body: None,
31        }
32    }
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
36pub struct PathParameters {
37    /// RPC route under `/ws/`.
38    ///
39    /// Default: `...GenerativeService.BidiGenerateContent`.
40    #[serde(default)]
41    pub rpc: GeminiLiveRpcMethod,
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
45pub enum GeminiLiveRpcMethod {
46    #[default]
47    #[serde(rename = "google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent")]
48    BidiGenerateContent,
49    #[serde(
50        rename = "google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContentConstrained"
51    )]
52    BidiGenerateContentConstrained,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
56pub struct QueryParameters {
57    /// API key query parameter.
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub key: Option<String>,
60    /// Ephemeral token query parameter for constrained endpoint.
61    #[serde(
62        rename = "access_token",
63        default,
64        skip_serializing_if = "Option::is_none"
65    )]
66    pub access_token: Option<String>,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
70pub struct RequestHeaders {
71    /// Optional token header (`Token <token>`).
72    #[serde(
73        rename = "Authorization",
74        default,
75        skip_serializing_if = "Option::is_none"
76    )]
77    pub authorization: Option<String>,
78    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
79    pub extra: BTreeMap<String, String>,
80}
81
82/// A single client message frame sent over the Live WebSocket.
83pub type RequestBody = GeminiBidiGenerateContentClientMessage;