pub(crate) const DEFAULT_OLLAMA_BASE: &str = "http://localhost:11434";
pub(crate) const DEFAULT_OLLAMA_MODEL: &str = "qwen3-vl:8b-thinking";
pub(crate) const DEFAULT_ANTHROPIC_BASE: &str = "https://api.anthropic.com";
pub(crate) const DEFAULT_ANTHROPIC_MODEL: &str = "claude-haiku-4-5";
pub(crate) const DEFAULT_OPENAI_BASE: &str = "https://api.openai.com";
pub(crate) const DEFAULT_OPENAI_MODEL: &str = "gpt-4o-mini";
pub(crate) const DEFAULT_LLAMACPP_BASE: &str = "http://localhost:8000";
pub(crate) const DEFAULT_LLAMACPP_MODEL: &str = "qwen3.6-35b-a3b";
pub(crate) const ENV_VLM_ENDPOINT: &str = "CAPTCHAFORGE_VLM_ENDPOINT";
pub(crate) const ENV_VLM_MODEL: &str = "CAPTCHAFORGE_VLM_MODEL";
pub(crate) const ENV_ANTHROPIC_KEY: &str = "ANTHROPIC_API_KEY";
pub(crate) const ENV_OPENAI_KEY: &str = "OPENAI_API_KEY";
pub(crate) const ENV_LLAMACPP_ENDPOINT: &str = "LLAMACPP_VLM_ENDPOINT";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VlmProvider {
Ollama,
Anthropic,
OpenAI,
LlamaCpp,
}
impl VlmProvider {
pub(crate) fn default_endpoint(self) -> &'static str {
match self {
Self::Ollama => DEFAULT_OLLAMA_BASE,
Self::Anthropic => DEFAULT_ANTHROPIC_BASE,
Self::OpenAI => DEFAULT_OPENAI_BASE,
Self::LlamaCpp => DEFAULT_LLAMACPP_BASE,
}
}
pub(crate) fn default_model(self) -> &'static str {
match self {
Self::Ollama => DEFAULT_OLLAMA_MODEL,
Self::Anthropic => DEFAULT_ANTHROPIC_MODEL,
Self::OpenAI => DEFAULT_OPENAI_MODEL,
Self::LlamaCpp => DEFAULT_LLAMACPP_MODEL,
}
}
}