use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ModerationInput {
Text(String),
Batch(Vec<String>),
Parts(Vec<ModerationContentPart>),
}
impl Default for ModerationInput {
fn default() -> Self {
Self::Text(String::new())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ModerationContentPart {
Text {
text: String,
},
ImageUrl {
image_url: ModerationImageUrl,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModerationImageUrl {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ModerationParams {
pub model: String,
pub input: ModerationInput,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(skip_serializing)]
pub include_raw: bool,
}
impl ModerationParams {
pub fn new(model: impl Into<String>, input: ModerationInput) -> Self {
Self {
model: model.into(),
input,
user: None,
include_raw: false,
}
}
#[must_use]
pub fn with_user(mut self, user: impl Into<String>) -> Self {
self.user = Some(user.into());
self
}
#[must_use]
pub fn with_include_raw(mut self, include_raw: bool) -> Self {
self.include_raw = include_raw;
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModerationResult {
pub flagged: bool,
#[serde(default)]
pub categories: HashMap<String, bool>,
#[serde(default)]
pub category_scores: HashMap<String, f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_applied_input_types: Option<HashMap<String, Vec<String>>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider_raw: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModerationResponse {
pub id: String,
pub model: String,
pub results: Vec<ModerationResult>,
}