use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Entity {
pub mention: String,
pub score: f32,
pub span: (usize, usize),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Relation {
pub src: String,
pub dst: String,
pub weight: f32,
pub source: ExtractionSource,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ExtractionSource {
Authored,
Statistical,
LlmModel(String),
}
pub trait Extractor: Send + Sync {
fn extract_entities(&self, text: &str, chunk_embed: &[f32]) -> Vec<Entity>;
fn extract_relations(&self, _text: &str, _entities: &[Entity]) -> Vec<Relation> {
Vec::new()
}
#[cfg(feature = "typed-relations")]
fn infer_typed_relations(
&self,
_text: &str,
_entities: &[Entity],
_budget: &crate::inference::InferenceBudget,
) -> Vec<crate::inference::TypedRelation> {
Vec::new()
}
}