feat: Added support for auto_unload skills during chat

This commit is contained in:
2026-06-01 15:19:59 -06:00
parent 6330d7dd95
commit d8a92f4e62
+53
View File
@@ -822,6 +822,7 @@ impl RequestContext {
if !app.dry_run {
self.save_message(app, input, output)?;
}
self.skill_registry.sweep_auto_unload();
Ok(())
}
@@ -3515,6 +3516,58 @@ mod tests {
assert!(lm.continuous);
}
#[test]
fn after_chat_completion_sweeps_auto_unload_skills_at_turn_end() {
let mut ctx = create_test_ctx();
ctx.app = Arc::new(AppState {
config: Arc::new(AppConfig {
dry_run: true,
..(*ctx.app.config).clone()
}),
..(*ctx.app).clone()
});
let ephemeral = Skill::new("ephemeral", "---\nauto_unload: true\n---\nbody");
let persistent = Skill::new("persistent", "---\nauto_unload: false\n---\nbody");
ctx.skill_registry.insert(ephemeral).unwrap();
ctx.skill_registry.insert(persistent).unwrap();
let input = Input::from_str(&ctx, "hello", None);
let app = Arc::clone(&ctx.app.config);
ctx.after_chat_completion(app.as_ref(), &input, "response", &[]).unwrap();
assert!(!ctx.skill_registry.is_loaded("ephemeral"));
assert!(ctx.skill_registry.is_loaded("persistent"));
}
#[test]
fn after_chat_completion_preserves_auto_unload_during_tool_loop() {
let mut ctx = create_test_ctx();
ctx.app = Arc::new(AppState {
config: Arc::new(AppConfig {
dry_run: true,
..(*ctx.app.config).clone()
}),
..(*ctx.app).clone()
});
let ephemeral = Skill::new("ephemeral", "---\nauto_unload: true\n---\nbody");
ctx.skill_registry.insert(ephemeral).unwrap();
let input = Input::from_str(&ctx, "hello", None);
let app = Arc::clone(&ctx.app.config);
let tool_result = ToolResult::new(
crate::function::ToolCall::default(),
serde_json::json!({}),
);
ctx.after_chat_completion(app.as_ref(), &input, "", &[tool_result]).unwrap();
assert!(
ctx.skill_registry.is_loaded("ephemeral"),
"auto_unload skills must persist through tool-using rounds"
);
}
#[test]
fn role_like_mut_returns_none_when_empty() {
let mut ctx = create_test_ctx();