Skip to main content

gproxy_protocol/openai/create_response/websocket/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::openai::create_response::websocket::types::{
6    HttpMethod, OpenAiCreateResponseWebSocketClientMessage,
7};
8
9/// Request descriptor for OpenAI Responses WebSocket endpoint.
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct OpenAiCreateResponseWebSocketConnectRequest {
12    /// HTTP method used by WebSocket handshake.
13    pub method: HttpMethod,
14    /// Path selector.
15    pub path: PathParameters,
16    /// Query parameters.
17    pub query: QueryParameters,
18    /// Request headers.
19    pub headers: RequestHeaders,
20    /// Optional first WebSocket frame to send after connect.
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub body: Option<RequestBody>,
23}
24
25impl Default for OpenAiCreateResponseWebSocketConnectRequest {
26    fn default() -> Self {
27        Self {
28            method: HttpMethod::Get,
29            path: PathParameters::default(),
30            query: QueryParameters::default(),
31            headers: RequestHeaders::default(),
32            body: None,
33        }
34    }
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
38pub struct PathParameters {
39    /// WebSocket route under provider base URL.
40    #[serde(default)]
41    pub endpoint: OpenAiCreateResponseWebSocketEndpoint,
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
45pub enum OpenAiCreateResponseWebSocketEndpoint {
46    #[default]
47    #[serde(rename = "responses")]
48    Responses,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
52pub struct QueryParameters {
53    /// Azure-compatible API version query key.
54    #[serde(
55        rename = "api-version",
56        default,
57        skip_serializing_if = "Option::is_none"
58    )]
59    pub api_version: Option<String>,
60    /// Provider-specific passthrough query params.
61    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
62    pub extra: BTreeMap<String, String>,
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
66pub struct RequestHeaders {
67    #[serde(
68        rename = "Authorization",
69        default,
70        skip_serializing_if = "Option::is_none"
71    )]
72    pub authorization: Option<String>,
73    #[serde(
74        rename = "OpenAI-Beta",
75        default,
76        skip_serializing_if = "Option::is_none"
77    )]
78    pub openai_beta: Option<String>,
79    #[serde(
80        rename = "x-codex-turn-state",
81        default,
82        skip_serializing_if = "Option::is_none"
83    )]
84    pub x_codex_turn_state: Option<String>,
85    #[serde(
86        rename = "x-codex-turn-metadata",
87        default,
88        skip_serializing_if = "Option::is_none"
89    )]
90    pub x_codex_turn_metadata: Option<String>,
91    #[serde(
92        rename = "session_id",
93        default,
94        skip_serializing_if = "Option::is_none"
95    )]
96    pub session_id: Option<String>,
97    #[serde(
98        rename = "ChatGPT-Account-ID",
99        default,
100        skip_serializing_if = "Option::is_none"
101    )]
102    pub chatgpt_account_id: Option<String>,
103    /// Provider-specific passthrough headers.
104    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
105    pub extra: BTreeMap<String, String>,
106}
107
108/// A single client message frame sent over Responses WebSocket.
109pub type RequestBody = OpenAiCreateResponseWebSocketClientMessage;