From 05cfa213b6cd4273cfb5bf1b7486938b4271e309 Mon Sep 17 00:00:00 2001 From: Nathan Weinberg <31703736+nathan-weinberg@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:41:33 -0400 Subject: [PATCH] chore: standardize tool group not found error (#2986) # What does this PR do? 1. Creates a new `ToolGroupNotFoundError` class 2. Implements the new class where appropriate Relates to #2379 Signed-off-by: Nathan Weinberg --- llama_stack/apis/common/errors.py | 10 ++++++++++ llama_stack/core/routing_tables/toolgroups.py | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/llama_stack/apis/common/errors.py b/llama_stack/apis/common/errors.py index 9335cf400..f742513c3 100644 --- a/llama_stack/apis/common/errors.py +++ b/llama_stack/apis/common/errors.py @@ -40,3 +40,13 @@ class DatasetNotFoundError(ValueError): def __init__(self, dataset_name: str) -> None: message = f"Dataset '{dataset_name}' not found. Use client.datasets.list() to list available datasets." super().__init__(message) + + +class ToolGroupNotFoundError(ValueError): + """raised when Llama Stack cannot find a referenced tool group""" + + def __init__(self, toolgroup_name: str) -> None: + message = ( + f"Tool group '{toolgroup_name}' not found. Use client.toolgroups.list() to list available tool groups." + ) + super().__init__(message) diff --git a/llama_stack/core/routing_tables/toolgroups.py b/llama_stack/core/routing_tables/toolgroups.py index a6d15796a..e172af991 100644 --- a/llama_stack/core/routing_tables/toolgroups.py +++ b/llama_stack/core/routing_tables/toolgroups.py @@ -7,6 +7,7 @@ from typing import Any from llama_stack.apis.common.content_types import URL +from llama_stack.apis.common.errors import ToolGroupNotFoundError from llama_stack.apis.tools import ListToolGroupsResponse, ListToolsResponse, Tool, ToolGroup, ToolGroups from llama_stack.core.datatypes import ToolGroupWithOwner from llama_stack.log import get_logger @@ -87,7 +88,7 @@ class ToolGroupsRoutingTable(CommonRoutingTableImpl, ToolGroups): async def get_tool_group(self, toolgroup_id: str) -> ToolGroup: tool_group = await self.get_object_by_identifier("tool_group", toolgroup_id) if tool_group is None: - raise ValueError(f"Tool group '{toolgroup_id}' not found") + raise ToolGroupNotFoundError(toolgroup_id) return tool_group async def get_tool(self, tool_name: str) -> Tool: @@ -125,7 +126,7 @@ class ToolGroupsRoutingTable(CommonRoutingTableImpl, ToolGroups): async def unregister_toolgroup(self, toolgroup_id: str) -> None: tool_group = await self.get_tool_group(toolgroup_id) if tool_group is None: - raise ValueError(f"Tool group {toolgroup_id} not found") + raise ToolGroupNotFoundError(toolgroup_id) await self.unregister_object(tool_group) async def shutdown(self) -> None: