Skip to content

Commit 2de7314

Browse files
authored
Remove model family from tui (#8488)
- Remove model family from tui
1 parent 7078a0b commit 2de7314

File tree

12 files changed

+189
-252
lines changed

12 files changed

+189
-252
lines changed

codex-rs/tui/src/app.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,6 @@ impl App {
372372
}
373373

374374
let enhanced_keys_supported = tui.enhanced_keys_supported();
375-
let model_family = conversation_manager
376-
.get_models_manager()
377-
.construct_model_family(model.as_str(), &config)
378-
.await;
379375
let mut chat_widget = match resume_selection {
380376
ResumeSelection::StartFresh | ResumeSelection::Exit => {
381377
let init = crate::chatwidget::ChatWidgetInit {
@@ -389,7 +385,7 @@ impl App {
389385
models_manager: conversation_manager.get_models_manager(),
390386
feedback: feedback.clone(),
391387
is_first_run,
392-
model_family: model_family.clone(),
388+
model: model.clone(),
393389
};
394390
ChatWidget::new(init, conversation_manager.clone())
395391
}
@@ -415,7 +411,7 @@ impl App {
415411
models_manager: conversation_manager.get_models_manager(),
416412
feedback: feedback.clone(),
417413
is_first_run,
418-
model_family: model_family.clone(),
414+
model: model.clone(),
419415
};
420416
ChatWidget::new_from_existing(
421417
init,
@@ -582,7 +578,7 @@ impl App {
582578
models_manager: self.server.get_models_manager(),
583579
feedback: self.feedback.clone(),
584580
is_first_run: false,
585-
model_family: model_family.clone(),
581+
model: self.current_model.clone(),
586582
};
587583
self.chat_widget = ChatWidget::new(init, self.server.clone());
588584
self.current_model = model_family.get_model_slug().to_string();
@@ -632,7 +628,7 @@ impl App {
632628
models_manager: self.server.get_models_manager(),
633629
feedback: self.feedback.clone(),
634630
is_first_run: false,
635-
model_family: model_family.clone(),
631+
model: self.current_model.clone(),
636632
};
637633
self.chat_widget = ChatWidget::new_from_existing(
638634
init,
@@ -767,12 +763,7 @@ impl App {
767763
self.on_update_reasoning_effort(effort);
768764
}
769765
AppEvent::UpdateModel(model) => {
770-
let model_family = self
771-
.server
772-
.get_models_manager()
773-
.construct_model_family(&model, &self.config)
774-
.await;
775-
self.chat_widget.set_model(&model, model_family);
766+
self.chat_widget.set_model(&model);
776767
self.current_model = model;
777768
}
778769
AppEvent::OpenReasoningPopup { model } => {
@@ -1357,7 +1348,7 @@ mod tests {
13571348
async fn make_test_app() -> App {
13581349
let (chat_widget, app_event_tx, _rx, _op_rx) = make_chatwidget_manual_with_sender().await;
13591350
let config = chat_widget.config_ref().clone();
1360-
let current_model = chat_widget.get_model_family().get_model_slug().to_string();
1351+
let current_model = "gpt-5.2-codex".to_string();
13611352
let server = Arc::new(ConversationManager::with_models_provider(
13621353
CodexAuth::from_api_key("Test API Key"),
13631354
config.model_provider.clone(),
@@ -1396,7 +1387,7 @@ mod tests {
13961387
) {
13971388
let (chat_widget, app_event_tx, rx, op_rx) = make_chatwidget_manual_with_sender().await;
13981389
let config = chat_widget.config_ref().clone();
1399-
let current_model = chat_widget.get_model_family().get_model_slug().to_string();
1390+
let current_model = "gpt-5.2-codex".to_string();
14001391
let server = Arc::new(ConversationManager::with_models_provider(
14011392
CodexAuth::from_api_key("Test API Key"),
14021393
config.model_provider.clone(),

codex-rs/tui/src/app_backtrack.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,9 @@ impl App {
338338
) {
339339
let conv = new_conv.conversation;
340340
let session_configured = new_conv.session_configured;
341-
let model_family = self.chat_widget.get_model_family();
342341
let init = crate::chatwidget::ChatWidgetInit {
343342
config: cfg,
344-
model_family: model_family.clone(),
343+
model: self.current_model.clone(),
345344
frame_requester: tui.frame_requester(),
346345
app_event_tx: self.app_event_tx.clone(),
347346
initial_prompt: None,
@@ -354,7 +353,6 @@ impl App {
354353
};
355354
self.chat_widget =
356355
crate::chatwidget::ChatWidget::new_from_existing(init, conv, session_configured);
357-
self.current_model = model_family.get_model_slug().to_string();
358356
// Trim transcript up to the selected user message and re-render it.
359357
self.trim_transcript_for_backtrack(nth_user_message);
360358
self.render_transcript_once(tui);

codex-rs/tui/src/chatwidget.rs

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use codex_core::features::Feature;
1515
use codex_core::git_info::current_branch_name;
1616
use codex_core::git_info::local_git_branches;
1717
use codex_core::models_manager::manager::ModelsManager;
18-
use codex_core::models_manager::model_family::ModelFamily;
1918
use codex_core::project_doc::DEFAULT_PROJECT_DOC_FILENAME;
2019
use codex_core::protocol::AgentMessageDeltaEvent;
2120
use codex_core::protocol::AgentMessageEvent;
@@ -291,7 +290,7 @@ pub(crate) struct ChatWidgetInit {
291290
pub(crate) models_manager: Arc<ModelsManager>,
292291
pub(crate) feedback: codex_feedback::CodexFeedback,
293292
pub(crate) is_first_run: bool,
294-
pub(crate) model_family: ModelFamily,
293+
pub(crate) model: String,
295294
}
296295

297296
#[derive(Default)]
@@ -316,7 +315,7 @@ pub(crate) struct ChatWidget {
316315
bottom_pane: BottomPane,
317316
active_cell: Option<Box<dyn HistoryCell>>,
318317
config: Config,
319-
model_family: ModelFamily,
318+
model: String,
320319
auth_manager: Arc<AuthManager>,
321320
models_manager: Arc<ModelsManager>,
322321
session_header: SessionHeader,
@@ -608,12 +607,10 @@ impl ChatWidget {
608607
}
609608

610609
fn context_remaining_percent(&self, info: &TokenUsageInfo) -> Option<i64> {
611-
info.model_context_window
612-
.or(self.model_family.context_window)
613-
.map(|window| {
614-
info.last_token_usage
615-
.percent_of_context_window_remaining(window)
616-
})
610+
info.model_context_window.map(|window| {
611+
info.last_token_usage
612+
.percent_of_context_window_remaining(window)
613+
})
617614
}
618615

619616
fn context_used_tokens(&self, info: &TokenUsageInfo, percent_known: bool) -> Option<i64> {
@@ -681,7 +678,7 @@ impl ChatWidget {
681678

682679
if high_usage
683680
&& !self.rate_limit_switch_prompt_hidden()
684-
&& self.model_family.get_model_slug() != NUDGE_MODEL_SLUG
681+
&& self.model != NUDGE_MODEL_SLUG
685682
&& !matches!(
686683
self.rate_limit_switch_prompt,
687684
RateLimitSwitchPromptState::Shown
@@ -715,9 +712,6 @@ impl ChatWidget {
715712
self.stream_controller = None;
716713
self.maybe_show_pending_rate_limit_prompt();
717714
}
718-
pub(crate) fn get_model_family(&self) -> ModelFamily {
719-
self.model_family.clone()
720-
}
721715

722716
fn on_error(&mut self, message: String) {
723717
self.finalize_turn();
@@ -1420,11 +1414,10 @@ impl ChatWidget {
14201414
models_manager,
14211415
feedback,
14221416
is_first_run,
1423-
model_family,
1417+
model,
14241418
} = common;
1425-
let model_slug = model_family.get_model_slug().to_string();
14261419
let mut config = config;
1427-
config.model = Some(model_slug.clone());
1420+
config.model = Some(model.clone());
14281421
let mut rng = rand::rng();
14291422
let placeholder = EXAMPLE_PROMPTS[rng.random_range(0..EXAMPLE_PROMPTS.len())].to_string();
14301423
let codex_op_tx = spawn_agent(config.clone(), app_event_tx.clone(), conversation_manager);
@@ -1445,10 +1438,10 @@ impl ChatWidget {
14451438
}),
14461439
active_cell: None,
14471440
config,
1448-
model_family,
1441+
model: model.clone(),
14491442
auth_manager,
14501443
models_manager,
1451-
session_header: SessionHeader::new(model_slug),
1444+
session_header: SessionHeader::new(model),
14521445
initial_user_message: create_initial_user_message(
14531446
initial_prompt.unwrap_or_default(),
14541447
initial_images,
@@ -1506,10 +1499,9 @@ impl ChatWidget {
15061499
auth_manager,
15071500
models_manager,
15081501
feedback,
1509-
model_family,
1502+
model,
15101503
..
15111504
} = common;
1512-
let model_slug = model_family.get_model_slug().to_string();
15131505
let mut rng = rand::rng();
15141506
let placeholder = EXAMPLE_PROMPTS[rng.random_range(0..EXAMPLE_PROMPTS.len())].to_string();
15151507

@@ -1532,10 +1524,10 @@ impl ChatWidget {
15321524
}),
15331525
active_cell: None,
15341526
config,
1535-
model_family,
1527+
model: model.clone(),
15361528
auth_manager,
15371529
models_manager,
1538-
session_header: SessionHeader::new(model_slug),
1530+
session_header: SessionHeader::new(model),
15391531
initial_user_message: create_initial_user_message(
15401532
initial_prompt.unwrap_or_default(),
15411533
initial_images,
@@ -2249,22 +2241,20 @@ impl ChatWidget {
22492241

22502242
pub(crate) fn add_status_output(&mut self) {
22512243
let default_usage = TokenUsage::default();
2252-
let (total_usage, context_usage) = if let Some(ti) = &self.token_info {
2253-
(&ti.total_token_usage, Some(&ti.last_token_usage))
2254-
} else {
2255-
(&default_usage, Some(&default_usage))
2256-
};
2244+
let token_info = self.token_info.as_ref();
2245+
let total_usage = token_info
2246+
.map(|ti| &ti.total_token_usage)
2247+
.unwrap_or(&default_usage);
22572248
self.add_to_history(crate::status::new_status_output(
22582249
&self.config,
22592250
self.auth_manager.as_ref(),
2260-
&self.model_family,
2251+
token_info,
22612252
total_usage,
2262-
context_usage,
22632253
&self.conversation_id,
22642254
self.rate_limit_snapshot.as_ref(),
22652255
self.plan_type,
22662256
Local::now(),
2267-
self.model_family.get_model_slug(),
2257+
&self.model,
22682258
));
22692259
}
22702260

@@ -2417,7 +2407,6 @@ impl ChatWidget {
24172407
/// Open a popup to choose a quick auto model. Selecting "All models"
24182408
/// opens the full picker with every available preset.
24192409
pub(crate) fn open_model_popup(&mut self) {
2420-
let current_model = self.model_family.get_model_slug().to_string();
24212410
let presets: Vec<ModelPreset> =
24222411
// todo(aibrahim): make this async function
24232412
match self.models_manager.try_list_models(&self.config) {
@@ -2434,9 +2423,9 @@ impl ChatWidget {
24342423

24352424
let current_label = presets
24362425
.iter()
2437-
.find(|preset| preset.model == current_model)
2426+
.find(|preset| preset.model == self.model)
24382427
.map(|preset| preset.display_name.to_string())
2439-
.unwrap_or_else(|| current_model.clone());
2428+
.unwrap_or_else(|| self.model.clone());
24402429

24412430
let (mut auto_presets, other_presets): (Vec<ModelPreset>, Vec<ModelPreset>) = presets
24422431
.into_iter()
@@ -2462,7 +2451,7 @@ impl ChatWidget {
24622451
SelectionItem {
24632452
name: preset.display_name.clone(),
24642453
description,
2465-
is_current: model == current_model,
2454+
is_current: model == self.model,
24662455
is_default: preset.is_default,
24672456
actions,
24682457
dismiss_on_select: true,
@@ -2525,12 +2514,11 @@ impl ChatWidget {
25252514
return;
25262515
}
25272516

2528-
let current_model = self.model_family.get_model_slug().to_string();
25292517
let mut items: Vec<SelectionItem> = Vec::new();
25302518
for preset in presets.into_iter() {
25312519
let description =
25322520
(!preset.description.is_empty()).then_some(preset.description.to_string());
2533-
let is_current = preset.model == current_model;
2521+
let is_current = preset.model == self.model;
25342522
let single_supported_effort = preset.supported_reasoning_efforts.len() == 1;
25352523
let preset_for_action = preset.clone();
25362524
let actions: Vec<SelectionAction> = vec![Box::new(move |tx| {
@@ -2656,7 +2644,7 @@ impl ChatWidget {
26562644
.or(Some(default_effort));
26572645

26582646
let model_slug = preset.model.to_string();
2659-
let is_current_model = self.model_family.get_model_slug() == preset.model;
2647+
let is_current_model = self.model == preset.model;
26602648
let highlight_choice = if is_current_model {
26612649
self.config.model_reasoning_effort
26622650
} else {
@@ -3246,9 +3234,9 @@ impl ChatWidget {
32463234
}
32473235

32483236
/// Set the model in the widget's config copy.
3249-
pub(crate) fn set_model(&mut self, model: &str, model_family: ModelFamily) {
3237+
pub(crate) fn set_model(&mut self, model: &str) {
32503238
self.session_header.set_model(model);
3251-
self.model_family = model_family;
3239+
self.model = model.to_string();
32523240
}
32533241

32543242
pub(crate) fn add_info_message(&mut self, message: String, hint: Option<String>) {

codex-rs/tui/src/chatwidget/tests.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ async fn helpers_are_available_and_do_not_panic() {
313313
let tx = AppEventSender::new(tx_raw);
314314
let cfg = test_config().await;
315315
let resolved_model = ModelsManager::get_model_offline(cfg.model.as_deref());
316-
let model_family = ModelsManager::construct_model_family_offline(&resolved_model, &cfg);
317316
let conversation_manager = Arc::new(ConversationManager::with_models_provider(
318317
CodexAuth::from_api_key("test"),
319318
cfg.model_provider.clone(),
@@ -330,7 +329,7 @@ async fn helpers_are_available_and_do_not_panic() {
330329
models_manager: conversation_manager.get_models_manager(),
331330
feedback: codex_feedback::CodexFeedback::new(),
332331
is_first_run: true,
333-
model_family,
332+
model: resolved_model,
334333
};
335334
let mut w = ChatWidget::new(init, conversation_manager);
336335
// Basic construction sanity.
@@ -371,11 +370,11 @@ async fn make_chatwidget_manual(
371370
codex_op_tx: op_tx,
372371
bottom_pane: bottom,
373372
active_cell: None,
374-
config: cfg.clone(),
375-
model_family: ModelsManager::construct_model_family_offline(&resolved_model, &cfg),
373+
config: cfg,
374+
model: resolved_model.clone(),
376375
auth_manager: auth_manager.clone(),
377376
models_manager: Arc::new(ModelsManager::new(auth_manager)),
378-
session_header: SessionHeader::new(resolved_model.clone()),
377+
session_header: SessionHeader::new(resolved_model),
379378
initial_user_message: None,
380379
token_info: None,
381380
rate_limit_snapshot: None,

0 commit comments

Comments
 (0)