From ff408248d1090a49a89f415591009db0d0cc4cf9 Mon Sep 17 00:00:00 2001 From: jaberjaber23 Date: Thu, 26 Feb 2026 19:42:52 +0300 Subject: [PATCH] provider switching --- crates/openfang-kernel/src/kernel.rs | 26 ++++++++++++++++++++++---- crates/openfang-kernel/src/registry.rs | 17 +++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/crates/openfang-kernel/src/kernel.rs b/crates/openfang-kernel/src/kernel.rs index 13660c76..8bc6b85e 100644 --- a/crates/openfang-kernel/src/kernel.rs +++ b/crates/openfang-kernel/src/kernel.rs @@ -2202,16 +2202,34 @@ impl OpenFangKernel { /// Switch an agent's model. pub fn set_agent_model(&self, agent_id: AgentId, model: &str) -> KernelResult<()> { - self.registry - .update_model(agent_id, model.to_string()) - .map_err(KernelError::OpenFang)?; + // Resolve provider from model catalog so switching models also switches provider + let resolved_provider = self + .model_catalog + .read() + .ok() + .and_then(|catalog| { + catalog + .find_model(model) + .map(|entry| entry.provider.clone()) + }); + + if let Some(provider) = resolved_provider { + self.registry + .update_model_and_provider(agent_id, model.to_string(), provider.clone()) + .map_err(KernelError::OpenFang)?; + info!(agent_id = %agent_id, model = %model, provider = %provider, "Agent model+provider updated"); + } else { + self.registry + .update_model(agent_id, model.to_string()) + .map_err(KernelError::OpenFang)?; + info!(agent_id = %agent_id, model = %model, "Agent model updated"); + } // Persist the updated entry if let Some(entry) = self.registry.get(agent_id) { let _ = self.memory.save_agent(&entry); } - info!(agent_id = %agent_id, model = %model, "Agent model updated"); Ok(()) } diff --git a/crates/openfang-kernel/src/registry.rs b/crates/openfang-kernel/src/registry.rs index d86d2dc8..4b67b55c 100644 --- a/crates/openfang-kernel/src/registry.rs +++ b/crates/openfang-kernel/src/registry.rs @@ -160,6 +160,23 @@ impl AgentRegistry { Ok(()) } + /// Update an agent's model AND provider together. + pub fn update_model_and_provider( + &self, + id: AgentId, + new_model: String, + new_provider: String, + ) -> OpenFangResult<()> { + let mut entry = self + .agents + .get_mut(&id) + .ok_or_else(|| OpenFangError::AgentNotFound(id.to_string()))?; + entry.manifest.model.model = new_model; + entry.manifest.model.provider = new_provider; + entry.last_active = chrono::Utc::now(); + Ok(()) + } + /// Update an agent's skill allowlist. pub fn update_skills(&self, id: AgentId, skills: Vec) -> OpenFangResult<()> { let mut entry = self