gproxy_protocol/protocol/openai/generate_content/
responses_websocket.rs1use 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}