Compare commits

...

2 Commits

Author SHA1 Message Date
Friel
1349493486 Snapshot MCP tools for forked agents 2026-04-13 18:32:52 +00:00
Friel
2be95f5082 Inherit forked agent prompt cache keys 2026-04-13 17:41:15 +00:00
16 changed files with 233 additions and 18 deletions

View File

@@ -8,10 +8,12 @@ use crate::codex::emit_subagent_session_started;
use crate::codex_thread::ThreadConfigSnapshot;
use crate::find_archived_thread_path_by_id_str;
use crate::find_thread_path_by_id_str;
use crate::inherited_thread_state::InheritedThreadState;
use crate::rollout::RolloutRecorder;
use crate::session_prefix::format_subagent_context_line;
use crate::session_prefix::format_subagent_notification_message;
use crate::shell_snapshot::ShellSnapshot;
use crate::state::McpToolSnapshot;
use crate::thread_manager::ThreadManagerState;
use crate::thread_rollout_truncation::truncate_rollout_to_last_n_fork_turns;
use codex_features::Feature;
@@ -218,6 +220,14 @@ impl AgentControl {
// The same `AgentControl` is sent to spawn the thread.
let new_thread = match (session_source, options.fork_mode.as_ref()) {
(Some(session_source), Some(_)) => {
let inherited_thread_state = InheritedThreadState::builder()
.prompt_cache_key(
parent_prompt_cache_key_for_source(&state, Some(&session_source)).await,
)
.mcp_tool_snapshot(
parent_mcp_tool_snapshot_for_source(&state, Some(&session_source)).await,
)
.build();
self.spawn_forked_thread(
&state,
config,
@@ -225,6 +235,7 @@ impl AgentControl {
&options,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
)
.await?
}
@@ -238,6 +249,7 @@ impl AgentControl {
/*metrics_service_name*/ None,
inherited_shell_snapshot,
inherited_exec_policy,
Default::default(),
)
.await?
}
@@ -324,6 +336,7 @@ impl AgentControl {
})
}
#[allow(clippy::too_many_arguments)]
async fn spawn_forked_thread(
&self,
state: &Arc<ThreadManagerState>,
@@ -332,6 +345,7 @@ impl AgentControl {
options: &SpawnAgentOptions,
inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
inherited_exec_policy: Option<Arc<crate::exec_policy::ExecPolicyManager>>,
inherited_thread_state: InheritedThreadState,
) -> CodexResult<crate::thread_manager::NewThread> {
if options.fork_parent_spawn_call_id.is_none() {
return Err(CodexErr::Fatal(
@@ -397,6 +411,7 @@ impl AgentControl {
/*persist_extended_history*/ false,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
)
.await
}
@@ -546,6 +561,7 @@ impl AgentControl {
session_source,
inherited_shell_snapshot,
inherited_exec_policy,
Default::default(),
)
.await?;
let mut agent_metadata = agent_metadata;
@@ -1160,6 +1176,48 @@ impl AgentControl {
}
}
async fn parent_prompt_cache_key_for_source(
state: &Arc<ThreadManagerState>,
session_source: Option<&SessionSource>,
) -> Option<ThreadId> {
let Some(SessionSource::SubAgent(SubAgentSource::ThreadSpawn {
parent_thread_id, ..
})) = session_source
else {
return None;
};
state
.get_thread(*parent_thread_id)
.await
.ok()
.map(|parent_thread| parent_thread.codex.session.prompt_cache_key())
}
async fn parent_mcp_tool_snapshot_for_source(
state: &Arc<ThreadManagerState>,
session_source: Option<&SessionSource>,
) -> Option<McpToolSnapshot> {
let Some(SessionSource::SubAgent(SubAgentSource::ThreadSpawn {
parent_thread_id, ..
})) = session_source
else {
return None;
};
let parent_thread = state.get_thread(*parent_thread_id).await.ok()?;
let tools = parent_thread
.codex
.session
.services
.mcp_connection_manager
.read()
.await
.list_all_tools()
.await;
Some(McpToolSnapshot { tools })
}
fn thread_spawn_parent_thread_id(session_source: &SessionSource) -> Option<ThreadId> {
match session_source {
SessionSource::SubAgent(SubAgentSource::ThreadSpawn {

View File

@@ -663,6 +663,37 @@ async fn spawn_agent_can_fork_parent_thread_history_with_sanitized_items() {
.await
.expect("child thread should be registered");
assert_ne!(child_thread_id, parent_thread_id);
assert_eq!(
child_thread.codex.session.prompt_cache_key(),
parent_thread.codex.session.prompt_cache_key(),
);
assert!(!Arc::ptr_eq(
&child_thread.codex.session.services.mcp_connection_manager,
&parent_thread.codex.session.services.mcp_connection_manager,
));
let mcp_tool_snapshot = child_thread
.codex
.session
.services
.mcp_tool_snapshot
.lock()
.await
.clone()
.expect("forked child should inherit an MCP tool snapshot");
let parent_mcp_tools = parent_thread
.codex
.session
.services
.mcp_connection_manager
.read()
.await
.list_all_tools()
.await;
let mut snapshot_tool_names = mcp_tool_snapshot.tools.keys().cloned().collect::<Vec<_>>();
snapshot_tool_names.sort();
let mut parent_tool_names = parent_mcp_tools.keys().cloned().collect::<Vec<_>>();
parent_tool_names.sort();
assert_eq!(snapshot_tool_names, parent_tool_names);
let history = child_thread.codex.session.clone_history().await;
let expected_history = [
ResponseItem::Message {
@@ -1518,7 +1549,7 @@ async fn resume_thread_subagent_restores_stored_nickname_and_role() {
manager,
control,
};
let (parent_thread_id, _parent_thread) = harness.start_thread().await;
let (parent_thread_id, parent_thread) = harness.start_thread().await;
let agent_path = AgentPath::from_string("/root/explorer".to_string())
.expect("test agent path should be valid");
@@ -1608,13 +1639,22 @@ async fn resume_thread_subagent_restores_stored_nickname_and_role() {
.expect("resume should succeed");
assert_eq!(resumed_thread_id, child_thread_id);
let resumed_snapshot = harness
let resumed_thread = harness
.manager
.get_thread(resumed_thread_id)
.await
.expect("resumed child thread should exist")
.config_snapshot()
.await;
.expect("resumed child thread should exist");
assert_eq!(
resumed_thread.codex.session.prompt_cache_key(),
resumed_thread_id,
"resume should keep the resumed thread's own cache key"
);
assert_ne!(
resumed_thread.codex.session.prompt_cache_key(),
parent_thread.codex.session.prompt_cache_key(),
"resume must not opportunistically inherit cache state from a live parent"
);
let resumed_snapshot = resumed_thread.config_snapshot().await;
let SessionSource::SubAgent(SubAgentSource::ThreadSpawn {
parent_thread_id: resumed_parent_thread_id,
depth: resumed_depth,

View File

@@ -147,6 +147,7 @@ struct ModelClientState {
conversation_id: ThreadId,
window_generation: AtomicU64,
installation_id: String,
prompt_cache_key_override: Option<ThreadId>,
provider: ModelProviderInfo,
auth_env_telemetry: AuthEnvTelemetry,
session_source: SessionSource,
@@ -300,6 +301,7 @@ impl ModelClient {
auth_manager: Option<Arc<AuthManager>>,
conversation_id: ThreadId,
installation_id: String,
prompt_cache_key_override: Option<ThreadId>,
provider: ModelProviderInfo,
session_source: SessionSource,
model_verbosity: Option<VerbosityConfig>,
@@ -318,6 +320,7 @@ impl ModelClient {
conversation_id,
window_generation: AtomicU64::new(0),
installation_id,
prompt_cache_key_override,
provider,
auth_env_telemetry,
session_source,
@@ -365,6 +368,12 @@ impl ModelClient {
format!("{conversation_id}:{window_generation}")
}
pub(crate) fn prompt_cache_key(&self) -> ThreadId {
self.state
.prompt_cache_key_override
.unwrap_or(self.state.conversation_id)
}
fn take_cached_websocket_session(&self) -> WebsocketSession {
let mut cached_websocket_session = self
.state
@@ -861,7 +870,7 @@ impl ModelClientSession {
None
};
let text = create_text_param_for_request(verbosity, &prompt.output_schema);
let prompt_cache_key = Some(self.client.state.conversation_id.to_string());
let prompt_cache_key = Some(self.client.prompt_cache_key().to_string());
let request = ResponsesApiRequest {
model: model_info.slug.clone(),
instructions: instructions.clone(),

View File

@@ -20,11 +20,13 @@ use pretty_assertions::assert_eq;
use serde_json::json;
fn test_model_client(session_source: SessionSource) -> ModelClient {
let conversation_id = ThreadId::new();
let provider = create_oss_provider_with_base_url("https://example.com/v1", WireApi::Responses);
ModelClient::new(
/*auth_manager*/ None,
ThreadId::new(),
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
provider,
session_source,
/*model_verbosity*/ None,

View File

@@ -24,6 +24,7 @@ use crate::compact_remote::run_inline_remote_auto_compact_task;
use crate::config::ManagedFeatures;
use crate::connectors;
use crate::exec_policy::ExecPolicyManager;
use crate::inherited_thread_state::InheritedThreadState;
use crate::installation_id::resolve_installation_id;
use crate::mcp_tool_exposure::build_mcp_tool_exposure;
use crate::parse_turn_item;
@@ -436,6 +437,7 @@ pub(crate) struct CodexSpawnArgs {
pub(crate) metrics_service_name: Option<String>,
pub(crate) inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
pub(crate) inherited_exec_policy: Option<Arc<ExecPolicyManager>>,
pub(crate) inherited_thread_state: InheritedThreadState,
pub(crate) user_shell_override: Option<shell::Shell>,
pub(crate) parent_trace: Option<W3cTraceContext>,
pub(crate) analytics_events_client: Option<AnalyticsEventsClient>,
@@ -490,6 +492,7 @@ impl Codex {
inherited_shell_snapshot,
user_shell_override,
inherited_exec_policy,
inherited_thread_state,
parent_trace: _,
analytics_events_client,
} = args;
@@ -682,6 +685,7 @@ impl Codex {
skills_watcher,
agent_control,
environment,
inherited_thread_state,
analytics_events_client,
)
.await
@@ -1627,6 +1631,7 @@ impl Session {
skills_watcher: Arc<SkillsWatcher>,
agent_control: AgentControl,
environment: Option<Arc<Environment>>,
inherited_thread_state: InheritedThreadState,
analytics_events_client: Option<AnalyticsEventsClient>,
) -> anyhow::Result<Arc<Self>> {
debug!(
@@ -1669,6 +1674,8 @@ impl Session {
),
),
};
let prompt_cache_key_override = inherited_thread_state.prompt_cache_key();
let mcp_tool_snapshot = inherited_thread_state.mcp_tool_snapshot();
let window_generation = match &initial_history {
InitialHistory::Resumed(resumed_history) => u64::try_from(
resumed_history
@@ -2027,6 +2034,7 @@ impl Session {
&config.permissions.approval_policy,
&config.permissions.sandbox_policy,
))),
mcp_tool_snapshot: Mutex::new(mcp_tool_snapshot),
mcp_startup_cancellation_token: Mutex::new(CancellationToken::new()),
unified_exec_manager: UnifiedExecProcessManager::new(
config.background_terminal_max_timeout,
@@ -2057,6 +2065,7 @@ impl Session {
Some(Arc::clone(&auth_manager)),
conversation_id,
installation_id,
prompt_cache_key_override,
session_configuration.provider.clone(),
session_configuration.session_source.clone(),
config.model_verbosity,
@@ -2244,6 +2253,10 @@ impl Session {
self.services.state_db.clone()
}
pub(crate) fn prompt_cache_key(&self) -> ThreadId {
self.services.model_client.prompt_cache_key()
}
/// Flush rollout writes and return the final durability-barrier result.
pub(crate) async fn flush_rollout(&self) -> std::io::Result<()> {
let recorder = {
@@ -4529,8 +4542,12 @@ impl Session {
*guard = cancel_token;
}
let mut manager = self.services.mcp_connection_manager.write().await;
*manager = refreshed_manager;
{
let mut manager = self.services.mcp_connection_manager.write().await;
*manager = refreshed_manager;
}
let mut snapshot = self.services.mcp_tool_snapshot.lock().await;
*snapshot = None;
}
async fn refresh_mcp_servers_if_requested(&self, turn_context: &TurnContext) {
@@ -6965,13 +6982,18 @@ pub(crate) async fn built_tools(
skills_outcome: Option<&SkillLoadOutcome>,
cancellation_token: &CancellationToken,
) -> CodexResult<Arc<ToolRouter>> {
let mcp_connection_manager = sess.services.mcp_connection_manager.read().await;
let has_mcp_servers = mcp_connection_manager.has_servers();
let all_mcp_tools = mcp_connection_manager
.list_all_tools()
.or_cancel(cancellation_token)
.await?;
drop(mcp_connection_manager);
let inherited_mcp_tools = sess.services.mcp_tool_snapshot.lock().await.clone();
let (has_mcp_servers, all_mcp_tools) = if let Some(snapshot) = inherited_mcp_tools {
(!snapshot.tools.is_empty(), snapshot.tools)
} else {
let mcp_connection_manager = sess.services.mcp_connection_manager.read().await;
let has_mcp_servers = mcp_connection_manager.has_servers();
let all_mcp_tools = mcp_connection_manager
.list_all_tools()
.or_cancel(cancellation_token)
.await?;
(has_mcp_servers, all_mcp_tools)
};
let loaded_plugins = sess
.services
.plugins_manager

View File

@@ -96,6 +96,7 @@ pub(crate) async fn run_codex_thread_interactive(
inherited_shell_snapshot: None,
user_shell_override: None,
inherited_exec_policy: Some(Arc::clone(&parent_session.services.exec_policy)),
inherited_thread_state: Default::default(),
parent_trace: None,
})
.await?;

View File

@@ -257,11 +257,13 @@ async fn interrupting_regular_turn_waiting_on_startup_prewarm_emits_turn_aborted
}
fn test_model_client_session() -> crate::client::ModelClientSession {
let conversation_id = ThreadId::try_from("00000000-0000-4000-8000-000000000001")
.expect("test thread id should be valid");
crate::client::ModelClient::new(
/*auth_manager*/ None,
ThreadId::try_from("00000000-0000-4000-8000-000000000001")
.expect("test thread id should be valid"),
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
ModelProviderInfo::create_openai_provider(/* base_url */ /*base_url*/ None),
codex_protocol::protocol::SessionSource::Exec,
/*model_verbosity*/ None,
@@ -2742,6 +2744,7 @@ async fn session_new_fails_when_zsh_fork_enabled_without_zsh_path() {
.await
.expect("create environment"),
)),
Default::default(),
/*analytics_events_client*/ None,
)
.await;
@@ -2849,6 +2852,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) {
&config.permissions.approval_policy,
&config.permissions.sandbox_policy,
))),
mcp_tool_snapshot: Mutex::new(None),
mcp_startup_cancellation_token: Mutex::new(CancellationToken::new()),
unified_exec_manager: UnifiedExecProcessManager::new(
config.background_terminal_max_timeout,
@@ -2886,6 +2890,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) {
Some(auth_manager.clone()),
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
session_configuration.provider.clone(),
session_configuration.session_source.clone(),
config.model_verbosity,
@@ -3694,6 +3699,7 @@ pub(crate) async fn make_session_and_context_with_dynamic_tools_and_rx(
&config.permissions.approval_policy,
&config.permissions.sandbox_policy,
))),
mcp_tool_snapshot: Mutex::new(None),
mcp_startup_cancellation_token: Mutex::new(CancellationToken::new()),
unified_exec_manager: UnifiedExecProcessManager::new(
config.background_terminal_max_timeout,
@@ -3731,6 +3737,7 @@ pub(crate) async fn make_session_and_context_with_dynamic_tools_and_rx(
Some(Arc::clone(&auth_manager)),
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
session_configuration.provider.clone(),
session_configuration.session_source.clone(),
config.model_verbosity,

View File

@@ -450,6 +450,7 @@ async fn guardian_subagent_does_not_inherit_parent_exec_policy_rules() {
metrics_service_name: None,
inherited_shell_snapshot: None,
inherited_exec_policy: Some(Arc::new(parent_exec_policy)),
inherited_thread_state: Default::default(),
user_shell_override: None,
parent_trace: None,
})

View File

@@ -0,0 +1,48 @@
use codex_protocol::ThreadId;
use crate::state::McpToolSnapshot;
#[derive(Clone, Default)]
pub(crate) struct InheritedThreadState {
prompt_cache_key: Option<ThreadId>,
mcp_tool_snapshot: Option<McpToolSnapshot>,
}
impl InheritedThreadState {
pub(crate) fn builder() -> InheritedThreadStateBuilder {
InheritedThreadStateBuilder::default()
}
pub(crate) fn prompt_cache_key(&self) -> Option<ThreadId> {
self.prompt_cache_key
}
pub(crate) fn mcp_tool_snapshot(&self) -> Option<McpToolSnapshot> {
self.mcp_tool_snapshot.clone()
}
}
#[derive(Default)]
pub(crate) struct InheritedThreadStateBuilder {
prompt_cache_key: Option<ThreadId>,
mcp_tool_snapshot: Option<McpToolSnapshot>,
}
impl InheritedThreadStateBuilder {
pub(crate) fn prompt_cache_key(mut self, prompt_cache_key: Option<ThreadId>) -> Self {
self.prompt_cache_key = prompt_cache_key;
self
}
pub(crate) fn mcp_tool_snapshot(mut self, mcp_tool_snapshot: Option<McpToolSnapshot>) -> Self {
self.mcp_tool_snapshot = mcp_tool_snapshot;
self
}
pub(crate) fn build(self) -> InheritedThreadState {
InheritedThreadState {
prompt_cache_key: self.prompt_cache_key,
mcp_tool_snapshot: self.mcp_tool_snapshot,
}
}
}

View File

@@ -39,6 +39,7 @@ mod flags;
mod git_info_tests;
mod guardian;
mod hook_runtime;
mod inherited_thread_state;
mod installation_id;
pub(crate) mod instructions;
pub(crate) mod landlock;

View File

@@ -2,6 +2,7 @@ mod service;
mod session;
mod turn;
pub(crate) use service::McpToolSnapshot;
pub(crate) use service::SessionServices;
pub(crate) use session::SessionState;
pub(crate) use turn::ActiveTurn;

View File

@@ -20,6 +20,7 @@ use codex_exec_server::Environment;
use codex_hooks::Hooks;
use codex_login::AuthManager;
use codex_mcp::McpConnectionManager;
use codex_mcp::ToolInfo as McpToolInfo;
use codex_models_manager::manager::ModelsManager;
use codex_otel::SessionTelemetry;
use codex_rollout::state_db::StateDbHandle;
@@ -29,8 +30,14 @@ use tokio::sync::RwLock;
use tokio::sync::watch;
use tokio_util::sync::CancellationToken;
#[derive(Clone, Default)]
pub(crate) struct McpToolSnapshot {
pub(crate) tools: HashMap<String, McpToolInfo>,
}
pub(crate) struct SessionServices {
pub(crate) mcp_connection_manager: Arc<RwLock<McpConnectionManager>>,
pub(crate) mcp_tool_snapshot: Mutex<Option<McpToolSnapshot>>,
pub(crate) mcp_startup_cancellation_token: Mutex<CancellationToken>,
pub(crate) unified_exec_manager: UnifiedExecProcessManager,
#[cfg_attr(not(unix), allow(dead_code))]

View File

@@ -7,6 +7,7 @@ use crate::codex::INITIAL_SUBMIT_ID;
use crate::codex_thread::CodexThread;
use crate::config::Config;
use crate::file_watcher::FileWatcher;
use crate::inherited_thread_state::InheritedThreadState;
use crate::mcp::McpManager;
use crate::plugins::PluginsManager;
use crate::rollout::RolloutRecorder;
@@ -764,6 +765,7 @@ impl ThreadManagerState {
/*metrics_service_name*/ None,
/*inherited_shell_snapshot*/ None,
/*inherited_exec_policy*/ None,
Default::default(),
))
.await
}
@@ -778,6 +780,7 @@ impl ThreadManagerState {
metrics_service_name: Option<String>,
inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
inherited_exec_policy: Option<Arc<crate::exec_policy::ExecPolicyManager>>,
inherited_thread_state: InheritedThreadState,
) -> CodexResult<NewThread> {
Box::pin(self.spawn_thread_with_source(
config,
@@ -790,12 +793,14 @@ impl ThreadManagerState {
metrics_service_name,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
/*parent_trace*/ None,
/*user_shell_override*/ None,
))
.await
}
#[allow(clippy::too_many_arguments)]
pub(crate) async fn resume_thread_from_rollout_with_source(
&self,
config: Config,
@@ -804,6 +809,7 @@ impl ThreadManagerState {
session_source: SessionSource,
inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
inherited_exec_policy: Option<Arc<crate::exec_policy::ExecPolicyManager>>,
inherited_thread_state: InheritedThreadState,
) -> CodexResult<NewThread> {
let initial_history = RolloutRecorder::get_rollout_history(&rollout_path).await?;
Box::pin(self.spawn_thread_with_source(
@@ -817,6 +823,7 @@ impl ThreadManagerState {
/*metrics_service_name*/ None,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
/*parent_trace*/ None,
/*user_shell_override*/ None,
))
@@ -833,6 +840,7 @@ impl ThreadManagerState {
persist_extended_history: bool,
inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
inherited_exec_policy: Option<Arc<crate::exec_policy::ExecPolicyManager>>,
inherited_thread_state: InheritedThreadState,
) -> CodexResult<NewThread> {
Box::pin(self.spawn_thread_with_source(
config,
@@ -845,6 +853,7 @@ impl ThreadManagerState {
/*metrics_service_name*/ None,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
/*parent_trace*/ None,
/*user_shell_override*/ None,
))
@@ -876,6 +885,7 @@ impl ThreadManagerState {
metrics_service_name,
/*inherited_shell_snapshot*/ None,
/*inherited_exec_policy*/ None,
Default::default(),
parent_trace,
user_shell_override,
))
@@ -895,6 +905,7 @@ impl ThreadManagerState {
metrics_service_name: Option<String>,
inherited_shell_snapshot: Option<Arc<ShellSnapshot>>,
inherited_exec_policy: Option<Arc<crate::exec_policy::ExecPolicyManager>>,
inherited_thread_state: InheritedThreadState,
parent_trace: Option<W3cTraceContext>,
user_shell_override: Option<crate::shell::Shell>,
) -> CodexResult<NewThread> {
@@ -922,6 +933,7 @@ impl ThreadManagerState {
metrics_service_name,
inherited_shell_snapshot,
inherited_exec_policy,
inherited_thread_state,
user_shell_override,
parent_trace,
analytics_events_client: self.analytics_events_client.clone(),

View File

@@ -101,6 +101,7 @@ async fn responses_stream_includes_subagent_header_on_review() {
/*auth_manager*/ None,
conversation_id,
/*installation_id*/ TEST_INSTALLATION_ID.to_string(),
/*prompt_cache_key_override*/ None,
provider.clone(),
session_source,
config.model_verbosity,
@@ -226,6 +227,7 @@ async fn responses_stream_includes_subagent_header_on_other() {
/*auth_manager*/ None,
conversation_id,
/*installation_id*/ TEST_INSTALLATION_ID.to_string(),
/*prompt_cache_key_override*/ None,
provider.clone(),
session_source,
config.model_verbosity,
@@ -340,6 +342,7 @@ async fn responses_respects_model_info_overrides_from_config() {
/*auth_manager*/ None,
conversation_id,
/*installation_id*/ TEST_INSTALLATION_ID.to_string(),
/*prompt_cache_key_override*/ None,
provider.clone(),
session_source,
config.model_verbosity,

View File

@@ -881,6 +881,7 @@ async fn send_provider_auth_request(server: &MockServer, auth: ModelProviderAuth
))),
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
provider,
SessionSource::Exec,
config.model_verbosity,
@@ -2179,6 +2180,7 @@ async fn azure_responses_request_includes_store_and_reasoning_ids() {
/*auth_manager*/ None,
conversation_id,
/*installation_id*/ "11111111-1111-4111-8111-111111111111".to_string(),
/*prompt_cache_key_override*/ None,
provider.clone(),
SessionSource::Exec,
config.model_verbosity,

View File

@@ -1814,6 +1814,7 @@ async fn websocket_harness_with_provider_options(
/*auth_manager*/ None,
conversation_id,
/*installation_id*/ TEST_INSTALLATION_ID.to_string(),
/*prompt_cache_key_override*/ None,
provider.clone(),
SessionSource::Exec,
config.model_verbosity,