use serde::{Deserialize, Serialize};
use std::{
collections::HashMap,
time::{Duration, SystemTime},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageIntent {
pub intent_type: IntentType,
pub confidence: f64,
pub reasoning: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum IntentType {
Question,
Request,
Gratitude,
Aggregation,
ListQuery,
Comparison,
Relationship,
Definition,
Complaint,
Clarification,
Complex,
Exploration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplexityMetrics {
pub linguistic_complexity: f64,
pub semantic_complexity: f64,
pub context_dependency: f64,
pub reasoning_depth: f64,
pub overall_complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConfidenceMetrics {
pub overall_confidence: f64,
pub uncertainty_factors: Vec<UncertaintyFactor>,
pub confidence_breakdown: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UncertaintyFactor {
pub factor_type: String,
pub impact: f64,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SatisfactionMetrics {
pub overall_satisfaction: f64,
pub satisfaction_breakdown: HashMap<String, f64>,
pub implicit_signals: ImplicitSatisfactionSignals,
pub explicit_feedback: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImplicitSatisfactionSignals {
pub follow_up_questions: usize,
pub positive_feedback_indicators: usize,
pub task_completion_rate: f64,
pub session_continuation: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmotionScore {
pub emotion: String,
pub intensity: f64,
pub confidence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnalyticsConfig {
pub enable_real_time_analytics: bool,
pub enable_pattern_detection: bool,
pub enable_sentiment_analysis: bool,
pub enable_intent_tracking: bool,
pub analytics_retention_days: usize,
pub pattern_detection_window: Duration,
pub anomaly_detection_threshold: f32,
pub min_pattern_frequency: usize,
pub privacy_mode: PrivacyMode,
}
impl Default for AnalyticsConfig {
fn default() -> Self {
Self {
enable_real_time_analytics: true,
enable_pattern_detection: true,
enable_sentiment_analysis: false, enable_intent_tracking: true,
analytics_retention_days: 30,
pattern_detection_window: Duration::from_secs(3600), anomaly_detection_threshold: 2.0, min_pattern_frequency: 3,
privacy_mode: PrivacyMode::Aggregated,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PrivacyMode {
Full, Aggregated, Anonymous, Disabled, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationAnalytics {
pub session_id: String,
pub start_time: SystemTime,
pub end_time: Option<SystemTime>,
pub message_count: usize,
pub user_message_count: usize,
pub assistant_message_count: usize,
pub average_response_time: Duration,
pub total_tokens: usize,
pub user_satisfaction: SatisfactionMetrics,
pub conversation_quality: ConversationQuality,
pub topics_discussed: Vec<String>,
pub sentiment_progression: Vec<EmotionScore>,
pub complexity_progression: Vec<ComplexityMetrics>,
pub confidence_progression: Vec<ConfidenceMetrics>,
pub intent_distribution: HashMap<IntentType, usize>,
pub patterns_detected: Vec<ConversationPattern>,
pub anomalies: Vec<ConversationAnomaly>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationQuality {
pub coherence_score: f64,
pub relevance_score: f64,
pub helpfulness_score: f64,
pub accuracy_score: f64,
pub clarity_score: f64,
pub completeness_score: f64,
pub engagement_score: f64,
pub error_rate: f64,
pub response_appropriateness: f64,
pub overall_quality: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationPattern {
pub pattern_type: PatternType,
pub description: String,
pub confidence: f64,
pub frequency: usize,
pub examples: Vec<String>,
pub insights: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PatternType {
RepeatedQuestion,
TopicProgression,
SentimentShift,
ComplexityEscalation,
ErrorCascade,
SuccessPattern,
EngagementPattern,
LearningPattern,
FrustrationPattern,
ExplorationPattern,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationAnomaly {
pub anomaly_type: AnomalyType,
pub description: String,
pub severity: AnomalySeverity,
pub detected_at: SystemTime,
pub message_context: Vec<String>,
pub suggested_action: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnomalyType {
UnusualResponseTime,
LowQualityResponses,
HighErrorRate,
UnexpectedSentiment,
ComplexitySpike,
EngagementDrop,
RepeatedErrors,
ContextLoss,
TopicDivergence,
ConfidenceCollapse,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnomalySeverity {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AggregatedAnalytics {
pub total_conversations: usize,
pub total_messages: usize,
pub average_conversation_length: f64,
pub average_response_time: Duration,
pub overall_satisfaction: SatisfactionStats,
pub quality_metrics: ConversationQuality,
pub popular_topics: Vec<(String, usize)>,
pub common_patterns: Vec<ConversationPattern>,
pub frequent_anomalies: Vec<(AnomalyType, usize)>,
pub temporal_trends: HashMap<String, Vec<f64>>,
pub user_engagement_stats: EngagementStats,
}
impl Default for AggregatedAnalytics {
fn default() -> Self {
Self {
total_conversations: 0,
total_messages: 0,
average_conversation_length: 0.0,
average_response_time: Duration::from_secs(0),
overall_satisfaction: SatisfactionStats::default(),
quality_metrics: ConversationQuality {
coherence_score: 0.0,
relevance_score: 0.0,
helpfulness_score: 0.0,
accuracy_score: 0.0,
clarity_score: 0.0,
completeness_score: 0.0,
engagement_score: 0.0,
error_rate: 0.0,
response_appropriateness: 0.0,
overall_quality: 0.0,
},
popular_topics: Vec::new(),
common_patterns: Vec::new(),
frequent_anomalies: Vec::new(),
temporal_trends: HashMap::new(),
user_engagement_stats: EngagementStats::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SatisfactionStats {
pub average_satisfaction: f64,
pub satisfaction_distribution: HashMap<String, f64>,
pub improvement_trends: Vec<f64>,
}
impl Default for SatisfactionStats {
fn default() -> Self {
Self {
average_satisfaction: 0.0,
satisfaction_distribution: HashMap::new(),
improvement_trends: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EngagementStats {
pub average_session_duration: Duration,
pub messages_per_session: f64,
pub return_rate: f64,
pub feature_usage: HashMap<String, usize>,
pub peak_usage_hours: Vec<usize>,
}
impl Default for EngagementStats {
fn default() -> Self {
Self {
average_session_duration: Duration::from_secs(0),
messages_per_session: 0.0,
return_rate: 0.0,
feature_usage: HashMap::new(),
peak_usage_hours: Vec::new(),
}
}
}