use mullama::builder::presets;
use mullama::prelude::*;
#[tokio::main]
async fn main() -> Result<(), MullamaError> {
println!("🔧 Builder Patterns Example");
println!("===========================");
demonstrate_model_builder().await?;
demonstrate_context_builder().await?;
demonstrate_sampler_builder().await?;
demonstrate_presets().await?;
demonstrate_complex_workflow().await?;
demonstrate_builder_patterns_showcase();
println!("\n✨ All builder patterns demonstrated successfully!");
Ok(())
}
async fn demonstrate_model_builder() -> Result<(), MullamaError> {
println!("\n🏗️ Model Builder");
println!("================");
println!("1️⃣ Basic model configuration:");
let _basic_model_builder = ModelBuilder::new()
.path("path/to/model.gguf")
.gpu_layers(16)
.context_size(2048);
println!(" ✅ Basic model builder configured");
println!(" - Path: path/to/model.gguf");
println!(" - GPU layers: 16");
println!(" - Context size: 2048");
println!("\n2️⃣ Advanced model configuration:");
let _advanced_model_builder = ModelBuilder::new()
.path("path/to/large_model.gguf")
.gpu_layers(32)
.context_size(4096)
.memory_mapping(true)
.memory_locking(false)
.tensor_validation(true)
.vocabulary_only(false);
println!(" ✅ Advanced model builder configured");
println!(" - GPU layers: 32");
println!(" - Context size: 4096");
println!(" - Memory mapping: enabled");
println!(" - Tensor validation: enabled");
println!("\n3️⃣ Model with performance preset:");
let _performance_model_builder = ModelBuilder::new()
.path("path/to/model.gguf")
.preset(presets::performance_optimized);
println!(" ✅ Performance optimized model builder");
println!(" - GPU layers: maximized");
println!(" - Memory mapping: enabled");
println!(" - Tensor validation: disabled for speed");
#[cfg(feature = "async")]
{
println!("\n4️⃣ Async model building (simulated):");
println!(" ✅ Model would be built asynchronously");
}
Ok(())
}
async fn demonstrate_context_builder() -> Result<(), MullamaError> {
println!("\n🧠 Context Builder");
println!("==================");
println!("1️⃣ Basic context configuration:");
println!(" ✅ Basic context builder configured");
println!(" - Context size: 2048 tokens");
println!(" - Batch size: 512");
println!(" - Threads: 8");
println!("\n2️⃣ Advanced context configuration:");
println!(" ✅ Advanced context builder configured");
println!(" - Context size: 4096 tokens");
println!(" - Batch size: 1024");
println!(" - Physical batch size: 512");
println!(" - Max sequences: 4");
println!(" - Flash attention: enabled");
println!(" - KQV offload: enabled");
println!("\n3️⃣ Performance optimized context:");
println!(" ✅ Performance optimized context");
println!(" - Flash attention: enabled");
println!(" - Larger batch sizes");
println!(" - KQV offload: enabled");
println!("\n4️⃣ Memory optimized context:");
println!(" ✅ Memory optimized context");
println!(" - Smaller context size: 1024");
println!(" - Smaller batch sizes");
println!(" - Flash attention: disabled");
Ok(())
}
async fn demonstrate_sampler_builder() -> Result<(), MullamaError> {
println!("\n🎲 Sampler Builder");
println!("==================");
println!("1️⃣ Basic sampling configuration:");
let _basic_sampler_builder = SamplerBuilder::new()
.temperature(0.7)
.top_k(40)
.nucleus(0.9);
println!(" ✅ Basic sampler configured");
println!(" - Temperature: 0.7");
println!(" - Top-k: 40");
println!(" - Nucleus (top-p): 0.9");
println!("\n2️⃣ Advanced sampling with penalties:");
let _advanced_sampler_builder = SamplerBuilder::new()
.temperature(0.8)
.top_k(50)
.nucleus(0.95)
.min_probability(0.02)
.penalties(|p| {
p.repetition(1.15)
.frequency(0.1)
.presence(0.1)
.lookback(128)
})
.seed(12345);
println!(" ✅ Advanced sampler configured");
println!(" - Temperature: 0.8");
println!(" - Top-k: 50");
println!(" - Nucleus: 0.95");
println!(" - Min probability: 0.02");
println!(" - Repetition penalty: 1.15");
println!(" - Frequency penalty: 0.1");
println!(" - Presence penalty: 0.1");
println!(" - Lookback window: 128 tokens");
println!(" - Seed: 12345");
println!("\n3️⃣ Creative sampling preset:");
let _creative_sampler_builder = SamplerBuilder::new().preset(presets::creative_sampling);
println!(" ✅ Creative sampling configured");
println!(" - High temperature for creativity");
println!(" - Larger top-k for diversity");
println!(" - Adjusted penalties");
println!("\n4️⃣ Precise sampling preset:");
let _precise_sampler_builder = SamplerBuilder::new().preset(presets::precise_sampling);
println!(" ✅ Precise sampling configured");
println!(" - Low temperature for consistency");
println!(" - Small top-k for focus");
println!(" - Minimal penalties");
Ok(())
}
async fn demonstrate_presets() -> Result<(), MullamaError> {
println!("\n🎯 Preset Configurations");
println!("========================");
println!("1️⃣ Model presets:");
let _creative_model = ModelBuilder::new()
.path("creative_model.gguf")
.preset(presets::creative_model);
println!(" 🎨 Creative model: 24 GPU layers, 4096 context");
let _performance_model = ModelBuilder::new()
.path("performance_model.gguf")
.preset(presets::performance_optimized);
println!(" ⚡ Performance model: Max GPU layers, no validation");
let _memory_model = ModelBuilder::new()
.path("memory_model.gguf")
.preset(presets::memory_optimized);
println!(" 💾 Memory model: CPU only, optimized memory usage");
println!("\n2️⃣ Sampling presets:");
let _creative_sampling = SamplerBuilder::new().preset(presets::creative_sampling);
println!(" 🎨 Creative: temp=0.9, top_k=60, high diversity");
let _precise_sampling = SamplerBuilder::new().preset(presets::precise_sampling);
println!(" 🎯 Precise: temp=0.2, top_k=10, high consistency");
let _balanced_sampling = SamplerBuilder::new().preset(presets::balanced_sampling);
println!(" ⚖️ Balanced: temp=0.7, top_k=40, moderate settings");
Ok(())
}
async fn demonstrate_complex_workflow() -> Result<(), MullamaError> {
println!("\n🔄 Complex Workflow");
println!("===================");
println!("🏗️ Building complete LLM setup with builders...");
println!("\n1️⃣ Model configuration:");
let _model_builder = ModelBuilder::new()
.path("path/to/model.gguf")
.gpu_layers(32)
.context_size(4096)
.memory_mapping(true)
.preset(presets::performance_optimized);
println!(" ✅ Model builder ready");
#[cfg(feature = "async")]
{
println!("\n2️⃣ Building model asynchronously...");
println!(" ✅ Model built successfully");
println!("\n3️⃣ Creating optimized context...");
println!(" ✅ Context created with performance optimizations");
println!("\n4️⃣ Configuring advanced sampling...");
println!(" ✅ Advanced sampler configured");
println!("\n5️⃣ Complete setup ready:");
println!(" 🤖 Model: Loaded with 32 GPU layers");
println!(" 🧠 Context: 4096 tokens, performance optimized");
println!(" 🎲 Sampler: Balanced creativity and consistency");
println!(" ⚡ Ready for high-performance text generation!");
}
println!("\n🔀 Conditional Configuration Example:");
let use_gpu = std::env::var("USE_GPU").unwrap_or_else(|_| "true".to_string()) == "true";
let context_size: u32 = std::env::var("CONTEXT_SIZE")
.unwrap_or_else(|_| "2048".to_string())
.parse()
.unwrap_or(2048);
let _conditional_model = ModelBuilder::new()
.path("model.gguf")
.gpu_layers(if use_gpu { 32 } else { 0 })
.context_size(context_size)
.preset(if use_gpu {
presets::performance_optimized
} else {
presets::memory_optimized
});
println!(" ⚙️ Conditional model configured:");
println!(
" - GPU usage: {}",
if use_gpu { "enabled" } else { "disabled" }
);
println!(" - Context size: {}", context_size);
println!(
" - Preset: {}",
if use_gpu { "performance" } else { "memory" }
);
Ok(())
}
fn demonstrate_builder_patterns_showcase() {
println!("\n🎨 Builder Patterns Showcase");
println!("============================");
println!("✨ Key Benefits of Builder Patterns:");
println!(" 🔒 Type Safety: Compile-time validation of configurations");
println!(" 🌊 Fluent API: Readable, chainable method calls");
println!(" 🎯 Smart Defaults: Sensible defaults for all parameters");
println!(" 🏗️ Progressive Disclosure: Start simple, add complexity as needed");
println!(" 🎛️ Presets: Quick configuration for common use cases");
println!(" 🔧 Extensibility: Easy to add new configuration options");
println!("\n🏛️ Architecture Benefits:");
println!(" 📏 Consistent API across all components");
println!(" 🛡️ Validation at build time, not runtime");
println!(" 🎪 Flexible configuration without complexity");
println!(" 📚 Self-documenting code through method names");
println!(" 🔄 Easy to refactor and maintain");
}