use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormatDto {
Yaml,
Markdown,
Json,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FeatureConfigDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dependent_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prerequisite_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub related_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub searchable_text_feature: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_feature: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssembleContextRequest {
pub concept_sort_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub feature_config: Option<FeatureConfigDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_dependents: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_hierarchy: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_prerequisites: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_related: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_sources: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_concepts: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_similarity: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_format: Option<OutputFormatDto>,
pub query: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssembledConceptDto {
#[serde(default)]
pub features: BTreeMap<String, String>,
pub name: String,
pub relevance: f64,
pub sort_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssembledRelationDto {
pub confidence: f64,
pub relation: String,
pub source: String,
pub target: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CitationMarkerDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub document: Option<String>,
pub excerpt: String,
pub index: u64,
pub label: String,
pub relevance: f64,
pub source_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub term_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AssemblyTokenCountsDto {
pub concepts: u64,
pub hierarchy: u64,
pub relations: u64,
pub remaining: u64,
pub sources: u64,
pub total: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RetrievalStatsDto {
pub assembly_ms: u64,
pub concepts_found: u64,
pub feature_relations_found: u64,
pub graph_traversal_ms: u64,
pub relation_scan_ms: u64,
pub relation_terms_found: u64,
pub search_ms: u64,
pub terms_searched: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SourceExcerptDto {
pub concept: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub document: Option<String>,
pub text: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AssembleContextResponse {
#[serde(default)]
pub citations: Vec<CitationMarkerDto>,
#[serde(default)]
pub concepts: Vec<AssembledConceptDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hierarchy_summary: Option<String>,
#[serde(default)]
pub relations: Vec<AssembledRelationDto>,
#[serde(default)]
pub rendered: String,
#[serde(default)]
pub source_excerpts: Vec<SourceExcerptDto>,
#[serde(default)]
pub stats: RetrievalStatsDto,
#[serde(default)]
pub token_counts: AssemblyTokenCountsDto,
}