Skip to main content

gproxy_protocol/wire/openai/
models.rs

1use serde::{Deserialize, Serialize};
2
3use crate::Rest;
4
5/// Query/path request shapes for `GET /models` and `GET /models/{model}`.
6/// Source: `upstream_docs/openai/docs/List models.md` and `Retrieve model.md`.
7pub type ListModelsRequest = crate::WireRequest<()>;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
12#[derive(gproxy_protocol_macros::DeclaredFields)]
13pub enum ListObject {
14    List,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
18#[serde(rename_all = "snake_case")]
19#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
20#[derive(gproxy_protocol_macros::DeclaredFields)]
21pub enum ModelObject {
22    Model,
23}
24
25pub type GetModelRequest = crate::WireRequest<()>;
26
27#[derive(
28    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
29)]
30#[serde(rename_all = "snake_case")]
31#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
32#[derive(gproxy_protocol_macros::DeclaredFields)]
33pub struct ListModelsResponseBody {
34    pub data: Vec<Model>,
35    pub object: ListObject,
36    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
37    pub rest: Rest,
38}
39
40pub type ListModelsResponse = crate::WireResponse<ListModelsResponseBody>;
41pub type GetModelResponse = crate::WireResponse<Model>;
42
43#[derive(
44    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
45)]
46#[serde(rename_all = "snake_case")]
47#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
48#[derive(gproxy_protocol_macros::DeclaredFields)]
49pub struct Model {
50    pub id: String,
51    /// Some compatible catalogs do not report a creation timestamp.
52    #[wire(required)]
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub created: Option<i64>,
55    pub object: ModelObject,
56    #[wire(required)]
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub owned_by: Option<String>,
59
60    // GPROXY model extensions, matching the v3 OpenAI model contract.
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub display_name: Option<String>,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub description: Option<String>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub instructions: Option<String>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub context_window: Option<u64>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub max_context_window: Option<u64>,
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub max_output_tokens: Option<u64>,
73    #[serde(default, skip_serializing_if = "Option::is_none")]
74    pub thinking_supported: Option<bool>,
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub input_modalities: Option<Vec<String>>,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub output_modalities: Option<Vec<String>>,
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub supported_parameters: Option<Vec<String>>,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub supported_reasoning_levels: Option<Vec<ModelReasoningLevel>>,
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub default_reasoning_level: Option<String>,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub service_tiers: Option<Vec<ModelServiceTier>>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub default_service_tier: Option<String>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub generation_methods: Option<Vec<String>>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub supported_actions: Option<Vec<String>>,
93    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
94    pub rest: Rest,
95}
96
97#[derive(
98    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
99)]
100pub struct ModelReasoningLevel {
101    pub effort: String,
102    pub description: String,
103}
104#[derive(
105    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
106)]
107pub struct ModelServiceTier {
108    pub id: String,
109    pub name: String,
110    pub description: String,
111}