use crate::LingerError;
use crate::RequestId;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[non_exhaustive]
pub struct ChatKitSession {
pub id: String,
pub object: String,
pub expires_at: u64,
pub client_secret: String,
pub workflow: ChatKitWorkflow,
pub user: String,
pub rate_limits: ChatKitSessionRateLimits,
pub max_requests_per_1_minute: u64,
pub status: String,
pub chatkit_configuration: Value,
#[serde(skip)]
request_id: Option<RequestId>,
}
impl ChatKitSession {
pub(crate) fn with_request_id(mut self, request_id: Option<RequestId>) -> Self {
self.request_id = request_id;
self
}
pub fn request_id(&self) -> Option<&RequestId> {
self.request_id.as_ref()
}
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[non_exhaustive]
pub struct ChatKitThread {
pub id: String,
pub object: String,
pub created_at: u64,
pub title: Option<String>,
pub status: Value,
pub user: String,
#[serde(skip)]
request_id: Option<RequestId>,
}
impl ChatKitThread {
pub(crate) fn with_request_id(mut self, request_id: Option<RequestId>) -> Self {
self.request_id = request_id;
self
}
pub fn request_id(&self) -> Option<&RequestId> {
self.request_id.as_ref()
}
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[non_exhaustive]
pub struct ChatKitThreadDeletion {
pub id: String,
pub object: String,
pub deleted: bool,
#[serde(skip)]
request_id: Option<RequestId>,
}
impl ChatKitThreadDeletion {
pub(crate) fn with_request_id(mut self, request_id: Option<RequestId>) -> Self {
self.request_id = request_id;
self
}
pub fn request_id(&self) -> Option<&RequestId> {
self.request_id.as_ref()
}
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[non_exhaustive]
pub struct ChatKitThreadPage {
pub object: String,
pub data: Vec<ChatKitThread>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
#[serde(skip)]
request_id: Option<RequestId>,
}
impl ChatKitThreadPage {
pub(crate) fn with_request_id(mut self, request_id: Option<RequestId>) -> Self {
self.request_id = request_id;
self
}
pub fn request_id(&self) -> Option<&RequestId> {
self.request_id.as_ref()
}
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[non_exhaustive]
pub struct ChatKitThreadItemPage {
pub object: String,
pub data: Vec<Value>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
#[serde(skip)]
request_id: Option<RequestId>,
}
impl ChatKitThreadItemPage {
pub(crate) fn with_request_id(mut self, request_id: Option<RequestId>) -> Self {
self.request_id = request_id;
self
}
pub fn request_id(&self) -> Option<&RequestId> {
self.request_id.as_ref()
}
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[non_exhaustive]
pub struct ChatKitWorkflow {
pub id: String,
pub version: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[non_exhaustive]
pub struct ChatKitSessionRateLimits {
pub max_requests_per_1_minute: u64,
}
#[derive(Clone, Debug, Serialize, PartialEq)]
#[non_exhaustive]
pub struct CreateChatKitSessionRequest {
pub workflow: ChatKitWorkflowParam,
pub user: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_after: Option<ChatKitSessionExpiration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rate_limits: Option<ChatKitSessionRateLimitOverrides>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chatkit_configuration: Option<Value>,
}
impl CreateChatKitSessionRequest {
pub fn builder() -> CreateChatKitSessionRequestBuilder {
CreateChatKitSessionRequestBuilder::default()
}
}
#[derive(Clone, Debug, Default)]
pub struct CreateChatKitSessionRequestBuilder {
workflow: Option<ChatKitWorkflowParam>,
user: Option<String>,
expires_after: Option<ChatKitSessionExpiration>,
rate_limits: Option<ChatKitSessionRateLimitOverrides>,
chatkit_configuration: Option<Value>,
}
impl CreateChatKitSessionRequestBuilder {
pub fn workflow(mut self, workflow: ChatKitWorkflowParam) -> Self {
self.workflow = Some(workflow);
self
}
pub fn user(mut self, user: impl Into<String>) -> Self {
self.user = Some(user.into());
self
}
pub fn expires_after(mut self, expires_after: ChatKitSessionExpiration) -> Self {
self.expires_after = Some(expires_after);
self
}
pub fn rate_limits(mut self, rate_limits: ChatKitSessionRateLimitOverrides) -> Self {
self.rate_limits = Some(rate_limits);
self
}
pub fn chatkit_configuration(mut self, chatkit_configuration: Value) -> Self {
self.chatkit_configuration = Some(chatkit_configuration);
self
}
pub fn build(self) -> Result<CreateChatKitSessionRequest, LingerError> {
let workflow = self
.workflow
.ok_or_else(|| LingerError::invalid_config("workflow is required"))?;
let user = self
.user
.ok_or_else(|| LingerError::invalid_config("user is required"))?;
if user.trim().is_empty() {
return Err(LingerError::invalid_config("user must not be empty"));
}
Ok(CreateChatKitSessionRequest {
workflow,
user,
expires_after: self.expires_after,
rate_limits: self.rate_limits,
chatkit_configuration: self.chatkit_configuration,
})
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
#[non_exhaustive]
pub struct ChatKitWorkflowParam {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_variables: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracing: Option<Value>,
}
impl ChatKitWorkflowParam {
pub fn new(id: impl Into<String>) -> Self {
Self {
id: id.into(),
version: None,
state_variables: None,
tracing: None,
}
}
pub fn version(mut self, version: impl Into<String>) -> Self {
self.version = Some(version.into());
self
}
pub fn state_variables(mut self, state_variables: Value) -> Self {
self.state_variables = Some(state_variables);
self
}
pub fn tracing(mut self, tracing: Value) -> Self {
self.tracing = Some(tracing);
self
}
}
#[derive(Clone, Debug, Serialize, PartialEq, Eq)]
#[non_exhaustive]
pub struct ChatKitSessionExpiration {
pub anchor: String,
pub seconds: u64,
}
impl ChatKitSessionExpiration {
pub fn created_at(seconds: u64) -> Self {
Self {
anchor: "created_at".to_string(),
seconds,
}
}
}
#[derive(Clone, Debug, Default, Serialize, PartialEq, Eq)]
#[non_exhaustive]
pub struct ChatKitSessionRateLimitOverrides {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_requests_per_1_minute: Option<u64>,
}
impl ChatKitSessionRateLimitOverrides {
pub fn new() -> Self {
Self::default()
}
pub fn max_requests_per_1_minute(mut self, max_requests_per_1_minute: u64) -> Self {
self.max_requests_per_1_minute = Some(max_requests_per_1_minute);
self
}
}