provider switching

This commit is contained in:
jaberjaber23
2026-02-26 19:42:52 +03:00
parent 94f8c2d60d
commit ff408248d1
2 changed files with 39 additions and 4 deletions
+22 -4
View File
@@ -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(())
}
+17
View File
@@ -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<String>) -> OpenFangResult<()> {
let mut entry = self