[codex] Use standalone tools for Responses Lite (#26490)

## Summary

Responses Lite does not execute hosted Responses tools, so models using
it must route web search and image generation through Codex-owned
executors & standalone Response's API endpoints.

This PR is stacked on #26487.

## Validation

- `cargo test -p codex-core responses_lite_ --lib`
- `cargo test -p codex-core
standalone_executors_remain_hidden_without_flags_or_responses_lite
--lib`
- `cargo test -p codex-core
hosted_tools_follow_provider_auth_model_and_config_gates --lib`
- `cargo test -p codex-web-search-extension -p
codex-image-generation-extension`
- `cargo test -p codex-app-server --test all standalone_`
- `cargo fmt --all -- --check`
This commit is contained in:
rka-oai
2026-06-06 00:23:40 +00:00
committed by GitHub
parent 4f655bc3b7
commit ffe90cb5c3
11 changed files with 259 additions and 50 deletions
-1
View File
@@ -17,7 +17,6 @@ async-trait = { workspace = true }
codex-api = { workspace = true }
codex-core = { workspace = true }
codex-extension-api = { workspace = true }
codex-features = { workspace = true }
codex-login = { workspace = true }
codex-model-provider = { workspace = true }
codex-model-provider-info = { workspace = true }
@@ -9,7 +9,6 @@ use codex_extension_api::ThreadStartInput;
use codex_extension_api::ToolCall;
use codex_extension_api::ToolContributor;
use codex_extension_api::ToolExecutor;
use codex_features::Feature;
use codex_login::AuthManager;
use codex_model_provider::create_model_provider;
use codex_model_provider_info::ModelProviderInfo;
@@ -25,7 +24,7 @@ struct ImageGenerationExtension {
#[derive(Clone)]
struct ImageGenerationExtensionConfig {
enabled: bool,
available: bool,
provider: ModelProviderInfo,
codex_home: AbsolutePathBuf,
}
@@ -34,8 +33,8 @@ impl From<&Config> for ImageGenerationExtensionConfig {
/// Resolves whether standalone image generation should be available for a thread.
fn from(config: &Config) -> Self {
Self {
enabled: config.features.enabled(Feature::ImageGenExt)
&& config.model_provider.is_openai(),
// Core selects this executor per turn using the feature flag or model metadata.
available: config.model_provider.is_openai(),
provider: config.model_provider.clone(),
codex_home: config.codex_home.clone(),
}
@@ -75,7 +74,7 @@ impl ToolContributor for ImageGenerationExtension {
let Some(config) = thread_store.get::<ImageGenerationExtensionConfig>() else {
return Vec::new();
};
if !config.enabled || !self.auth_manager.current_auth_uses_codex_backend() {
if !config.available || !self.auth_manager.current_auth_uses_codex_backend() {
return Vec::new();
}
@@ -90,7 +89,7 @@ impl ToolContributor for ImageGenerationExtension {
}
}
/// Installs the feature-gated standalone image-generation extension contributors.
/// Installs the standalone image-generation extension contributors.
pub fn install(registry: &mut ExtensionRegistryBuilder<Config>, auth_manager: Arc<AuthManager>) {
let extension = Arc::new(ImageGenerationExtension { auth_manager });
registry.thread_lifecycle_contributor(extension.clone());
-1
View File
@@ -17,7 +17,6 @@ async-trait = { workspace = true }
codex-api = { workspace = true }
codex-core = { workspace = true }
codex-extension-api = { workspace = true }
codex-features = { workspace = true }
codex-login = { workspace = true }
codex-model-provider = { workspace = true }
codex-model-provider-info = { workspace = true }
+5 -6
View File
@@ -13,7 +13,6 @@ use codex_extension_api::ExtensionRegistryBuilder;
use codex_extension_api::ThreadLifecycleContributor;
use codex_extension_api::ThreadStartInput;
use codex_extension_api::ToolContributor;
use codex_features::Feature;
use codex_login::AuthManager;
use codex_model_provider::create_model_provider;
use codex_model_provider_info::ModelProviderInfo;
@@ -29,7 +28,7 @@ struct WebSearchExtension {
#[derive(Clone)]
struct WebSearchExtensionConfig {
enabled: bool,
available: bool,
provider: ModelProviderInfo,
settings: SearchSettings,
}
@@ -38,8 +37,8 @@ impl From<&Config> for WebSearchExtensionConfig {
fn from(config: &Config) -> Self {
let web_search_mode = config.web_search_mode.value();
Self {
enabled: config.features.enabled(Feature::StandaloneWebSearch)
&& config.model_provider.is_openai()
// Core selects this executor per turn using the feature flag or model metadata.
available: config.model_provider.is_openai()
&& web_search_mode != WebSearchMode::Disabled,
provider: config.model_provider.clone(),
settings: search_settings(config, web_search_mode),
@@ -111,7 +110,7 @@ impl ToolContributor for WebSearchExtension {
let Some(config) = thread_store.get::<WebSearchExtensionConfig>() else {
return Vec::new();
};
if !config.enabled {
if !config.available {
return Vec::new();
}
@@ -160,7 +159,7 @@ mod tests {
let session_store = ExtensionData::new("session");
let thread_store = ExtensionData::new("11111111-1111-4111-8111-111111111111");
thread_store.insert(WebSearchExtensionConfig {
enabled: true,
available: true,
provider: ModelProviderInfo::create_openai_provider(/*base_url*/ None),
settings: Default::default(),
});