feat(pi): preserve provider/model fields and sync Pi default provider/model on switch
- Fix stale configRef in useConfig so saves include the latest state. - Preserve Pi models.json fields (headers, compat, cost, maxTokens, thinkingLevelMap, authHeader, modelOverrides, provider name) across edits. - Add Pi settings.json I/O and update defaultProvider/defaultModel when activating a provider so Pi actually picks up the switch. - Add round-trip and settings serialization tests.
This commit is contained in:
@@ -28,7 +28,21 @@ pub fn load_agent_config_command(agent: Agent) -> Result<Config, String> {
|
||||
.map_err(fmt_anyhow),
|
||||
Agent::Pi => {
|
||||
let file = pi_io::load_pi_models().map_err(fmt_anyhow)?;
|
||||
Ok(pi_io::pi_file_to_config(&file))
|
||||
let mut config = pi_io::pi_file_to_config(&file);
|
||||
if config.default_model.is_none() {
|
||||
if let Ok(settings) = pi_io::load_pi_settings() {
|
||||
if let (Some(provider), Some(model_id)) =
|
||||
(settings.default_provider, settings.default_model)
|
||||
{
|
||||
if let Some(alias) = config.models.values().find(|m| {
|
||||
m.provider == provider && m.model == model_id
|
||||
}) {
|
||||
config.default_model = Some(alias.alias.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(config)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,11 +66,26 @@ pub fn activate_agent_config_command(agent: Agent) -> Result<(), String> {
|
||||
.map_err(fmt_anyhow),
|
||||
Agent::Pi => {
|
||||
let file = pi_io::config_to_pi_file(&active_config);
|
||||
pi_io::save_pi_models(&file).map_err(fmt_anyhow)
|
||||
pi_io::save_pi_models(&file).map_err(fmt_anyhow)?;
|
||||
|
||||
// Keep Pi's own default provider / model in sync so the switch is
|
||||
// actually picked up on the next `pi` run.
|
||||
let mut settings = pi_io::load_pi_settings().map_err(fmt_anyhow)?;
|
||||
if let Some((provider_name, model_id)) = active_provider_and_model(&active_config) {
|
||||
settings.default_provider = Some(provider_name);
|
||||
settings.default_model = Some(model_id);
|
||||
}
|
||||
pi_io::save_pi_settings(&settings).map_err(fmt_anyhow)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn active_provider_and_model(config: &Config) -> Option<(String, String)> {
|
||||
let alias = config.default_model.as_ref()?;
|
||||
let model = config.models.get(alias)?;
|
||||
Some((model.provider.clone(), model.model.clone()))
|
||||
}
|
||||
|
||||
fn build_active_config(config: &Config) -> Config {
|
||||
let is_kimi_native = |p: &Provider| p.managed;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user