use std::future::Future;
use std::pin::Pin;
pub type SamplingFuture<'a> =
Pin<Box<dyn Future<Output = Result<String, SamplingError>> + Send + 'a>>;
pub trait SamplingClient: Sync {
fn is_available(&self) -> bool;
fn create_message<'a>(&'a self, prompt: &'a str) -> SamplingFuture<'a>;
}
#[derive(Debug, Clone)]
pub enum SamplingError {
Unavailable,
Rejected(String),
Timeout,
Other(String),
}
impl std::fmt::Display for SamplingError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SamplingError::Unavailable => write!(f, "sampling unavailable"),
SamplingError::Rejected(why) => write!(f, "sampling rejected: {why}"),
SamplingError::Timeout => write!(f, "sampling timeout"),
SamplingError::Other(msg) => write!(f, "sampling failure: {msg}"),
}
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopSamplingClient;
impl SamplingClient for NoopSamplingClient {
fn is_available(&self) -> bool {
false
}
fn create_message<'a>(&'a self, _prompt: &'a str) -> SamplingFuture<'a> {
Box::pin(async { Err(SamplingError::Unavailable) })
}
}