ironclaw 0.22.0

Secure personal AI assistant that protects your data and expands its capabilities on the fly
Documentation
//! Image generation model detection utilities.

/// Known image generation model families.
const IMAGE_GEN_PATTERNS: &[&str] = &[
    "flux",
    "dall-e",
    "dalle",
    "stable-diffusion",
    "sdxl",
    "imagen",
    "midjourney",
    "ideogram",
    "playground",
];

/// Check if a model name indicates an image generation model.
pub fn is_image_generation_model(model: &str) -> bool {
    let lower = model.to_lowercase();
    IMAGE_GEN_PATTERNS.iter().any(|p| lower.contains(p))
}

/// Suggest the best image generation model from a list of available models.
///
/// Priority: FLUX > DALL-E > Stable Diffusion > others.
pub fn suggest_image_model(models: &[String]) -> Option<&str> {
    let priorities: &[&str] = &[
        "flux",
        "dall-e",
        "dalle",
        "stable-diffusion",
        "sdxl",
        "imagen",
    ];
    for priority in priorities {
        if let Some(model) = models.iter().find(|m| m.to_lowercase().contains(priority)) {
            return Some(model);
        }
    }
    // Fall back to any image gen model
    models.iter().find_map(|m| {
        if is_image_generation_model(m) {
            Some(m.as_str())
        } else {
            None
        }
    })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn detects_flux_models() {
        assert!(is_image_generation_model(
            "black-forest-labs/FLUX.1-schnell"
        ));
        assert!(is_image_generation_model("flux-pro"));
    }

    #[test]
    fn detects_dalle_models() {
        assert!(is_image_generation_model("dall-e-3"));
        assert!(is_image_generation_model("dalle-3"));
    }

    #[test]
    fn rejects_non_image_models() {
        assert!(!is_image_generation_model("gpt-4o"));
        assert!(!is_image_generation_model("claude-3-sonnet"));
        assert!(!is_image_generation_model("llama-3.1-70b"));
    }

    #[test]
    fn suggests_flux_first() {
        let models = vec![
            "gpt-4o".to_string(),
            "dall-e-3".to_string(),
            "flux-pro".to_string(),
        ];
        assert_eq!(suggest_image_model(&models), Some("flux-pro"));
    }

    #[test]
    fn suggests_dalle_without_flux() {
        let models = vec!["gpt-4o".to_string(), "dall-e-3".to_string()];
        assert_eq!(suggest_image_model(&models), Some("dall-e-3"));
    }

    #[test]
    fn returns_none_when_no_image_models() {
        let models = vec!["gpt-4o".to_string(), "claude-3-sonnet".to_string()];
        assert_eq!(suggest_image_model(&models), None);
    }
}