From 79bffe1a06cb22f7a4d230036360be9d67915650 Mon Sep 17 00:00:00 2001 From: Yucheng Zhu Date: Mon, 31 Aug 2026 18:00:16 -0700 Subject: [PATCH] fix: mark dotted-path callbacks read-only to prevent duplicate display Configured callbacks loaded from dotted Python paths (e.g. custom_callbacks.my_logger) are never matched against runtime instances by name because the registry uses short canonical names (e.g. langsmith, arize). Mark these rows read-only to prevent the UI from attempting delete operations that would fail at the endpoint level anyway. --- litellm/proxy/proxy_server.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 41e9cc10572..b5ecf36c813 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -17113,13 +17113,22 @@ async def get_config( """ for _callback in _success_callbacks: - _data_to_return.append(process_callback(_callback, "success", environment_variables)) + row: Final = process_callback(_callback, "success", environment_variables) + if isinstance(_callback, str) and "." in _callback: + row["read_only"] = True + _data_to_return.append(row) for _callback in _failure_callbacks: - _data_to_return.append(process_callback(_callback, "failure", environment_variables)) + row: Final = process_callback(_callback, "failure", environment_variables) + if isinstance(_callback, str) and "." in _callback: + row["read_only"] = True + _data_to_return.append(row) for _callback in _success_and_failure_callbacks: - _data_to_return.append(process_callback(_callback, "success_and_failure", environment_variables)) + row: Final = process_callback(_callback, "success_and_failure", environment_variables) + if isinstance(_callback, str) and "." in _callback: + row["read_only"] = True + _data_to_return.append(row) configured_callback_names: Final = frozenset( _normalize_callback_alias(callback)