use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ModerationInput {
Text(String),
Texts(Vec<String>),
}
impl From<&str> for ModerationInput {
fn from(text: &str) -> Self {
Self::Text(text.to_string())
}
}
impl From<String> for ModerationInput {
fn from(text: String) -> Self {
Self::Text(text)
}
}
impl From<Vec<String>> for ModerationInput {
fn from(texts: Vec<String>) -> Self {
Self::Texts(texts)
}
}
#[derive(Debug, Clone, Serialize)]
pub struct ModerationRequest {
pub input: ModerationInput,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
}
impl ModerationRequest {
pub fn new(input: impl Into<ModerationInput>) -> Self {
Self {
input: input.into(),
model: None,
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.model = Some(model.into());
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ModerationResult {
pub flagged: bool,
#[serde(default)]
pub categories: HashMap<String, Option<bool>>,
#[serde(default)]
pub category_scores: HashMap<String, Option<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ModerationResponse {
pub id: String,
pub model: String,
pub results: Vec<ModerationResult>,
}