Skip to main content

gproxy_protocol/protocol/openai/generate_content/
responses_websocket.rs

1use serde::{Deserialize, Serialize};
2
3use super::super::common::*;
4use super::{ResponseCreateRequest, ResponseStreamEvent};
5
6pub type ResponseWebSocketWireModel =
7    OpenAiWireModel<ResponseWebSocketRequest, ResponseStreamEvent>;
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(tag = "type")]
11#[allow(clippy::large_enum_variant)]
12#[non_exhaustive]
13pub enum ResponseWebSocketRequest {
14    #[serde(rename = "response.create")]
15    ResponseCreate(ResponseCreateWebSocketRequest),
16}
17
18#[derive(
19    Debug, Clone, PartialEq, Serialize, Deserialize, Default, gproxy_protocol_macros::WireBuilder,
20)]
21#[non_exhaustive]
22pub struct ResponseCreateWebSocketRequest {
23    #[serde(flatten)]
24    pub response: ResponseCreateRequest,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub generate: Option<bool>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub client_metadata: Option<Metadata>,
29}
30
31#[cfg(test)]
32mod tests {
33    use serde_json::json;
34
35    use super::*;
36    use crate::protocol::openai::{OpenAiModelId, ResponseInput};
37
38    #[test]
39    fn response_create_frame_round_trips_websocket_fields() {
40        let value = json!({
41            "type": "response.create",
42            "model": "gpt-x",
43            "input": "hello",
44            "stream": true,
45            "generate": false,
46            "client_metadata": {
47                "x-codex-installation-id": "installation-1"
48            }
49        });
50
51        let parsed: ResponseWebSocketRequest = serde_json::from_value(value).unwrap();
52        let ResponseWebSocketRequest::ResponseCreate(frame) = parsed;
53        assert_eq!(
54            frame.response.model,
55            Some(OpenAiModelId::Unknown("gpt-x".to_owned()))
56        );
57        assert_eq!(
58            frame.response.input,
59            Some(ResponseInput::Text("hello".to_owned()))
60        );
61        assert_eq!(frame.response.stream, Some(true));
62        assert_eq!(frame.generate, Some(false));
63        assert_eq!(
64            frame
65                .client_metadata
66                .as_ref()
67                .and_then(|m| m.get("x-codex-installation-id")),
68            Some(&"installation-1".to_owned())
69        );
70
71        let serialized = serde_json::to_value(ResponseWebSocketRequest::ResponseCreate(frame))
72            .expect("serialize websocket response.create");
73        assert_eq!(serialized["type"], json!("response.create"));
74        assert_eq!(serialized["generate"], json!(false));
75    }
76}