use std::collections::HashMap;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::error::OpenAIError;
use super::{ImageDetail, ImageUrl};
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum MessageRole {
#[default]
User,
Assistant,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MessageStatus {
InProgress,
Incomplete,
Completed,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MessageIncompleteDetailsType {
ContentFilter,
MaxTokens,
RunCancelled,
RunExpired,
RunFailed,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageIncompleteDetails {
pub reason: MessageIncompleteDetailsType,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageObject {
pub id: String,
pub object: String,
pub created_at: i32,
pub thread_id: String,
pub status: Option<MessageStatus>,
pub incomplete_details: Option<MessageIncompleteDetails>,
pub completed_at: Option<u32>,
pub incomplete_at: Option<u32>,
pub role: MessageRole,
pub content: Vec<MessageContent>,
pub assistant_id: Option<String>,
pub run_id: Option<String>,
pub attachments: Option<Vec<MessageAttachment>>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageAttachment {
pub file_id: String,
pub tools: Vec<MessageAttachmentTool>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageAttachmentTool {
CodeInterpreter,
FileSearch,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageContent {
Text(MessageContentTextObject),
ImageFile(MessageContentImageFileObject),
ImageUrl(MessageContentImageUrlObject),
Refusal(MessageContentRefusalObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentRefusalObject {
pub refusal: String,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextObject {
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(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageContentTextAnnotations {
FileCitation(MessageContentTextAnnotationsFileCitationObject),
FilePath(MessageContentTextAnnotationsFilePathObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextAnnotationsFileCitationObject {
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: Option<String>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentTextAnnotationsFilePathObject {
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 image_file: ImageFile,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct ImageFile {
pub file_id: String,
pub detail: Option<ImageDetail>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageContentImageUrlObject {
pub image_url: ImageUrl,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageRequestContentTextObject {
pub text: String,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum CreateMessageRequestContent {
Content(String),
ContentArray(Vec<MessageContentInput>),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageContentInput {
Text(MessageRequestContentTextObject),
ImageFile(MessageContentImageFileObject),
ImageUrl(MessageContentImageUrlObject),
}
#[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 {
pub role: MessageRole,
pub content: CreateMessageRequestContent,
pub attachments: Option<Vec<MessageAttachment>>,
#[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,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaObject {
pub id: String,
pub object: String,
pub delta: MessageDelta,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDelta {
pub role: Option<MessageRole>,
pub content: Option<Vec<MessageDeltaContent>>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageDeltaContent {
ImageFile(MessageDeltaContentImageFileObject),
ImageUrl(MessageDeltaContentImageUrlObject),
Text(MessageDeltaContentTextObject),
Refusal(MessageDeltaContentRefusalObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentRefusalObject {
pub index: i32,
pub refusal: Option<String>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentTextObject {
pub index: u32,
pub text: Option<MessageDeltaContentText>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentText {
pub value: Option<String>,
pub annotations: Option<Vec<MessageDeltaContentTextAnnotations>>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum MessageDeltaContentTextAnnotations {
FileCitation(MessageDeltaContentTextAnnotationsFileCitationObject),
FilePath(MessageDeltaContentTextAnnotationsFilePathObject),
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentTextAnnotationsFileCitationObject {
pub index: u32,
pub text: Option<String>,
pub file_citation: Option<FileCitation>,
pub start_index: Option<u32>,
pub end_index: Option<u32>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentTextAnnotationsFilePathObject {
pub index: u32,
pub text: Option<String>,
pub file_path: Option<FilePath>,
pub start_index: Option<u32>,
pub end_index: Option<u32>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentImageFileObject {
pub index: u32,
pub image_file: Option<ImageFile>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
pub struct MessageDeltaContentImageUrlObject {
pub index: u32,
pub image_url: Option<ImageUrl>,
}