Skip to main content

gproxy_protocol/openai/create_chat_completions/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::openai::create_chat_completions::types::{
6    self, ChatCompletionClaudeThinkingConfig, ChatCompletionGeminiExtraThinkingConfig, HttpMethod,
7};
8
9/// Request descriptor for OpenAI `chat.completions.create` endpoint.
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct OpenAiChatCompletionsRequest {
12    /// HTTP method.
13    pub method: HttpMethod,
14    /// Path parameters.
15    pub path: PathParameters,
16    /// Query parameters.
17    pub query: QueryParameters,
18    /// Request headers.
19    pub headers: RequestHeaders,
20    /// Request body.
21    pub body: RequestBody,
22}
23
24impl Default for OpenAiChatCompletionsRequest {
25    fn default() -> Self {
26        Self {
27            method: HttpMethod::Post,
28            path: PathParameters::default(),
29            query: QueryParameters::default(),
30            headers: RequestHeaders::default(),
31            body: RequestBody::default(),
32        }
33    }
34}
35
36/// `chat.completions.create` does not define path params.
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
38pub struct PathParameters {}
39
40/// `chat.completions.create` does not define query params.
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
42pub struct QueryParameters {}
43
44/// Proxy-side request model does not carry auth headers.
45#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
46pub struct RequestHeaders {
47    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
48    pub extra: BTreeMap<String, String>,
49}
50
51/// Body payload for `POST /chat/completions`.
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
53pub struct RequestBody {
54    /// A list of messages comprising the conversation so far.
55    pub messages: Vec<types::ChatCompletionMessageParam>,
56    /// Model identifier.
57    pub model: types::Model,
58    /// Audio output configuration.
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub audio: Option<types::ChatCompletionAudioParam>,
61    /// Frequency penalty in range [-2.0, 2.0].
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub frequency_penalty: Option<f64>,
64    /// Deprecated function-call control.
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub function_call: Option<types::ChatCompletionFunctionCallOptionParam>,
67    /// Deprecated function definitions.
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub functions: Option<Vec<types::ChatCompletionLegacyFunction>>,
70    /// Token-level logit bias.
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub logit_bias: Option<types::LogitBias>,
73    /// Whether to return logprobs.
74    #[serde(default, skip_serializing_if = "Option::is_none")]
75    pub logprobs: Option<bool>,
76    /// Upper bound of generated tokens including reasoning tokens.
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub max_completion_tokens: Option<u64>,
79    /// Deprecated maximum generated tokens.
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub max_tokens: Option<u64>,
82    /// Request metadata key-value map.
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub metadata: Option<types::Metadata>,
85    /// Output modalities.
86    #[serde(default, skip_serializing_if = "Option::is_none")]
87    pub modalities: Option<Vec<types::ChatCompletionModality>>,
88    /// Number of choices to generate.
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub n: Option<u32>,
91    /// Enable parallel tool calls.
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub parallel_tool_calls: Option<bool>,
94    /// Predicted output content.
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub prediction: Option<types::ChatCompletionPredictionContent>,
97    /// Presence penalty in range [-2.0, 2.0].
98    #[serde(default, skip_serializing_if = "Option::is_none")]
99    pub presence_penalty: Option<f64>,
100    /// Prompt cache bucketing key.
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub prompt_cache_key: Option<String>,
103    /// Prompt cache retention policy.
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub prompt_cache_retention: Option<types::ChatCompletionPromptCacheRetention>,
106    /// Reasoning effort level.
107    #[serde(default, skip_serializing_if = "Option::is_none")]
108    pub reasoning_effort: Option<types::ChatCompletionReasoningEffort>,
109    /// Output format control.
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub response_format: Option<types::ChatCompletionResponseFormat>,
112    /// Stable safety identifier.
113    #[serde(default, skip_serializing_if = "Option::is_none")]
114    pub safety_identifier: Option<String>,
115    /// Best-effort deterministic seed.
116    #[serde(default, skip_serializing_if = "Option::is_none")]
117    pub seed: Option<i64>,
118    /// Requested processing tier.
119    #[serde(default, skip_serializing_if = "Option::is_none")]
120    pub service_tier: Option<types::ChatCompletionServiceTier>,
121    /// Stop sequence(s).
122    #[serde(default, skip_serializing_if = "Option::is_none")]
123    pub stop: Option<types::ChatCompletionStop>,
124    /// Whether to store output.
125    #[serde(default, skip_serializing_if = "Option::is_none")]
126    pub store: Option<bool>,
127    /// Whether to stream with SSE.
128    #[serde(default, skip_serializing_if = "Option::is_none")]
129    pub stream: Option<bool>,
130    /// Streaming options.
131    #[serde(default, skip_serializing_if = "Option::is_none")]
132    pub stream_options: Option<types::ChatCompletionStreamOptions>,
133    /// Sampling temperature in range [0, 2].
134    #[serde(default, skip_serializing_if = "Option::is_none")]
135    pub temperature: Option<f64>,
136    /// Tool selection policy.
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub tool_choice: Option<types::ChatCompletionToolChoiceOption>,
139    /// Available tools.
140    #[serde(default, skip_serializing_if = "Option::is_none")]
141    pub tools: Option<Vec<types::ChatCompletionTool>>,
142    /// Number of top candidate tokens in logprobs.
143    #[serde(default, skip_serializing_if = "Option::is_none")]
144    pub top_logprobs: Option<u32>,
145    /// Nucleus sampling probability mass.
146    #[serde(default, skip_serializing_if = "Option::is_none")]
147    pub top_p: Option<f64>,
148    /// Deprecated user identifier.
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    pub user: Option<String>,
151    /// Verbosity hint.
152    #[serde(default, skip_serializing_if = "Option::is_none")]
153    pub verbosity: Option<types::ChatCompletionVerbosity>,
154    /// Provider-specific OpenAI-compatible extension payload (flattened).
155    /// Claude-compatible extended thinking control.
156    #[serde(default, skip_serializing_if = "Option::is_none")]
157    pub thinking: Option<ChatCompletionClaudeThinkingConfig>,
158    #[serde(
159        rename = "thinking_config",
160        default,
161        skip_serializing_if = "Option::is_none"
162    )]
163    pub thinking_config: Option<ChatCompletionGeminiExtraThinkingConfig>,
164    #[serde(
165        rename = "cached_content",
166        default,
167        skip_serializing_if = "Option::is_none"
168    )]
169    pub cached_content: Option<String>,
170    /// Web-search tool options.
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub web_search_options: Option<types::ChatCompletionWebSearchOptions>,
173}