use el_core::{Result, Token};
use el_safety::{ChunkGuard, SafetySteerer};
pub trait InferenceEngine {
fn prefill(&mut self, tokens: &[Token]) -> Result<u32>;
fn next_logits(&mut self, committed: &[Token]) -> Vec<i32>;
fn eos_token(&self) -> Token;
fn rollback(&mut self, keep_committed: u32) -> Result<()>;
fn reset_cache(&mut self) -> Result<()>;
fn prefill_reuse(&mut self, full_context: &[Token]) -> Result<u32> {
self.reset_cache()?;
self.prefill(full_context)
}
}
pub trait PromptCompressor {
fn compress(&self, tokens: &[Token]) -> Vec<Token>;
}
pub trait GrammarMasker {
fn mask(&self, recent: &[Token], vocab: usize) -> Vec<bool>;
}
pub trait HybridRelay {
fn consult(&self, query_tokens: &[Token]) -> Vec<Token>;
}
pub struct Ports {
pub compressor: Box<dyn PromptCompressor>,
pub grammar: Box<dyn GrammarMasker>,
pub safety: Box<dyn SafetySteerer>,
pub guard: Option<Box<dyn ChunkGuard>>,
pub ingress: Option<Box<dyn ChunkGuard>>,
pub relay: Option<Box<dyn HybridRelay>>,
}
impl Ports {
pub fn permissive() -> Self {
Self {
compressor: Box::new(super::defaults::IdentityCompressor),
grammar: Box::new(super::defaults::AllowAllMasker),
safety: Box::new(el_safety::NoSafety),
guard: None,
ingress: None,
relay: None,
}
}
}