Vapora/crates/vapora-agents/examples/02-learning-profile.rs
Jesús Pérez 1b2a1e9c49
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
chore: add examples coverage
2026-01-12 03:34:01 +00:00

114 lines
3.9 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! # Learning Profile Example
//!
//! Demonstrates how to build and update learning profiles from execution
//! history.
//!
//! ## What This Example Shows
//! - Creating a `LearningProfile` for an agent
//! - Recording execution data with timestamps
//! - Computing task type expertise from historical data
//! - Understanding recency bias weighting
//! - Confidence scoring based on sample size
//!
//! ## Run
//! ```bash
//! cargo run --example 02-learning-profile -p vapora-agents
//! ```
use chrono::{Duration, Utc};
use vapora_agents::{ExecutionData, LearningProfile, TaskTypeExpertise};
fn main() {
println!("=== Learning Profile Example ===\n");
// Step 1: Create sample execution history
let agent_id = "developer-alice".to_string();
let now = Utc::now();
// Simulate 30 days of execution history
let executions: Vec<ExecutionData> = (0..30)
.map(|i| ExecutionData {
timestamp: now - Duration::days(i),
duration_ms: 200 + (i as u64 * 5),
success: i < 28, // 93% success rate (28/30 successes)
})
.collect();
println!("Agent: {}", agent_id);
println!("Historical executions: {} days", executions.len());
println!("Success rate: {:.1}%\n", (28.0 / 30.0) * 100.0);
// Step 2: Create learning profile
let mut profile = LearningProfile::new(agent_id);
println!("Created learning profile\n");
// Step 3: Compute task type expertise
let coding_expertise = TaskTypeExpertise::from_executions(executions.clone(), "coding");
println!("=== Task Type Expertise: Coding ===");
println!(
"Success rate: {:.2}%",
coding_expertise.success_rate * 100.0
);
println!("Average duration: {}ms", coding_expertise.avg_duration_ms);
println!("Total executions: {}", coding_expertise.total_executions);
println!("Confidence: {:.2}", coding_expertise.confidence);
println!(
"Recent success rate: {:.2}%",
coding_expertise.recent_success_rate * 100.0
);
// Step 4: Demonstrate recency bias
println!("\n=== Recency Bias Impact ===");
println!("Recent 7 days: weighted 3× higher");
println!("Days 8-30: weighted 1× normal");
let recent_success = (6.0 / 7.0) * 100.0; // Last 7 days all successful
let older_success = (22.0 / 23.0) * 100.0; // Days 8-30
println!("Recent success rate (7d): {:.1}%", recent_success);
println!("Older success rate (23d): {:.1}%", older_success);
println!(
"Weighted average: {:.1}%\n",
coding_expertise.success_rate * 100.0
);
// Step 5: Add expertise to profile
profile.set_task_type_expertise("coding".to_string(), coding_expertise.clone());
// Simulate another task type with lower expertise
let test_executions: Vec<ExecutionData> = (0..20)
.map(|i| ExecutionData {
timestamp: now - Duration::days(i),
duration_ms: 150 + (i as u64 * 3),
success: i < 16, // 80% success rate (16/20)
})
.collect();
let testing_expertise = TaskTypeExpertise::from_executions(test_executions, "testing");
profile.set_task_type_expertise("testing".to_string(), testing_expertise.clone());
println!("=== Overall Profile ===");
println!("Agent expertise levels:");
println!(
" coding: {:.1}% (high)",
coding_expertise.success_rate * 100.0
);
println!(
" testing: {:.1}% (medium)",
testing_expertise.success_rate * 100.0
);
// Step 6: Demonstrate confidence scaling
println!("\n=== Confidence Scaling ===");
println!("Confidence increases with sample size:");
let sample_sizes = vec![5, 10, 20, 50, 100];
for size in sample_sizes {
let confidence = ((size as f64 - 1.0) / (size as f64 + 9.0)).min(1.0);
println!(" {} samples → confidence: {:.2}", size, confidence);
}
println!("\n✓ Learning profile created and ready for task assignment");
}