use std::collections::HashMap;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::error::OpenAIError;
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum MessageRole {
User,
Assistant,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageObject {
pub id: String,
pub object: String,
pub created_at: i32,
pub thread_id: String,
pub role: MessageRole,
pub content: Vec<MessageContent>,
pub assistant_id: Option<String>,
pub run_id: Option<String>,
pub file_ids: Vec<String>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum MessageContent {
Text(MessageContentTextObject),
ImageFile(MessageContentImageFileObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextObject {
pub r#type: String,
pub text: TextData,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct TextData {
pub value: String,
pub annotations: Vec<MessageContentTextAnnotations>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum MessageContentTextAnnotations {
FileCitation(MessageContentTextAnnotationsFileCitationObject),
FilePath(MessageContentTextAnnotationsFilePathObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextAnnotationsFileCitationObject {
pub r#type: String,
pub text: String,
pub file_citation: FileCitation,
pub start_index: u32,
pub end_index: u32,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct FileCitation {
pub file_id: String,
pub quote: String,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextAnnotationsFilePathObject {
pub r#type: String,
pub text: String,
pub file_path: FilePath,
pub start_index: u32,
pub end_index: u32,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct FilePath {
pub file_id: String,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentImageFileObject {
pub r#type: String,
pub image_file: ImageFile,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct ImageFile {
pub file_id: String,
}
#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
#[builder(name = "CreateMessageRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateMessageRequest {
#[builder(default = "\"user\".into()")]
pub role: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
pub struct ModifyMessageRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
pub struct DeleteMessageResponse {
pub id: String,
pub deleted: bool,
pub object: String,
}
#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
pub struct ListMessagesResponse {
pub object: String,
pub data: Vec<MessageObject>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}