Skip to main content

gproxy_protocol/openai/
search.rs

1//! Standalone search compatibility wire.
2//!
3//! The `/v1/alpha/search` operation is proprietary/session-derived. The local
4//! OpenAI snapshot documents web search only as a Responses tool and v2 has no
5//! named public request/response structs, so this module asserts no fields.
6
7use serde::{Deserialize, Serialize};
8
9use crate::openai::common::Rest;
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
12#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
13pub struct SearchRequest {
14    #[serde(default, flatten)]
15    pub rest: Rest,
16}
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
19#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
20pub struct SearchResponse {
21    #[serde(default, flatten)]
22    pub rest: Rest,
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28    use serde_json::json;
29
30    #[test]
31    fn opaque_search_models_preserve_every_field() {
32        let request = json!({"query":"rust", "future_filter":{"x":1}});
33        let parsed: SearchRequest = serde_json::from_value(request.clone()).unwrap();
34        assert_eq!(serde_json::to_value(parsed).unwrap(), request);
35
36        let response = json!({"results":[{"url":"https://example.com"}], "future":true});
37        let parsed: SearchResponse = serde_json::from_value(response.clone()).unwrap();
38        assert_eq!(serde_json::to_value(parsed).unwrap(), response);
39    }
40}