Enhance TUI and core functionality: add header rendering, improve message formatting, and refine provider/model handling logic. Update dependencies.
This commit is contained in:
@@ -56,11 +56,11 @@ pub struct ChatApp {
|
||||
pub mode: InputMode,
|
||||
pub status: String,
|
||||
pub error: Option<String>,
|
||||
models: Vec<ModelInfo>, // All models fetched
|
||||
models: Vec<ModelInfo>, // All models fetched
|
||||
pub available_providers: Vec<String>, // Unique providers from models
|
||||
pub selected_provider: String, // The currently selected provider
|
||||
pub selected_provider_index: usize, // Index into the available_providers list
|
||||
pub selected_model: Option<usize>, // Index into the *filtered* models list
|
||||
pub selected_provider: String, // The currently selected provider
|
||||
pub selected_provider_index: usize, // Index into the available_providers list
|
||||
pub selected_model: Option<usize>, // Index into the *filtered* models list
|
||||
scroll: usize,
|
||||
session_tx: mpsc::UnboundedSender<SessionEvent>,
|
||||
streaming: HashSet<Uuid>,
|
||||
@@ -104,7 +104,8 @@ impl ChatApp {
|
||||
}
|
||||
|
||||
pub fn models(&self) -> Vec<&ModelInfo> {
|
||||
self.models.iter()
|
||||
self.models
|
||||
.iter()
|
||||
.filter(|m| m.provider == self.selected_provider)
|
||||
.collect()
|
||||
}
|
||||
@@ -153,16 +154,24 @@ impl ChatApp {
|
||||
self.models = all_models;
|
||||
|
||||
// Populate available_providers
|
||||
let mut providers = self.models.iter().map(|m| m.provider.clone()).collect::<HashSet<_>>();
|
||||
let mut providers = self
|
||||
.models
|
||||
.iter()
|
||||
.map(|m| m.provider.clone())
|
||||
.collect::<HashSet<_>>();
|
||||
self.available_providers = providers.into_iter().collect();
|
||||
self.available_providers.sort();
|
||||
|
||||
// Set selected_provider based on config, or default to "ollama" if not found
|
||||
self.selected_provider = self.available_providers.iter()
|
||||
self.selected_provider = self
|
||||
.available_providers
|
||||
.iter()
|
||||
.find(|&p| p == &config_model_provider)
|
||||
.cloned()
|
||||
.unwrap_or_else(|| "ollama".to_string());
|
||||
self.selected_provider_index = self.available_providers.iter()
|
||||
self.selected_provider_index = self
|
||||
.available_providers
|
||||
.iter()
|
||||
.position(|p| p == &self.selected_provider)
|
||||
.unwrap_or(0);
|
||||
|
||||
@@ -174,7 +183,9 @@ impl ChatApp {
|
||||
let current_model_name = self.controller.selected_model().to_string();
|
||||
let current_model_provider = self.controller.config().general.default_provider.clone();
|
||||
|
||||
if config_model_name.as_deref() != Some(¤t_model_name) || config_model_provider != current_model_provider {
|
||||
if config_model_name.as_deref() != Some(¤t_model_name)
|
||||
|| config_model_provider != current_model_provider
|
||||
{
|
||||
if let Err(err) = config::save_config(self.controller.config()) {
|
||||
self.error = Some(format!("Failed to save config: {err}"));
|
||||
} else {
|
||||
@@ -286,7 +297,9 @@ impl ChatApp {
|
||||
self.mode = InputMode::Normal;
|
||||
}
|
||||
KeyCode::Enter => {
|
||||
if let Some(provider) = self.available_providers.get(self.selected_provider_index) {
|
||||
if let Some(provider) =
|
||||
self.available_providers.get(self.selected_provider_index)
|
||||
{
|
||||
self.selected_provider = provider.clone();
|
||||
self.sync_selected_model_index(); // Update model selection based on new provider
|
||||
self.mode = InputMode::ModelSelection;
|
||||
@@ -318,12 +331,15 @@ impl ChatApp {
|
||||
self.controller.set_model(model_id.clone());
|
||||
self.status = format!("Using model: {}", model_name);
|
||||
// Save the selected provider and model to config
|
||||
self.controller.config_mut().general.default_model = Some(model_id.clone());
|
||||
self.controller.config_mut().general.default_provider = self.selected_provider.clone();
|
||||
self.controller.config_mut().general.default_model =
|
||||
Some(model_id.clone());
|
||||
self.controller.config_mut().general.default_provider =
|
||||
self.selected_provider.clone();
|
||||
match config::save_config(self.controller.config()) {
|
||||
Ok(_) => self.error = None,
|
||||
Err(err) => {
|
||||
self.error = Some(format!("Failed to save config: {}", err));
|
||||
self.error =
|
||||
Some(format!("Failed to save config: {}", err));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -394,16 +410,24 @@ impl ChatApp {
|
||||
self.models = all_models;
|
||||
|
||||
// Populate available_providers
|
||||
let mut providers = self.models.iter().map(|m| m.provider.clone()).collect::<HashSet<_>>();
|
||||
let mut providers = self
|
||||
.models
|
||||
.iter()
|
||||
.map(|m| m.provider.clone())
|
||||
.collect::<HashSet<_>>();
|
||||
self.available_providers = providers.into_iter().collect();
|
||||
self.available_providers.sort();
|
||||
|
||||
// Set selected_provider based on config, or default to "ollama" if not found
|
||||
self.selected_provider = self.available_providers.iter()
|
||||
self.selected_provider = self
|
||||
.available_providers
|
||||
.iter()
|
||||
.find(|&p| p == &config_model_provider)
|
||||
.cloned()
|
||||
.unwrap_or_else(|| "ollama".to_string());
|
||||
self.selected_provider_index = self.available_providers.iter()
|
||||
self.selected_provider_index = self
|
||||
.available_providers
|
||||
.iter()
|
||||
.position(|p| p == &self.selected_provider)
|
||||
.unwrap_or(0);
|
||||
|
||||
@@ -413,7 +437,9 @@ impl ChatApp {
|
||||
let current_model_name = self.controller.selected_model().to_string();
|
||||
let current_model_provider = self.controller.config().general.default_provider.clone();
|
||||
|
||||
if config_model_name.as_deref() != Some(¤t_model_name) || config_model_provider != current_model_provider {
|
||||
if config_model_name.as_deref() != Some(¤t_model_name)
|
||||
|| config_model_provider != current_model_provider
|
||||
{
|
||||
if let Err(err) = config::save_config(self.controller.config()) {
|
||||
self.error = Some(format!("Failed to save config: {err}"));
|
||||
} else {
|
||||
@@ -480,7 +506,9 @@ impl ChatApp {
|
||||
|
||||
fn sync_selected_model_index(&mut self) {
|
||||
let current_model_id = self.controller.selected_model().to_string();
|
||||
let filtered_models: Vec<&ModelInfo> = self.models.iter()
|
||||
let filtered_models: Vec<&ModelInfo> = self
|
||||
.models
|
||||
.iter()
|
||||
.filter(|m| m.provider == self.selected_provider)
|
||||
.collect();
|
||||
|
||||
@@ -501,7 +529,8 @@ impl ChatApp {
|
||||
self.controller.set_model(model.id.clone());
|
||||
// Also update the config with the new model and provider
|
||||
self.controller.config_mut().general.default_model = Some(model.id.clone());
|
||||
self.controller.config_mut().general.default_provider = self.selected_provider.clone();
|
||||
self.controller.config_mut().general.default_provider =
|
||||
self.selected_provider.clone();
|
||||
if let Err(err) = config::save_config(self.controller.config()) {
|
||||
self.error = Some(format!("Failed to save config: {err}"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user