crate::ix!();
#[derive(Default,Builder,Getters,Clone,Debug,Serialize,Deserialize)]
#[builder(setter(into))]
#[getset(get="pub")]
pub struct BatchMessage {
role: MessageRole,
content: BatchMessageContent,
#[builder(default)]
refusal: Option<String>,
}
impl From<ChatCompletionResponseMessage> for BatchMessage {
fn from(msg: ChatCompletionResponseMessage) -> Self {
let mapped_role = match msg.role {
Role::System => MessageRole::System,
Role::Assistant => MessageRole::Assistant,
Role::User => MessageRole::User,
Role::Tool => MessageRole::Tool,
Role::Function => MessageRole::Function,
};
let built_content = BatchMessageContentBuilder::default()
.content(msg.content.unwrap_or_default())
.build()
.unwrap();
BatchMessageBuilder::default()
.role(mapped_role)
.content(built_content)
.refusal(None) .build()
.unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[traced_test]
fn test_batch_message_deserialization() {
info!("Starting test: test_batch_message_deserialization");
let json = r#"{
"role": "assistant",
"content": "Hello, world!",
"refusal": null
}"#;
let message: BatchMessage = serde_json::from_str(json).unwrap();
pretty_assert_eq!(message.role(), &MessageRole::Assistant);
pretty_assert_eq!(message.content(), "Hello, world!");
pretty_assert_eq!(*message.refusal(), None);
let json = r#"{
"role": "assistant",
"content": "I'm sorry, but I cannot assist with that request.",
"refusal": "Policy refusal"
}"#;
let message: BatchMessage = serde_json::from_str(json).unwrap();
pretty_assert_eq!(*message.refusal(), Some("Policy refusal".to_string()));
let json = r#"{
"role": "unknown_role",
"content": "Content with unknown role",
"refusal": null
}"#;
let message: BatchMessage = serde_json::from_str(json).unwrap();
pretty_assert_eq!(
message.role(),
&MessageRole::Unknown("unknown_role".to_string())
);
let json = r#"{
"role": "assistant",
"content": "Content without refusal"
}"#;
let message: BatchMessage = serde_json::from_str(json).unwrap();
pretty_assert_eq!(*message.refusal(), None);
let json = r#"{
"role": "assistant",
"content": "",
"refusal": null
}"#;
let message: BatchMessage = serde_json::from_str(json).unwrap();
pretty_assert_eq!(message.content(), "");
let json = r#"{
"role": 123,
"content": "Invalid role",
"refusal": null
}"#;
let result: Result<BatchMessage, _> = serde_json::from_str(json);
assert!(result.is_err());
let json = r#"{
"role": "assistant",
"refusal": null
}"#;
let result: Result<BatchMessage, _> = serde_json::from_str(json);
assert!(result.is_err());
info!("Finished test: test_batch_message_deserialization");
}
}