use crate::message::Message;
use serde_json::Value;
#[derive(Debug, Clone)]
pub enum BackendError {
Transport(String),
Http { code: u16, body: String },
Parse(String),
Retry(String),
Provider(String),
}
impl std::fmt::Display for BackendError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Transport(e) => write!(f, "transport: {}", e),
Self::Http { code, body } => write!(f, "http {}: {}", code, body),
Self::Parse(e) => write!(f, "parse: {}", e),
Self::Retry(e) => write!(f, "retry: {}", e),
Self::Provider(e) => write!(f, "provider: {}", e),
}
}
}
impl std::error::Error for BackendError {}
pub trait LlmBackend: Send + Sync {
fn model(&self) -> &str;
fn chat(
&self,
messages: &[Message],
tools: &Value,
on_token: Option<&mut dyn FnMut(&str)>,
) -> Result<Message, BackendError>;
}