From 46d4b78ccc957e41bfec971a1ce84898e65bfcdb Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Jun 2026 11:03:44 -0600 Subject: [PATCH] fix: fixed tool filtering logic for skills and user functions in agents --- src/config/request_context.rs | 6 +++++- src/graph/llm.rs | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/config/request_context.rs b/src/config/request_context.rs index 2a23710..c178d4a 100644 --- a/src/config/request_context.rs +++ b/src/config/request_context.rs @@ -1229,7 +1229,11 @@ impl RequestContext { .collect(); if let Some(ref tool_names) = role_filter { - agent_functions.retain(|v| tool_names.contains(&v.name)); + agent_functions.retain(|v| { + tool_names.contains(&v.name) + || v.name.starts_with(SKILL_FUNCTION_PREFIX) + || v.name.starts_with(USER_FUNCTION_PREFIX) + }); } let tool_names: HashSet = agent_functions diff --git a/src/graph/llm.rs b/src/graph/llm.rs index 6207194..d030167 100644 --- a/src/graph/llm.rs +++ b/src/graph/llm.rs @@ -3,6 +3,7 @@ use super::structured; use super::types::LlmNode; use crate::client::{Model, ModelType, call_chat_completions}; use crate::config::{Input, RequestContext, Role, RoleLike, SkillPolicy}; +use crate::function::skill::skill_function_declarations; use crate::utils::create_abort_signal; use anyhow::{Context, Error, Result, anyhow, bail}; use serde_json::Value; @@ -105,7 +106,7 @@ async fn run( let (regular_tools, mcp_servers) = categorize_tools(node.tools.as_deref()); validate_tools_subset(®ular_tools, &mcp_servers, parent_ctx)?; - let role = build_inline_role( + let mut role = build_inline_role( node, instructions.as_deref(), ®ular_tools, @@ -121,6 +122,23 @@ async fn run( parent_ctx.agent.as_ref(), parent_ctx.session.as_ref(), )?; + + if policy.skills_enabled + && node + .tools + .as_deref() + .map(|t| !t.is_empty()) + .unwrap_or(false) + { + let mut tools = role.enabled_tools().map(|v| v.to_vec()).unwrap_or_default(); + for decl in skill_function_declarations() { + if !tools.contains(&decl.name) { + tools.push(decl.name); + } + } + role.set_enabled_tools(Some(tools)); + } + let composed_role = parent_ctx.skill_registry.effective_role(&role, &policy); let saved_role = parent_ctx.role.clone();