fix(config): align ollama cloud defaults with upstream

This commit is contained in:
2025-10-23 19:25:58 +02:00
parent 38a4c55eaa
commit 3e8788dd44
12 changed files with 219 additions and 59 deletions

View File

@@ -23,15 +23,15 @@ pub const OLLAMA_MODE_KEY: &str = "ollama_mode";
/// Extra config key storing the preferred Ollama Cloud endpoint.
pub const OLLAMA_CLOUD_ENDPOINT_KEY: &str = "cloud_endpoint";
/// Canonical Ollama Cloud base URL.
pub const OLLAMA_CLOUD_BASE_URL: &str = "https://api.ollama.com";
pub const OLLAMA_CLOUD_BASE_URL: &str = "https://ollama.com";
/// Legacy Ollama Cloud base URL (accepted for backward compatibility).
pub const LEGACY_OLLAMA_CLOUD_BASE_URL: &str = "https://ollama.com";
pub const LEGACY_OLLAMA_CLOUD_BASE_URL: &str = "https://api.ollama.com";
/// Preferred environment variable used for Ollama Cloud authentication.
pub const OWLEN_OLLAMA_CLOUD_API_KEY_ENV: &str = "OWLEN_OLLAMA_CLOUD_API_KEY";
pub const OLLAMA_API_KEY_ENV: &str = "OLLAMA_API_KEY";
/// Legacy environment variable accepted for backward compatibility.
pub const LEGACY_OLLEN_OLLAMA_CLOUD_API_KEY_ENV: &str = "OLLEN_OLLAMA_CLOUD_API_KEY";
/// Legacy environment variable still accepted for Ollama Cloud authentication.
pub const OLLAMA_CLOUD_API_KEY_ENV: &str = "OLLAMA_CLOUD_API_KEY";
pub const LEGACY_OLLAMA_CLOUD_API_KEY_ENV: &str = "OLLAMA_CLOUD_API_KEY";
/// Legacy environment variable used by earlier Owlen releases.
pub const LEGACY_OWLEN_OLLAMA_CLOUD_API_KEY_ENV: &str = "OWLEN_OLLAMA_CLOUD_API_KEY";
/// Default base URL for local Ollama daemons.
pub const OLLAMA_LOCAL_BASE_URL: &str = "http://localhost:11434";
/// Default OpenAI API base URL.
@@ -645,6 +645,49 @@ impl Config {
}
self.providers = migrated;
// If the legacy local provider was configured with the hosted base URL, promote the
// settings to the cloud provider for backward compatibility.
let enable_cloud_from_local = self
.providers
.get("ollama_local")
.and_then(|cfg| cfg.base_url.as_ref())
.map(|base| is_cloud_base_url(Some(base)))
.unwrap_or(false);
if enable_cloud_from_local {
let mut local_api_key = None;
let mut local_api_key_env = None;
if let Some(local) = self.providers.get_mut("ollama_local") {
local_api_key = local.api_key.take();
local_api_key_env = local.api_key_env.take();
local.enabled = false;
}
if let Some(cloud) = self.providers.get_mut("ollama_cloud") {
if cloud.api_key.is_none() {
cloud.api_key = local_api_key;
}
if cloud.api_key_env.is_none() {
cloud.api_key_env = local_api_key_env;
}
if cloud.base_url.is_none() {
cloud.base_url = Some(OLLAMA_CLOUD_BASE_URL.to_string());
}
let update_api_key_env = match cloud.api_key_env.as_deref() {
None => true,
Some(value) => {
value.eq_ignore_ascii_case(LEGACY_OLLAMA_CLOUD_API_KEY_ENV)
|| value.eq_ignore_ascii_case(LEGACY_OWLEN_OLLAMA_CLOUD_API_KEY_ENV)
}
};
if update_api_key_env {
cloud.api_key_env = Some(OLLAMA_API_KEY_ENV.to_string());
}
cloud.enabled = true;
}
}
}
fn merge_legacy_ollama_provider(
@@ -687,13 +730,15 @@ impl Config {
if cloud.base_url.is_none() {
cloud.base_url = Some(OLLAMA_CLOUD_BASE_URL.to_string());
}
if cloud.api_key_env.is_none()
|| cloud
.api_key_env
.as_deref()
.is_some_and(|value| value == LEGACY_OLLEN_OLLAMA_CLOUD_API_KEY_ENV)
{
cloud.api_key_env = Some(OWLEN_OLLAMA_CLOUD_API_KEY_ENV.to_string());
let update_api_key_env = match cloud.api_key_env.as_deref() {
None => true,
Some(value) => {
value.eq_ignore_ascii_case(LEGACY_OLLAMA_CLOUD_API_KEY_ENV)
|| value.eq_ignore_ascii_case(LEGACY_OWLEN_OLLAMA_CLOUD_API_KEY_ENV)
}
};
if update_api_key_env {
cloud.api_key_env = Some(OLLAMA_API_KEY_ENV.to_string());
}
}
}
@@ -841,7 +886,7 @@ fn default_ollama_cloud_config() -> ProviderConfig {
provider_type: canonical_provider_type("ollama_cloud"),
base_url: Some(OLLAMA_CLOUD_BASE_URL.to_string()),
api_key: None,
api_key_env: Some(OWLEN_OLLAMA_CLOUD_API_KEY_ENV.to_string()),
api_key_env: Some(OLLAMA_API_KEY_ENV.to_string()),
extra,
}
}
@@ -2013,7 +2058,7 @@ mod tests {
.get("ollama_cloud")
.expect("default cloud provider");
assert!(!cloud.enabled);
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_CLOUD_API_KEY_ENV));
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_API_KEY_ENV));
}
#[test]
@@ -2023,7 +2068,7 @@ mod tests {
let cloud = ensure_provider_config(&mut config, "ollama-cloud");
assert_eq!(cloud.provider_type, "ollama_cloud");
assert_eq!(cloud.base_url.as_deref(), Some(OLLAMA_CLOUD_BASE_URL));
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_CLOUD_API_KEY_ENV));
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_API_KEY_ENV));
assert!(config.providers.contains_key("ollama_cloud"));
assert!(!config.providers.contains_key("ollama-cloud"));
}
@@ -2072,7 +2117,7 @@ mod tests {
.expect("cloud provider created");
assert!(cloud.enabled);
assert_eq!(cloud.base_url.as_deref(), Some(OLLAMA_CLOUD_BASE_URL));
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_CLOUD_API_KEY_ENV));
assert_eq!(cloud.api_key_env.as_deref(), Some(OLLAMA_API_KEY_ENV));
}
#[test]