pub const DEFAULT_LOCAL_LLM_SERVICE_URL: &str = "http://127.0.0.1:8090";
pub const DEFAULT_LOCAL_LLM_API_BASE: &str = "http://127.0.0.1:8090/v1";
pub const DEFAULT_LOCAL_LLM_MODEL: &str = "hermes-4.3-36b";
pub const DEFAULT_LOCAL_LLM_MODEL_ROUTED: &str = "local/hermes-4.3-36b";
pub const LLM_SERVICE_URL_ENV: &str = "LLM_SERVICE_URL";
pub const LLM_MODEL_ENV: &str = "LLM_MODEL";
pub fn service_url_to_api_base(url: &str) -> String {
let u = url.trim().trim_end_matches('/');
if u.ends_with("/v1") {
u.to_string()
} else {
format!("{u}/v1")
}
}
pub fn api_base_to_service_url(base: &str) -> String {
let u = base.trim().trim_end_matches('/');
u.strip_suffix("/v1").unwrap_or(u).to_string()
}
pub fn is_default_local_model(model: &str) -> bool {
model == DEFAULT_LOCAL_LLM_MODEL
|| model == DEFAULT_LOCAL_LLM_MODEL_ROUTED
|| model == format!("local/{DEFAULT_LOCAL_LLM_MODEL}")
|| model.strip_prefix("local/") == Some(DEFAULT_LOCAL_LLM_MODEL)
}
pub fn is_legacy_cloud_default_model(model: &str) -> bool {
matches!(
model,
"deepseek/deepseek-chat" | "openai/gpt-4o" | "gpt-4o"
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn service_url_and_api_base_round_trip() {
assert_eq!(
service_url_to_api_base(DEFAULT_LOCAL_LLM_SERVICE_URL),
DEFAULT_LOCAL_LLM_API_BASE
);
assert_eq!(
api_base_to_service_url(DEFAULT_LOCAL_LLM_API_BASE),
DEFAULT_LOCAL_LLM_SERVICE_URL
);
assert_eq!(
service_url_to_api_base("http://127.0.0.1:8090/v1"),
"http://127.0.0.1:8090/v1"
);
assert_eq!(
api_base_to_service_url("http://127.0.0.1:8090"),
"http://127.0.0.1:8090"
);
}
#[test]
fn default_model_helpers() {
assert!(is_default_local_model(DEFAULT_LOCAL_LLM_MODEL));
assert!(is_default_local_model(DEFAULT_LOCAL_LLM_MODEL_ROUTED));
assert!(is_legacy_cloud_default_model("deepseek/deepseek-chat"));
assert!(!is_legacy_cloud_default_model(DEFAULT_LOCAL_LLM_MODEL_ROUTED));
}
}