aprender-serve 0.64.0

Pure Rust ML inference engine built from scratch - model serving for GGUF and safetensors

/// IMP-179d: Real-world max context handling
#[test]
#[ignore = "Requires running llama.cpp server on port 8082"]
fn test_imp_179d_realworld_max_context() {
    let client = ModelHttpClient::with_timeout(60);

    // Try very long prompt to exceed context
    let long_prompt = "Hello world. ".repeat(5000); // ~10K+ tokens

    let request = CompletionRequest {
        model: "default".to_string(),
        prompt: long_prompt,
        max_tokens: 10,
        temperature: Some(0.0),
        stream: false,
    };

    let result = client.llamacpp_completion("http://127.0.0.1:8082", &request);

    // Any response means no panic
    let handling = match result {
        Ok(_) => MaxContextResult::exceeded_graceful(50000, 0, "Processed (truncated?)"),
        Err(e) => {
            if e.to_string().contains("context") || e.to_string().contains("length") {
                MaxContextResult::exceeded_graceful(50000, 0, "Rejected with context error")
            } else {
                MaxContextResult::exceeded_graceful(50000, 0, "Rejected with other error")
            }
        },
    };

    println!("\nIMP-179d: Real-World Max Context:");
    println!("  Handling: {}", handling.handling);
    println!("  Panicked: {}", handling.panicked);
    println!(
        "  QA-026: {}",
        if handling.meets_qa026 { "PASS" } else { "FAIL" }
    );
}

// ================================================================================
// IMP-180: Special Tokens Handling (QA-027)
// Verify correct handling of BOS, EOS, PAD tokens
// ================================================================================

/// Special token types for LLM inference
#[derive(Debug, Clone, PartialEq)]
pub enum SpecialToken {
    /// Beginning of sequence token
    Bos,
    /// End of sequence token
    Eos,
    /// Padding token
    Pad,
    /// Unknown token
    Unk,
    /// Custom special token with ID
    Custom(u32),
}

/// Result of special token handling verification
#[derive(Debug)]
pub struct SpecialTokenResult {
    pub token_type: SpecialToken,
    pub token_id: u32,
    pub correctly_handled: bool,
    pub in_output: bool,
    pub meets_qa027: bool,
}

impl SpecialTokenResult {
    pub fn handled(token_type: SpecialToken, token_id: u32, in_output: bool) -> Self {
        Self {
            token_type,
            token_id,
            correctly_handled: true,
            in_output,
            meets_qa027: true,
        }
    }

    pub fn mishandled(token_type: SpecialToken, token_id: u32, reason: &str) -> Self {
        let _ = reason; // Used in error reporting
        Self {
            token_type,
            token_id,
            correctly_handled: false,
            in_output: true,
            meets_qa027: false,
        }
    }
}

/// Tokenizer configuration for special token handling
pub struct SpecialTokenConfig {
    pub bos_id: Option<u32>,
    pub eos_id: Option<u32>,
    pub pad_id: Option<u32>,
    pub unk_id: Option<u32>,
    pub add_bos_on_encode: bool,
    pub add_eos_on_encode: bool,
}

impl Default for SpecialTokenConfig {
    fn default() -> Self {
        Self {
            bos_id: Some(1),
            eos_id: Some(2),
            pad_id: Some(0),
            unk_id: Some(3),
            add_bos_on_encode: true,
            add_eos_on_encode: false,
        }
    }
}

impl SpecialTokenConfig {
    pub fn llama_style() -> Self {
        Self {
            bos_id: Some(1),
            eos_id: Some(2),
            pad_id: Some(0),
            unk_id: Some(0),
            add_bos_on_encode: true,
            add_eos_on_encode: false,
        }
    }

    pub fn gpt_style() -> Self {
        Self {
            bos_id: None,
            eos_id: Some(50256),
            pad_id: Some(50256),
            unk_id: None,
            add_bos_on_encode: false,
            add_eos_on_encode: false,
        }
    }

    pub fn verify_bos_handling(&self, token_ids: &[u32]) -> SpecialTokenResult {
        if let Some(bos) = self.bos_id {
            let has_bos = token_ids.first() == Some(&bos);
            if self.add_bos_on_encode && has_bos {
                SpecialTokenResult::handled(SpecialToken::Bos, bos, true)
            } else if !self.add_bos_on_encode && !has_bos {
                SpecialTokenResult::handled(SpecialToken::Bos, bos, false)
            } else {
                SpecialTokenResult::mishandled(SpecialToken::Bos, bos, "BOS mismatch")
            }
        } else {
            SpecialTokenResult::handled(SpecialToken::Bos, 0, false)
        }
    }

    pub fn verify_eos_handling(&self, token_ids: &[u32]) -> SpecialTokenResult {
        if let Some(eos) = self.eos_id {
            let has_eos = token_ids.contains(&eos);
            SpecialTokenResult::handled(SpecialToken::Eos, eos, has_eos)
        } else {
            SpecialTokenResult::handled(SpecialToken::Eos, 0, false)
        }
    }
}

/// IMP-180a: Test special token result structure
#[test]
fn test_imp_180a_special_token_result() {
    let bos_handled = SpecialTokenResult::handled(SpecialToken::Bos, 1, true);
    assert!(
        bos_handled.correctly_handled,
        "IMP-180a: Handled token should be marked correct"
    );
    assert!(
        bos_handled.meets_qa027,
        "IMP-180a: Handled token should meet QA-027"
    );

    let eos_mishandled = SpecialTokenResult::mishandled(SpecialToken::Eos, 2, "Missing EOS");
    assert!(
        !eos_mishandled.correctly_handled,
        "IMP-180a: Mishandled should be marked incorrect"
    );
    assert!(
        !eos_mishandled.meets_qa027,
        "IMP-180a: Mishandled should not meet QA-027"
    );

    println!("\nIMP-180a: Special Token Result:");
    println!(
        "  BOS handled: {:?} -> meets_qa027={}",
        bos_handled.token_type, bos_handled.meets_qa027
    );
    println!(
        "  EOS mishandled: {:?} -> meets_qa027={}",
        eos_mishandled.token_type, eos_mishandled.meets_qa027
    );
}

/// IMP-180b: Test special token configurations
#[test]
fn test_imp_180b_special_token_configs() {
    let llama = SpecialTokenConfig::llama_style();
    assert_eq!(llama.bos_id, Some(1), "IMP-180b: Llama BOS should be 1");
    assert_eq!(llama.eos_id, Some(2), "IMP-180b: Llama EOS should be 2");
    assert!(llama.add_bos_on_encode, "IMP-180b: Llama should add BOS");

    let gpt = SpecialTokenConfig::gpt_style();
    assert_eq!(gpt.bos_id, None, "IMP-180b: GPT has no BOS");
    assert_eq!(gpt.eos_id, Some(50256), "IMP-180b: GPT EOS should be 50256");
    assert!(!gpt.add_bos_on_encode, "IMP-180b: GPT should not add BOS");

    println!("\nIMP-180b: Token Configurations:");
    println!(
        "  Llama: BOS={:?}, EOS={:?}, add_bos={}",
        llama.bos_id, llama.eos_id, llama.add_bos_on_encode
    );
    println!(
        "  GPT: BOS={:?}, EOS={:?}, add_bos={}",
        gpt.bos_id, gpt.eos_id, gpt.add_bos_on_encode
    );
}

/// IMP-180c: Test BOS/EOS verification
#[test]
fn test_imp_180c_token_verification() {
    let config = SpecialTokenConfig::llama_style();

    // Correct: starts with BOS
    let with_bos = vec![1, 100, 200, 300];
    let bos_result = config.verify_bos_handling(&with_bos);
    assert!(
        bos_result.correctly_handled,
        "IMP-180c: Should detect BOS correctly"
    );
    assert!(
        bos_result.meets_qa027,
        "IMP-180c: BOS handling should meet QA-027"
    );

    // Contains EOS
    let with_eos = vec![1, 100, 2];
    let eos_result = config.verify_eos_handling(&with_eos);
    assert!(
        eos_result.in_output,
        "IMP-180c: Should detect EOS in output"
    );

    // No EOS
    let no_eos = vec![1, 100, 200];
    let no_eos_result = config.verify_eos_handling(&no_eos);
    assert!(
        !no_eos_result.in_output,
        "IMP-180c: Should detect missing EOS"
    );

    println!("\nIMP-180c: Token Verification:");
    println!(
        "  BOS check [1,100,200,300]: handled={}",
        bos_result.correctly_handled
    );
    println!("  EOS check [1,100,2]: in_output={}", eos_result.in_output);
    println!(
        "  EOS check [1,100,200]: in_output={}",
        no_eos_result.in_output
    );
}

/// IMP-180d: Real-world special token handling
#[test]
#[ignore = "Requires running llama.cpp server on port 8082"]
fn test_imp_180d_realworld_special_tokens() {
    let client = ModelHttpClient::with_timeout(30);

    // Test prompt that should trigger EOS
    let request = CompletionRequest {
        model: "default".to_string(),
        prompt: "Say only 'done': ".to_string(),
        max_tokens: 5,
        temperature: Some(0.0),
        stream: false,
    };

    let result = client.llamacpp_completion("http://127.0.0.1:8082", &request);

    let qa027_pass = result.is_ok(); // If we get a response, special tokens handled

    println!("\nIMP-180d: Real-World Special Tokens:");
    println!("  Response received: {}", result.is_ok());
    println!("  QA-027: {}", if qa027_pass { "PASS" } else { "FAIL" });
}

// ================================================================================
// IMP-181: Thread-Safe Model Sharing (QA-028)
// Verify models can be safely shared across inference threads