libmir-cuda 0.3.0

CUDA inference backend for libmir
use foundation::protocol::{ChatCompletionRequest, ChatMessage};
use models::{chat::ChatTemplate, layout::ModelLayout, tokenizer::TextTokenizer};

use super::GENERATED;
use crate::Result;

pub fn prompts(layout: &ModelLayout) -> Result<Vec<Vec<u32>>> {
    let template = ChatTemplate::from_layout(layout)?;
    let tokenizer = TextTokenizer::from_layout(layout)?;
    [
        "Hello. Briefly introduce yourself and explain what you can help with.",
        "Explain mixture-of-experts routing, load balancing, and inference trade-offs.",
        "Write a safe Rust function that parses a port number and explain its error handling.",
    ]
    .into_iter()
    .map(|content| {
        let prompt = template.render(&request(content))?;
        Ok(tokenizer
            .encode_with_special_tokens(&prompt.text, prompt.add_special_tokens)?
            .token_ids)
    })
    .collect()
}

fn request(content: &str) -> ChatCompletionRequest {
    ChatCompletionRequest {
        model: "projection-gate".into(),
        messages: vec![ChatMessage {
            role: "user".into(),
            content: content.into(),
            reasoning_content: None,
            tool_calls: None,
            tool_call_id: None,
        }],
        tools: Vec::new(),
        tool_choice: None,
        stream: false,
        max_tokens: Some(GENERATED),
        min_tokens: None,
        ignore_eos: None,
        temperature: Some(0.0),
        top_p: Some(1.0),
        top_k: Some(0),
        repetition_penalty: Some(1.0),
        seed: Some(0),
    }
}