= ({ accessToken, user
}
try {
- deleteConfigFieldSetting(accessToken, fieldName);
+ deleteConfigFieldSetting(accessToken, fieldName).then(refreshUISettings);
// update value in state
const updatedSettings = generalSettings.map((setting) =>
diff --git a/ui/litellm-dashboard/src/components/object_permissions_view.tsx b/ui/litellm-dashboard/src/components/object_permissions_view.tsx
index fcb8a7a3995..a2310690df7 100644
--- a/ui/litellm-dashboard/src/components/object_permissions_view.tsx
+++ b/ui/litellm-dashboard/src/components/object_permissions_view.tsx
@@ -4,7 +4,7 @@ import MCPServerPermissions from "./permissions/MCPServerPermissions";
import AgentPermissions from "./permissions/AgentPermissions";
import type { ObjectPermission } from "./object_permission_types";
import type { InheritedGrant } from "./permissions/inheritedGrants";
-import { searchToolPermissionCopy } from "./search_tools/searchToolPermissionCopy";
+import { searchToolPermissionCopy, type SearchToolPermissionScope } from "./search_tools/searchToolPermissionCopy";
import { useDefaultSearchListDeny } from "@/app/(dashboard)/hooks/uiSettings/useDefaultSearchListDeny";
interface ObjectPermissionsViewProps {
@@ -14,6 +14,7 @@ interface ObjectPermissionsViewProps {
variant?: "card" | "inline";
className?: string;
accessToken?: string | null;
+ searchToolScope?: SearchToolPermissionScope;
}
export function ObjectPermissionsView({
@@ -23,6 +24,7 @@ export function ObjectPermissionsView({
variant = "card",
className = "",
accessToken,
+ searchToolScope = "team",
}: ObjectPermissionsViewProps) {
const vectorStores = objectPermission?.vector_stores || [];
const mcpServers = objectPermission?.mcp_servers || [];
@@ -33,7 +35,7 @@ export function ObjectPermissionsView({
const agentAccessGroups = objectPermission?.agent_access_groups || [];
const searchTools = objectPermission?.search_tools || [];
const skills = objectPermission?.skills || [];
- const searchToolCopy = searchToolPermissionCopy(useDefaultSearchListDeny());
+ const searchToolCopy = searchToolPermissionCopy(useDefaultSearchListDeny(), searchToolScope);
const content = (
diff --git a/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.test.ts b/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.test.ts
index 750d0f3bb19..46bd633a90c 100644
--- a/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.test.ts
+++ b/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.test.ts
@@ -16,4 +16,14 @@ describe("searchToolPermissionCopy", () => {
expect(copy.emptyState).toContain("no search tool is allowed");
expect(Object.values(copy).join(" ")).not.toContain("all allowed");
});
+
+ it("describes an empty key-level list as deferring to the team or user grant", () => {
+ expect(searchToolPermissionCopy(true, "key").emptyState).toBe(
+ "No key-level search tools. Default search list deny is on, so this key can use only the search tools granted to its team or user.",
+ );
+ expect(searchToolPermissionCopy(false, "key").emptyState).toBe(
+ "No key-level restriction: this key can use any search tool its team or user allows.",
+ );
+ expect(searchToolPermissionCopy(true, "key").hint).toBe(searchToolPermissionCopy(true).hint);
+ });
});
diff --git a/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.ts b/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.ts
index 75d5f8d350d..f914917acb5 100644
--- a/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.ts
+++ b/ui/litellm-dashboard/src/components/search_tools/searchToolPermissionCopy.ts
@@ -4,8 +4,18 @@ export interface SearchToolPermissionCopy {
emptyState: string;
}
-export const searchToolPermissionCopy = (defaultSearchListDeny: boolean): SearchToolPermissionCopy =>
+export type SearchToolPermissionScope = "team" | "key";
+
+const keyEmptyState = (defaultSearchListDeny: boolean): string =>
defaultSearchListDeny
+ ? "No key-level search tools. Default search list deny is on, so this key can use only the search tools granted to its team or user."
+ : "No key-level restriction: this key can use any search tool its team or user allows.";
+
+export const searchToolPermissionCopy = (
+ defaultSearchListDeny: boolean,
+ scope: SearchToolPermissionScope = "team",
+): SearchToolPermissionCopy => {
+ const copy = defaultSearchListDeny
? {
hint: "Select which search tools this team can access. Default search list deny is on, so leaving this empty denies every search tool.",
placeholder: "Select search tools (empty = none allowed)",
@@ -16,3 +26,5 @@ export const searchToolPermissionCopy = (defaultSearchListDeny: boolean): Search
placeholder: "Select search tools (optional, empty = all allowed)",
emptyState: "No restriction: all configured search tools are allowed for this team.",
};
+ return scope === "key" ? { ...copy, emptyState: keyEmptyState(defaultSearchListDeny) } : copy;
+};
diff --git a/ui/litellm-dashboard/src/components/templates/key_info_view.tsx b/ui/litellm-dashboard/src/components/templates/key_info_view.tsx
index 7eb09926caf..a0a8daca1d4 100644
--- a/ui/litellm-dashboard/src/components/templates/key_info_view.tsx
+++ b/ui/litellm-dashboard/src/components/templates/key_info_view.tsx
@@ -765,6 +765,7 @@ export default function KeyInfoView({
@@ -1171,6 +1172,7 @@ export default function KeyInfoView({