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