mirror of
https://github.com/openai/codex.git
synced 2026-09-17 12:23:33 +00:00
also detect Ollama version for the built-in, non---oss case
Previously we were only downgrading to chat for older `ollama`s when using `--oss`, but you can also use the built-in ollama provider via `model_provider = "ollama"` in your config
This commit is contained in:
@@ -14,6 +14,24 @@ pub fn get_default_model_for_oss_provider(provider_id: &str) -> Option<&'static
|
||||
}
|
||||
}
|
||||
|
||||
/// Detect whether the selected Ollama instance supports the responses API and, if not, downgrade
|
||||
/// to the chat completions wire API. This should run whenever the Ollama provider is selected,
|
||||
/// even when `--oss` is not in use, so older servers remain compatible.
|
||||
pub async fn detect_ollama_wire_api_if_needed(config: &mut Config) {
|
||||
if config.model_provider_id != OLLAMA_OSS_PROVIDER_ID
|
||||
|| config.model_provider.wire_api != WireApi::Responses
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
match codex_ollama::detect_wire_api(&config.model_provider).await {
|
||||
Ok(Some(detection)) if detection.wire_api == WireApi::Chat => {
|
||||
config.model_provider.wire_api = WireApi::Chat;
|
||||
}
|
||||
Ok(_) | Err(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
/// Ensures the specified OSS provider is ready (models downloaded, service reachable).
|
||||
pub async fn ensure_oss_provider_ready(
|
||||
provider_id: &str,
|
||||
@@ -26,14 +44,7 @@ pub async fn ensure_oss_provider_ready(
|
||||
.map_err(|e| std::io::Error::other(format!("OSS setup failed: {e}")))?;
|
||||
}
|
||||
OLLAMA_OSS_PROVIDER_ID => {
|
||||
if config.model_provider.wire_api == WireApi::Responses {
|
||||
match codex_ollama::detect_wire_api(&config.model_provider).await {
|
||||
Ok(Some(detection)) if detection.wire_api == WireApi::Chat => {
|
||||
config.model_provider.wire_api = WireApi::Chat;
|
||||
}
|
||||
Ok(_) | Err(_) => {}
|
||||
}
|
||||
}
|
||||
detect_ollama_wire_api_if_needed(config).await;
|
||||
|
||||
codex_ollama::ensure_oss_ready(config)
|
||||
.await
|
||||
|
||||
@@ -13,6 +13,7 @@ pub mod exec_events;
|
||||
pub use cli::Cli;
|
||||
pub use cli::Command;
|
||||
pub use cli::ReviewArgs;
|
||||
use codex_common::oss::detect_ollama_wire_api_if_needed;
|
||||
use codex_common::oss::ensure_oss_provider_ready;
|
||||
use codex_common::oss::get_default_model_for_oss_provider;
|
||||
use codex_core::AuthManager;
|
||||
@@ -204,6 +205,10 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option<PathBuf>) -> any
|
||||
|
||||
let mut config = Config::load_with_cli_overrides(cli_kv_overrides, overrides).await?;
|
||||
|
||||
if !oss {
|
||||
detect_ollama_wire_api_if_needed(&mut config).await;
|
||||
}
|
||||
|
||||
if let Err(err) = enforce_login_restrictions(&config).await {
|
||||
eprintln!("{err}");
|
||||
std::process::exit(1);
|
||||
|
||||
@@ -94,7 +94,10 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_wire_api_for_version_dev_zero_keeps_responses() {
|
||||
assert_eq!(wire_api_for_version(&Version::new(0, 0, 0)), WireApi::Responses);
|
||||
assert_eq!(
|
||||
wire_api_for_version(&Version::new(0, 0, 0)),
|
||||
WireApi::Responses
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -104,7 +107,13 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_wire_api_for_version_at_or_after_cutoff_is_responses() {
|
||||
assert_eq!(wire_api_for_version(&Version::new(0, 13, 4)), WireApi::Responses);
|
||||
assert_eq!(wire_api_for_version(&Version::new(0, 14, 0)), WireApi::Responses);
|
||||
assert_eq!(
|
||||
wire_api_for_version(&Version::new(0, 13, 4)),
|
||||
WireApi::Responses
|
||||
);
|
||||
assert_eq!(
|
||||
wire_api_for_version(&Version::new(0, 14, 0)),
|
||||
WireApi::Responses
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ use additional_dirs::add_dir_warning_message;
|
||||
use app::App;
|
||||
pub use app::AppExitInfo;
|
||||
use codex_app_server_protocol::AuthMode;
|
||||
use codex_common::oss::detect_ollama_wire_api_if_needed;
|
||||
use codex_common::oss::ensure_oss_provider_ready;
|
||||
use codex_common::oss::get_default_model_for_oss_provider;
|
||||
use codex_core::AuthManager;
|
||||
@@ -553,7 +554,10 @@ async fn load_config_or_exit(
|
||||
) -> Config {
|
||||
#[allow(clippy::print_stderr)]
|
||||
match Config::load_with_cli_overrides(cli_kv_overrides, overrides).await {
|
||||
Ok(config) => config,
|
||||
Ok(mut config) => {
|
||||
detect_ollama_wire_api_if_needed(&mut config).await;
|
||||
config
|
||||
}
|
||||
Err(err) => {
|
||||
eprintln!("Error loading configuration: {err}");
|
||||
std::process::exit(1);
|
||||
|
||||
@@ -7,6 +7,7 @@ use additional_dirs::add_dir_warning_message;
|
||||
use app::App;
|
||||
pub use app::AppExitInfo;
|
||||
use codex_app_server_protocol::AuthMode;
|
||||
use codex_common::oss::detect_ollama_wire_api_if_needed;
|
||||
use codex_common::oss::ensure_oss_provider_ready;
|
||||
use codex_common::oss::get_default_model_for_oss_provider;
|
||||
use codex_core::AuthManager;
|
||||
@@ -574,7 +575,10 @@ async fn load_config_or_exit(
|
||||
) -> Config {
|
||||
#[allow(clippy::print_stderr)]
|
||||
match Config::load_with_cli_overrides(cli_kv_overrides, overrides).await {
|
||||
Ok(config) => config,
|
||||
Ok(mut config) => {
|
||||
detect_ollama_wire_api_if_needed(&mut config).await;
|
||||
config
|
||||
}
|
||||
Err(err) => {
|
||||
eprintln!("Error loading configuration: {err}");
|
||||
std::process::exit(1);
|
||||
|
||||
Reference in New Issue
Block a user