use crate::error::Result;
use crate::providers::local_openai_common::{
LocalOpenAiIdentity, LocalOpenAiProvider, LocalOpenAiProviderBuilder, LocalOpenAiRuntimeConfig,
};
pub const DEFAULT_LLAMACPP_PORT: u16 = 8080;
pub const DEFAULT_LLAMACPP_HOST: &str = "http://127.0.0.1:8080";
pub const LLAMACPP_IDENTITY: LocalOpenAiIdentity = LocalOpenAiIdentity {
id: "llamacpp",
display_name: "llama-server",
default_host: DEFAULT_LLAMACPP_HOST,
host_envs: &[
"LLAMACPP_HOST",
"LLAMA_SERVER_HOST",
"LLAMACPP_BASE_URL",
"LLAMA_SERVER_BASE_URL",
],
key_envs: &["LLAMACPP_API_KEY", "LLAMA_SERVER_API_KEY"],
model_env: "LLAMACPP_MODEL",
embedding_model_env: "LLAMACPP_EMBEDDING_MODEL",
timeout_env: "LLAMACPP_TIMEOUT_SECONDS",
placeholder_key: "llamacpp",
default_model: "default",
default_timeout_secs: 600,
default_context: 128_000,
max_output_tokens: 4096,
};
pub type LlamaCppProvider = LocalOpenAiProvider;
pub type LlamaCppProviderBuilder = LocalOpenAiProviderBuilder;
pub type LlamaCppRuntimeConfig = LocalOpenAiRuntimeConfig;
pub fn normalize_llamacpp_host(host: &str) -> String {
crate::providers::local_openai_common::normalize_local_openai_host(host, DEFAULT_LLAMACPP_HOST)
}
pub fn resolve_llamacpp_runtime_config() -> LocalOpenAiRuntimeConfig {
LLAMACPP_IDENTITY.resolve_runtime()
}
pub fn host_from_env() -> String {
LLAMACPP_IDENTITY.host_from_env()
}
pub fn api_key_from_env() -> Option<String> {
LLAMACPP_IDENTITY.api_key_from_env()
}
impl LlamaCppProviderExt for LocalOpenAiProvider {}
pub trait LlamaCppProviderExt {
fn llamacpp_builder() -> LocalOpenAiProviderBuilder {
LocalOpenAiProvider::builder(LLAMACPP_IDENTITY)
}
fn llamacpp_from_env() -> Result<LocalOpenAiProvider> {
LocalOpenAiProvider::from_env(LLAMACPP_IDENTITY)
}
fn llamacpp_from_env_with_model(model: &str) -> Result<LocalOpenAiProvider> {
LocalOpenAiProvider::from_env_with_model(LLAMACPP_IDENTITY, model)
}
}
pub fn from_env() -> Result<LocalOpenAiProvider> {
LocalOpenAiProvider::from_env(LLAMACPP_IDENTITY)
}
pub fn from_env_with_model(model: &str) -> Result<LocalOpenAiProvider> {
LocalOpenAiProvider::from_env_with_model(LLAMACPP_IDENTITY, model)
}
pub fn builder() -> LocalOpenAiProviderBuilder {
LocalOpenAiProvider::builder(LLAMACPP_IDENTITY)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::traits::LLMProvider;
#[test]
fn defaults_and_name() {
assert!(DEFAULT_LLAMACPP_HOST.contains("8080"));
let p = builder().model("gguf-model").build().expect("build");
assert_eq!(LLMProvider::name(&p), "llamacpp");
assert_eq!(LLMProvider::model(&p), "gguf-model");
assert_eq!(p.host(), DEFAULT_LLAMACPP_HOST);
}
#[test]
fn normalize_strips_v1() {
assert_eq!(
normalize_llamacpp_host("http://127.0.0.1:8080/v1"),
"http://127.0.0.1:8080"
);
}
}