1use std::collections::HashMap;
2
3use derive_builder::Builder;
4use serde::{Deserialize, Serialize};
5
6use crate::error::OpenAIError;
7
8#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
10pub struct ChatSessionResource {
11 pub id: String,
13 #[serde(default = "default_session_object")]
15 pub object: String,
16 pub expires_at: u64,
18 pub client_secret: String,
20 pub workflow: ChatkitWorkflow,
22 pub user: String,
24 pub rate_limits: ChatSessionRateLimits,
26 pub max_requests_per_1_minute: u32,
28 pub status: ChatSessionStatus,
30 pub chatkit_configuration: ChatSessionChatkitConfiguration,
32}
33
34fn default_session_object() -> String {
35 "chatkit.session".to_string()
36}
37
38#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
40pub struct ChatkitWorkflow {
41 pub id: String,
43 #[serde(skip_serializing_if = "Option::is_none")]
46 pub version: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
50 pub state_variables: Option<HashMap<String, serde_json::Value>>,
51 pub tracing: ChatkitWorkflowTracing,
53}
54
55#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
57pub struct ChatkitWorkflowTracing {
58 pub enabled: bool,
60}
61
62#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
64pub struct ChatSessionRateLimits {
65 pub max_requests_per_1_minute: u32,
67}
68
69#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
71#[serde(rename_all = "snake_case")]
72pub enum ChatSessionStatus {
73 Active,
74 Expired,
75 Cancelled,
76}
77
78#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
80pub struct ChatSessionChatkitConfiguration {
81 pub automatic_thread_titling: ChatSessionAutomaticThreadTitling,
83 pub file_upload: ChatSessionFileUpload,
85 pub history: ChatSessionHistory,
87}
88
89#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
91pub struct ChatSessionAutomaticThreadTitling {
92 pub enabled: bool,
94}
95
96#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
98pub struct ChatSessionFileUpload {
99 pub enabled: bool,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub max_file_size: Option<u32>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub max_files: Option<u32>,
107}
108
109#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
111pub struct ChatSessionHistory {
112 pub enabled: bool,
114 #[serde(skip_serializing_if = "Option::is_none")]
117 pub recent_threads: Option<u32>,
118}
119
120#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
122#[builder(name = "CreateChatSessionRequestArgs")]
123#[builder(pattern = "mutable")]
124#[builder(setter(into, strip_option), default)]
125#[builder(derive(Debug))]
126#[builder(build_fn(error = "OpenAIError"))]
127pub struct CreateChatSessionBody {
128 pub workflow: WorkflowParam,
130 pub user: String,
133 #[serde(skip_serializing_if = "Option::is_none")]
136 pub expires_after: Option<ExpiresAfterParam>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub rate_limits: Option<RateLimitsParam>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub chatkit_configuration: Option<ChatkitConfigurationParam>,
143}
144
145#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
147#[builder(name = "WorkflowParamArgs")]
148#[builder(pattern = "mutable")]
149#[builder(setter(into, strip_option), default)]
150#[builder(derive(Debug))]
151#[builder(build_fn(error = "OpenAIError"))]
152pub struct WorkflowParam {
153 pub id: String,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub version: Option<String>,
158 #[serde(skip_serializing_if = "Option::is_none")]
161 pub state_variables: Option<HashMap<String, serde_json::Value>>,
162 #[serde(skip_serializing_if = "Option::is_none")]
165 pub tracing: Option<WorkflowTracingParam>,
166}
167
168#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
170#[builder(name = "WorkflowTracingParamArgs")]
171#[builder(pattern = "mutable")]
172#[builder(setter(into, strip_option), default)]
173#[builder(derive(Debug))]
174#[builder(build_fn(error = "OpenAIError"))]
175pub struct WorkflowTracingParam {
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub enabled: Option<bool>,
179}
180
181#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
183#[builder(name = "ExpiresAfterParamArgs")]
184#[builder(pattern = "mutable")]
185#[builder(setter(into, strip_option), default)]
186#[builder(derive(Debug))]
187#[builder(build_fn(error = "OpenAIError"))]
188pub struct ExpiresAfterParam {
189 #[serde(default = "default_anchor")]
191 #[builder(default = "default_anchor()")]
192 pub anchor: String,
193 pub seconds: u32,
195}
196
197fn default_anchor() -> String {
198 "created_at".to_string()
199}
200
201#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
203#[builder(name = "RateLimitsParamArgs")]
204#[builder(pattern = "mutable")]
205#[builder(setter(into, strip_option), default)]
206#[builder(derive(Debug))]
207#[builder(build_fn(error = "OpenAIError"))]
208pub struct RateLimitsParam {
209 #[serde(skip_serializing_if = "Option::is_none")]
211 pub max_requests_per_1_minute: Option<u32>,
212}
213
214#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
216#[builder(name = "ChatkitConfigurationParamArgs")]
217#[builder(pattern = "mutable")]
218#[builder(setter(into, strip_option), default)]
219#[builder(derive(Debug))]
220#[builder(build_fn(error = "OpenAIError"))]
221pub struct ChatkitConfigurationParam {
222 #[serde(skip_serializing_if = "Option::is_none")]
225 pub automatic_thread_titling: Option<AutomaticThreadTitlingParam>,
226 #[serde(skip_serializing_if = "Option::is_none")]
229 pub file_upload: Option<FileUploadParam>,
230 #[serde(skip_serializing_if = "Option::is_none")]
233 pub history: Option<HistoryParam>,
234}
235
236#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
238#[builder(name = "AutomaticThreadTitlingParamArgs")]
239#[builder(pattern = "mutable")]
240#[builder(setter(into, strip_option), default)]
241#[builder(derive(Debug))]
242#[builder(build_fn(error = "OpenAIError"))]
243pub struct AutomaticThreadTitlingParam {
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub enabled: Option<bool>,
247}
248
249#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
251#[builder(name = "FileUploadParamArgs")]
252#[builder(pattern = "mutable")]
253#[builder(setter(into, strip_option), default)]
254#[builder(derive(Debug))]
255#[builder(build_fn(error = "OpenAIError"))]
256pub struct FileUploadParam {
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub enabled: Option<bool>,
260 #[serde(skip_serializing_if = "Option::is_none")]
263 pub max_file_size: Option<u32>,
264 #[serde(skip_serializing_if = "Option::is_none")]
266 pub max_files: Option<u32>,
267}
268
269#[derive(Clone, Serialize, Debug, Deserialize, Builder, PartialEq, Default)]
271#[builder(name = "HistoryParamArgs")]
272#[builder(pattern = "mutable")]
273#[builder(setter(into, strip_option), default)]
274#[builder(derive(Debug))]
275#[builder(build_fn(error = "OpenAIError"))]
276pub struct HistoryParam {
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub enabled: Option<bool>,
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub recent_threads: Option<u32>,
283}