Skip to main content

gproxy_protocol/openai/
types.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5/// HTTP method used by generated request descriptors.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "UPPERCASE")]
8pub enum HttpMethod {
9    Get,
10    Post,
11    Put,
12    Patch,
13    Delete,
14}
15
16/// Common response headers returned by OpenAI endpoints.
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
18pub struct OpenAiResponseHeaders {
19    /// Additional response headers.
20    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
21    pub extra: BTreeMap<String, String>,
22}
23
24/// Serde helpers for `http::StatusCode` as numeric code (e.g. 200, 404).
25pub mod status_code_serde {
26    use http::StatusCode;
27    use serde::de::Error as _;
28    use serde::{Deserialize, Deserializer, Serializer};
29
30    pub fn serialize<S>(value: &StatusCode, serializer: S) -> Result<S::Ok, S::Error>
31    where
32        S: Serializer,
33    {
34        serializer.serialize_u16(value.as_u16())
35    }
36
37    pub fn deserialize<'de, D>(deserializer: D) -> Result<StatusCode, D::Error>
38    where
39        D: Deserializer<'de>,
40    {
41        let code = u16::deserialize(deserializer)?;
42        StatusCode::from_u16(code).map_err(D::Error::custom)
43    }
44}
45
46/// Describes an OpenAI model offering that can be used with the API.
47#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
48pub struct OpenAiModel {
49    /// The model identifier.
50    pub id: String,
51    /// The Unix timestamp (in seconds) when the model was created.
52    pub created: u64,
53    /// The object type, always `model`.
54    pub object: OpenAiModelObject,
55    /// The organization that owns the model.
56    pub owned_by: String,
57}
58
59/// OpenAI model object discriminator.
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61pub enum OpenAiModelObject {
62    #[serde(rename = "model")]
63    Model,
64}
65
66/// Response body for OpenAI `models.list`.
67#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
68pub struct OpenAiModelList {
69    /// List of model records.
70    pub data: Vec<OpenAiModel>,
71    /// The object type, always `list`.
72    pub object: OpenAiListObject,
73}
74
75/// OpenAI list object discriminator.
76#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
77pub enum OpenAiListObject {
78    #[serde(rename = "list")]
79    List,
80}
81
82/// Top-level OpenAI API error response wrapper.
83#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
84pub struct OpenAiApiErrorResponse {
85    pub error: OpenAiApiError,
86}
87
88/// Standard OpenAI API error payload.
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
90pub struct OpenAiApiError {
91    /// Human-readable message describing the error.
92    pub message: String,
93    /// Machine-readable error type.
94    #[serde(rename = "type")]
95    pub type_: String,
96    /// Parameter related to the error, if any.
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub param: Option<String>,
99    /// Error code value, if provided.
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub code: Option<String>,
102}