use std::future::Future;
use std::pin::Pin;
use crate::error::Result;
use crate::model::types::{ChatResponse, Message};
#[derive(Debug, Clone)]
pub enum GuardrailResult {
Pass,
Block(String),
Transform(String),
}
pub trait InputGuardrail: Send + Sync {
fn check(
&self,
input: &str,
messages: &[Message],
) -> impl Future<Output = Result<GuardrailResult>> + Send;
}
pub trait OutputGuardrail: Send + Sync {
fn check(
&self,
response: &ChatResponse,
) -> impl Future<Output = Result<GuardrailResult>> + Send;
}
pub trait ErasedInputGuardrail: Send + Sync {
fn check_erased<'a>(
&'a self,
input: &'a str,
messages: &'a [Message],
) -> Pin<Box<dyn Future<Output = Result<GuardrailResult>> + Send + 'a>>;
}
impl<T: InputGuardrail> ErasedInputGuardrail for T {
fn check_erased<'a>(
&'a self,
input: &'a str,
messages: &'a [Message],
) -> Pin<Box<dyn Future<Output = Result<GuardrailResult>> + Send + 'a>> {
Box::pin(self.check(input, messages))
}
}
pub trait ErasedOutputGuardrail: Send + Sync {
fn check_erased<'a>(
&'a self,
response: &'a ChatResponse,
) -> Pin<Box<dyn Future<Output = Result<GuardrailResult>> + Send + 'a>>;
}
impl<T: OutputGuardrail> ErasedOutputGuardrail for T {
fn check_erased<'a>(
&'a self,
response: &'a ChatResponse,
) -> Pin<Box<dyn Future<Output = Result<GuardrailResult>> + Send + 'a>> {
Box::pin(self.check(response))
}
}