Skip to main content

gproxy_protocol/openai/count_tokens/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::openai::count_tokens::types::{
6    HttpMethod, ResponseConversation, ResponseInput, ResponseReasoning, ResponseTextConfig,
7    ResponseTool, ResponseToolChoice, ResponseTruncation,
8};
9
10/// Request descriptor for OpenAI `responses.input_tokens.count` endpoint.
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct OpenAiCountTokensRequest {
13    /// HTTP method.
14    pub method: HttpMethod,
15    /// Path parameters.
16    pub path: PathParameters,
17    /// Query parameters.
18    pub query: QueryParameters,
19    /// Request headers.
20    pub headers: RequestHeaders,
21    /// Request body.
22    pub body: RequestBody,
23}
24
25impl Default for OpenAiCountTokensRequest {
26    fn default() -> Self {
27        Self {
28            method: HttpMethod::Post,
29            path: PathParameters::default(),
30            query: QueryParameters::default(),
31            headers: RequestHeaders::default(),
32            body: RequestBody::default(),
33        }
34    }
35}
36
37/// `responses.input_tokens.count` does not define path params.
38#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
39pub struct PathParameters {}
40
41/// `responses.input_tokens.count` does not define query params.
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
43pub struct QueryParameters {}
44
45/// Proxy-side request model does not carry auth headers.
46#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
47pub struct RequestHeaders {
48    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
49    pub extra: BTreeMap<String, String>,
50}
51
52/// Request body for `POST /responses/input_tokens`.
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
54pub struct RequestBody {
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub conversation: Option<ResponseConversation>,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub input: Option<ResponseInput>,
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub instructions: Option<String>,
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub model: Option<String>,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub parallel_tool_calls: Option<bool>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub previous_response_id: Option<String>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub reasoning: Option<ResponseReasoning>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub text: Option<ResponseTextConfig>,
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub tool_choice: Option<ResponseToolChoice>,
73    #[serde(default, skip_serializing_if = "Option::is_none")]
74    pub tools: Option<Vec<ResponseTool>>,
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub truncation: Option<ResponseTruncation>,
77}