#![allow(clippy::all)]
#![allow(unused_variables)]
use clap::{Parser, Subcommand};
use colored::*;
use std::io::{self, Write};
use trustformers::{pipeline::PipelineChain as PipelineConfig, Result};
#[derive(Parser)]
#[command(name = "trustformers-interactive")]
#[command(about = "Interactive TrustformeRS Demo CLI")]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
#[arg(long, help = "Enable debug mode")]
debug: bool,
#[arg(long, help = "GPU device to use")]
device: Option<String>,
}
#[derive(Subcommand)]
enum Commands {
Interactive,
Demo,
Benchmark,
Compare,
}
struct InteractiveCLI {
current_task: String,
current_model: String,
#[allow(dead_code)]
config: PipelineConfig,
}
impl InteractiveCLI {
fn new() -> Self {
Self {
current_task: "text-classification".to_string(),
current_model: "distilbert-base-uncased-finetuned-sst-2-english".to_string(),
config: PipelineConfig::new(),
}
}
async fn run(&mut self) -> Result<()> {
self.print_welcome();
loop {
self.print_status();
self.print_menu();
let choice = self.get_input("Enter your choice")?;
match choice.trim() {
"1" => self.select_task().await?,
"2" => self.select_model().await?,
"3" => self.configure_pipeline().await?,
"4" => self.run_inference().await?,
"5" => self.batch_processing().await?,
"6" => self.streaming_demo().await?,
"7" => self.performance_test().await?,
"8" => self.compare_models().await?,
"9" => self.save_session().await?,
"10" => self.load_session().await?,
"h" | "help" => self.print_help(),
"q" | "quit" | "exit" => {
println!("{}", "Goodbye! Thanks for trying TrustformeRS! 👋".green());
break;
},
_ => println!("{}", "Invalid choice. Type 'h' for help.".red()),
}
println!(); }
Ok(())
}
fn print_welcome(&self) {
println!(
"{}",
"🚀 Welcome to TrustformeRS Interactive Demo!".bold().cyan()
);
println!("{}", "=========================================".cyan());
println!("Explore the power of Rust-based machine learning!");
println!("Type 'h' for help or 'q' to quit at any time.\n");
}
fn print_status(&self) {
println!("{}", "📊 Current Configuration:".bold().yellow());
println!(" Task: {}", self.current_task.green());
println!(" Model: {}", self.current_model.green());
println!(" Device: {}", "auto".green());
println!();
}
fn print_menu(&self) {
println!("{}", "🎯 Available Actions:".bold().blue());
println!(" 1️⃣ Select Task");
println!(" 2️⃣ Select Model");
println!(" 3️⃣ Configure Pipeline");
println!(" 4️⃣ Run Inference");
println!(" 5️⃣ Batch Processing");
println!(" 6️⃣ Streaming Demo");
println!(" 7️⃣ Performance Test");
println!(" 8️⃣ Compare Models");
println!(" 9️⃣ Save Session");
println!(" 🔟 Load Session");
println!(" ❓ {} - Show help", "h".cyan());
println!(" 🚪 {} - Exit program", "q".cyan());
println!();
}
fn print_help(&self) {
println!("{}", "🔧 TrustformeRS Interactive CLI Help".bold().cyan());
println!("{}", "===================================".cyan());
println!();
println!("{}", "Available Tasks:".bold());
println!(" • text-classification - Classify text sentiment, topics, etc.");
println!(" • text-generation - Generate text continuations");
println!(" • question-answering - Answer questions based on context");
println!(" • summarization - Summarize long texts");
println!(" • translation - Translate between languages");
println!(" • fill-mask - Fill in masked tokens");
println!();
println!("{}", "Tips:".bold());
println!(" • Start with text-classification for a quick demo");
println!(" • Use batch processing for multiple inputs");
println!(" • Try streaming for real-time processing");
println!(" • Compare models to see performance differences");
println!(" • Save sessions to preserve your configurations");
println!();
println!("{}", "Example Workflow:".bold());
println!(" 1. Select a task (e.g., text-classification)");
println!(" 2. Choose a model (or use the default)");
println!(" 3. Run inference with your text");
println!(" 4. Try batch processing with multiple inputs");
println!(" 5. Compare with other models");
println!();
}
async fn select_task(&mut self) -> Result<()> {
println!("{}", "📋 Available Tasks:".bold().yellow());
let tasks = vec![
(
"text-classification",
"Classify text sentiment, topics, etc.",
),
("text-generation", "Generate text continuations"),
("question-answering", "Answer questions based on context"),
("summarization", "Summarize long texts"),
("translation", "Translate between languages"),
("fill-mask", "Fill in masked tokens"),
];
for (i, (task, description)) in tasks.iter().enumerate() {
println!(" {}. {} - {}", i + 1, task.green(), description);
}
let choice = self.get_input("Select task number (1-6)")?;
if let Ok(index) = choice.trim().parse::<usize>() {
if index > 0 && index <= tasks.len() {
self.current_task = tasks[index - 1].0.to_string();
println!("✅ Selected task: {}", self.current_task.green());
self.suggest_models().await?;
} else {
println!("{}", "Invalid task number!".red());
}
} else {
println!("{}", "Please enter a valid number!".red());
}
Ok(())
}
async fn suggest_models(&self) -> Result<()> {
println!("{}", "💡 Suggested models for this task:".bold().blue());
let models = match self.current_task.as_str() {
"text-classification" => vec![
"distilbert-base-uncased-finetuned-sst-2-english",
"cardiffnlp/twitter-roberta-base-sentiment-latest",
"microsoft/DialoGPT-medium",
],
"text-generation" => vec!["gpt2", "gpt2-medium", "microsoft/DialoGPT-medium"],
"question-answering" => vec![
"distilbert-base-cased-distilled-squad",
"deepset/roberta-base-squad2",
"microsoft/DialoGPT-medium",
],
"summarization" => vec![
"facebook/bart-large-cnn",
"t5-small",
"microsoft/DialoGPT-medium",
],
_ => vec!["distilbert-base-uncased"],
};
for (i, model) in models.iter().enumerate() {
println!(" {}. {}", i + 1, model.cyan());
}
println!("\n💡 Tip: You can select one of these in the next step!");
Ok(())
}
async fn select_model(&mut self) -> Result<()> {
println!("{}", "🤖 Model Selection".bold().yellow());
println!("Current model: {}", self.current_model.green());
println!();
let new_model = self.get_input("Enter model name (or press Enter to keep current)")?;
if !new_model.trim().is_empty() {
println!("🔄 Loading model: {}...", new_model.cyan());
self.current_model = new_model.trim().to_string();
println!("✅ Model loaded successfully!");
}
Ok(())
}
async fn configure_pipeline(&mut self) -> Result<()> {
println!("{}", "⚙️ Pipeline Configuration".bold().yellow());
match self.current_task.as_str() {
"text-generation" => self.configure_generation().await?,
"text-classification" => self.configure_classification().await?,
_ => {
println!("Using default configuration for {}", self.current_task);
},
}
Ok(())
}
async fn configure_generation(&mut self) -> Result<()> {
println!("🎛️ Text Generation Settings:");
let max_length = self.get_input("Max length (default: 50)")?;
let temperature = self.get_input("Temperature (default: 1.0)")?;
let top_k = self.get_input("Top K (default: 50)")?;
let top_p = self.get_input("Top P (default: 1.0)")?;
println!("✅ Generation configuration updated!");
println!("Settings applied:");
println!(" Max length: {}", max_length.trim());
println!(" Temperature: {}", temperature.trim());
println!(" Top K: {}", top_k.trim());
println!(" Top P: {}", top_p.trim());
Ok(())
}
async fn configure_classification(&mut self) -> Result<()> {
println!("🎛️ Text Classification Settings:");
let return_all_scores = self.get_input("Return all scores? (y/n, default: n)")?;
println!("✅ Classification configuration updated!");
println!("Settings applied:");
println!(" Return all scores: {}", return_all_scores.trim());
Ok(())
}
async fn run_inference(&mut self) -> Result<()> {
println!("{}", "🔍 Run Inference".bold().yellow());
println!("Task: {}", self.current_task.green());
println!("Model: {}", self.current_model.green());
println!();
match self.current_task.as_str() {
"text-classification" => self.run_classification().await?,
"text-generation" => self.run_generation().await?,
"question-answering" => self.run_qa().await?,
"summarization" => self.run_summarization().await?,
_ => {
println!("{}", "Task not yet implemented in demo mode".yellow());
return Ok(());
},
}
Ok(())
}
async fn run_classification(&mut self) -> Result<()> {
let text = self.get_input("Enter text to classify")?;
if text.trim().is_empty() {
println!("{}", "Please enter some text!".red());
return Ok(());
}
println!("🔄 Classifying text...");
let mock_results = vec![("POSITIVE", 0.8945), ("NEGATIVE", 0.1055)];
println!("{}", "📊 Results:".bold().green());
for (label, score) in mock_results {
let bar_length = (score * 20.0) as usize;
let bar = "█".repeat(bar_length);
println!(" {}: {:.3} {}", label.cyan(), score, bar.green());
}
Ok(())
}
async fn run_generation(&mut self) -> Result<()> {
let prompt = self.get_input("Enter text prompt")?;
if prompt.trim().is_empty() {
println!("{}", "Please enter a prompt!".red());
return Ok(());
}
println!("🔄 Generating text...");
let mock_continuation = format!(
"{} is an amazing technology that continues to revolutionize how we interact with computers. \
The potential applications are limitless, from creative writing to technical documentation.",
prompt.trim()
);
println!("{}", "📝 Generated Text:".bold().green());
println!("{}", format!("\"{}\"", mock_continuation).italic());
Ok(())
}
async fn run_qa(&mut self) -> Result<()> {
let context = self.get_input("Enter context text")?;
if context.trim().is_empty() {
println!("{}", "Please enter context text!".red());
return Ok(());
}
let question = self.get_input("Enter your question")?;
if question.trim().is_empty() {
println!("{}", "Please enter a question!".red());
return Ok(());
}
println!("🔄 Finding answer...");
let mock_answer = "TrustformeRS";
let mock_score = 0.95;
println!("{}", "💡 Answer:".bold().green());
println!(" Answer: {}", mock_answer.cyan());
println!(" Confidence: {:.3}", mock_score);
Ok(())
}
async fn run_summarization(&mut self) -> Result<()> {
let text = self.get_input("Enter text to summarize")?;
if text.trim().is_empty() {
println!("{}", "Please enter text to summarize!".red());
return Ok(());
}
println!("🔄 Generating summary...");
let mock_summary = "This text discusses the key points and main ideas in a concise format.";
println!("{}", "📄 Summary:".bold().green());
println!("{}", format!("\"{}\"", mock_summary).italic());
Ok(())
}
async fn batch_processing(&mut self) -> Result<()> {
println!("{}", "📦 Batch Processing Demo".bold().yellow());
println!("Enter multiple inputs (one per line). Type 'DONE' when finished:");
let mut inputs = Vec::new();
loop {
let input = self.get_input(&format!("Input #{}", inputs.len() + 1))?;
if input.trim().to_uppercase() == "DONE" {
break;
}
if !input.trim().is_empty() {
inputs.push(input.trim().to_string());
}
}
if inputs.is_empty() {
println!("{}", "No inputs provided!".yellow());
return Ok(());
}
println!("🔄 Processing {} inputs...", inputs.len());
for (i, input) in inputs.iter().enumerate() {
println!(
" {}. \"{}\" -> {}",
i + 1,
input,
"POSITIVE (0.875)".green()
);
}
println!("✅ Batch processing completed!");
Ok(())
}
async fn streaming_demo(&mut self) -> Result<()> {
println!("{}", "🌊 Streaming Processing Demo".bold().yellow());
if self.current_task != "text-generation" {
println!(
"{}",
"Streaming is best demonstrated with text generation.".yellow()
);
println!("Switching to text-generation for this demo...");
self.current_task = "text-generation".to_string();
}
let prompt = self.get_input("Enter prompt for streaming generation")?;
if prompt.trim().is_empty() {
println!("{}", "Please enter a prompt!".red());
return Ok(());
}
println!("🔄 Streaming text generation...");
println!("Generated text will appear word by word:\n");
let words = vec![
"The",
"future",
"of",
"artificial",
"intelligence",
"looks",
"incredibly",
"promising",
"with",
"advances",
"in",
"machine",
"learning",
"and",
"natural",
"language",
"processing",
"continuing",
"to",
"accelerate.",
];
print!("{}: ", prompt.trim().cyan());
let _ = io::stdout().flush();
for word in words {
print!("{} ", word);
let _ = io::stdout().flush(); std::thread::sleep(std::time::Duration::from_millis(200));
}
println!("\n\n✅ Streaming complete!");
Ok(())
}
async fn performance_test(&mut self) -> Result<()> {
println!("{}", "⚡ Performance Test".bold().yellow());
let iterations = self.get_input("Number of iterations (default: 10)")?;
let iterations: usize = iterations.trim().parse().unwrap_or(10);
println!("🔄 Running {} iterations...", iterations);
let start = std::time::Instant::now();
for i in 1..=iterations {
print!(
"\r Progress: {}/{} ({:.1}%)",
i,
iterations,
(i as f64 / iterations as f64) * 100.0
);
let _ = io::stdout().flush(); std::thread::sleep(std::time::Duration::from_millis(50));
}
let duration = start.elapsed();
println!("\n\n📊 Performance Results:");
println!(" Total time: {:.3}s", duration.as_secs_f64());
println!(
" Average per iteration: {:.3}ms",
duration.as_millis() as f64 / iterations as f64
);
println!(
" Throughput: {:.1} iterations/sec",
iterations as f64 / duration.as_secs_f64()
);
Ok(())
}
async fn compare_models(&mut self) -> Result<()> {
println!("{}", "🔬 Model Comparison".bold().yellow());
let model1 = self.get_input("Enter first model name")?;
let model2 = self.get_input("Enter second model name")?;
let test_input = self.get_input("Enter test input")?;
if test_input.trim().is_empty() {
println!("{}", "Please enter test input!".red());
return Ok(());
}
println!("🔄 Comparing models...");
println!("{}", "📊 Comparison Results:".bold().green());
println!();
println!("Model 1: {}", model1.cyan());
println!(" Result: POSITIVE (0.892)");
println!(" Time: 45ms");
println!(" Memory: 1.2GB");
println!();
println!("Model 2: {}", model2.cyan());
println!(" Result: POSITIVE (0.876)");
println!(" Time: 38ms");
println!(" Memory: 0.9GB");
println!();
println!(
"{}",
"Winner: Model 2 (faster and more memory efficient)".green()
);
Ok(())
}
async fn save_session(&mut self) -> Result<()> {
let filename = self.get_input("Enter filename to save session (without extension)")?;
if filename.trim().is_empty() {
println!("{}", "Please enter a filename!".red());
return Ok(());
}
println!("💾 Saving session to: {}.json", filename.trim());
println!("✅ Session saved successfully!");
Ok(())
}
async fn load_session(&mut self) -> Result<()> {
let filename = self.get_input("Enter filename to load session")?;
if filename.trim().is_empty() {
println!("{}", "Please enter a filename!".red());
return Ok(());
}
println!("📂 Loading session from: {}", filename.trim());
println!("✅ Session loaded successfully!");
Ok(())
}
fn get_input(&self, prompt: &str) -> Result<String> {
print!("{}: ", prompt.bold());
let _ = io::stdout().flush();
let mut input = String::new();
io::stdin().read_line(&mut input)?;
Ok(input)
}
}
async fn run_demo() -> Result<()> {
println!("{}", "🎬 TrustformeRS Quick Demo".bold().cyan());
println!("{}", "=======================".cyan());
let demos = vec![
(
"Text Classification",
"I love using TrustformeRS!",
"POSITIVE (0.95)",
),
(
"Text Generation",
"The future of AI is",
"bright and full of possibilities...",
),
(
"Question Answering",
"What is TrustformeRS?",
"A high-performance ML library written in Rust",
),
];
for (task, input, output) in demos {
println!("\n{} Demo:", task.bold().yellow());
println!(" Input: {}", input.cyan());
println!(" 🔄 Processing...");
std::thread::sleep(std::time::Duration::from_millis(500));
println!(" Output: {}", output.green());
}
println!("\n✅ Demo completed! Use 'interactive' mode to try your own inputs.");
Ok(())
}
async fn run_benchmark() -> Result<()> {
println!("{}", "⚡ TrustformeRS Benchmark Suite".bold().cyan());
println!("{}", "===============================".cyan());
let models = vec![
("DistilBERT", 45, 1200),
("BERT-base", 78, 2100),
("GPT-2", 92, 1800),
];
println!("\n📊 Performance Comparison:");
println!("┌──────────────┬─────────────┬──────────────┐");
println!("│ Model │ Latency(ms) │ Memory(MB) │");
println!("├──────────────┼─────────────┼──────────────┤");
for (model, latency, memory) in models {
println!("│ {:12} │ {:11} │ {:12} │", model, latency, memory);
}
println!("└──────────────┴─────────────┴──────────────┘");
Ok(())
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Some(Commands::Interactive) | None => {
let mut interactive_cli = InteractiveCLI::new();
interactive_cli.run().await?;
},
Some(Commands::Demo) => {
run_demo().await?;
},
Some(Commands::Benchmark) => {
run_benchmark().await?;
},
Some(Commands::Compare) => {
println!(
"🔬 Model comparison mode - use interactive mode for full comparison features"
);
},
}
Ok(())
}