mirror of
https://github.com/tiennm99/litellm.git
synced 2026-08-24 00:28:32 +00:00
[Bug fix] [Bug]: Verbose log is enabled by default (#12596)
* test find_set_verbose_assignments * fix set verbose * test set verbose * fix unused import
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
import ast
|
||||
import os
|
||||
|
||||
|
||||
def find_set_verbose_assignments(file_path):
|
||||
"""
|
||||
Finds all assignments of litellm.set_verbose = True in a given Python file.
|
||||
Returns a list of tuples (line_number, assignment_text).
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
content = file.read()
|
||||
tree = ast.parse(content)
|
||||
except (SyntaxError, UnicodeDecodeError) as e:
|
||||
print(f"Warning: Error parsing file {file_path}: {e}")
|
||||
return []
|
||||
|
||||
assignments = []
|
||||
content_lines = content.splitlines()
|
||||
|
||||
for node in ast.walk(tree):
|
||||
if isinstance(node, ast.Assign):
|
||||
# Check if this is an assignment to litellm.set_verbose
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Attribute):
|
||||
# Check if it's litellm.set_verbose
|
||||
if (isinstance(target.value, ast.Name) and
|
||||
target.value.id == "litellm" and
|
||||
target.attr == "set_verbose"):
|
||||
|
||||
# Check if the value being assigned is True
|
||||
if (isinstance(node.value, ast.Constant) and
|
||||
node.value.value is True):
|
||||
line_num = node.lineno
|
||||
line_text = content_lines[line_num - 1].strip() if line_num <= len(content_lines) else ""
|
||||
assignments.append((line_num, line_text))
|
||||
elif (isinstance(node.value, ast.NameConstant) and
|
||||
node.value.value is True): # For older Python versions
|
||||
line_num = node.lineno
|
||||
line_text = content_lines[line_num - 1].strip() if line_num <= len(content_lines) else ""
|
||||
assignments.append((line_num, line_text))
|
||||
|
||||
return assignments
|
||||
|
||||
|
||||
def scan_litellm_files(base_dir):
|
||||
"""
|
||||
Scans all Python files in the litellm directory for set_verbose assignments.
|
||||
Returns a dictionary mapping file paths to lists of assignments.
|
||||
"""
|
||||
violations = {}
|
||||
litellm_dirs = [
|
||||
"litellm",
|
||||
"enterprise"
|
||||
]
|
||||
|
||||
for litellm_dir in litellm_dirs:
|
||||
dir_path = os.path.join(base_dir, litellm_dir)
|
||||
if not os.path.exists(dir_path):
|
||||
print(f"Warning: Directory {dir_path} does not exist.")
|
||||
continue
|
||||
|
||||
print(f"Scanning directory: {dir_path}")
|
||||
for root, _, files in os.walk(dir_path):
|
||||
for file in files:
|
||||
if file.endswith(".py"):
|
||||
file_path = os.path.join(root, file)
|
||||
relative_path = os.path.relpath(file_path, base_dir)
|
||||
|
||||
assignments = find_set_verbose_assignments(file_path)
|
||||
if assignments:
|
||||
violations[relative_path] = assignments
|
||||
|
||||
return violations
|
||||
|
||||
|
||||
def test_no_hardcoded_set_verbose():
|
||||
"""
|
||||
Pytest-compatible test function that ensures no hardcoded litellm.set_verbose = True assignments exist.
|
||||
"""
|
||||
base_dir = "./" # Adjust path as needed for your setup
|
||||
|
||||
violations = scan_litellm_files(base_dir)
|
||||
|
||||
if violations:
|
||||
violation_details = []
|
||||
total_violations = 0
|
||||
for file_path, assignments in violations.items():
|
||||
for line_num, line_text in assignments:
|
||||
violation_details.append(f"{file_path}:{line_num} -> {line_text}")
|
||||
total_violations += 1
|
||||
|
||||
error_msg = (
|
||||
f"Found {total_violations} prohibited litellm.set_verbose = True assignments:\n"
|
||||
+ "\n".join(violation_details) +
|
||||
"\n\nREASON: litellm.set_verbose = True should not be hardcoded in production code. "
|
||||
"Instead, use environment variables or configuration files to control verbosity."
|
||||
)
|
||||
|
||||
raise AssertionError(error_msg)
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function that scans for litellm.set_verbose = True assignments and fails if any are found.
|
||||
"""
|
||||
base_dir = "./" # Adjust path as needed for your setup
|
||||
|
||||
print("Scanning for litellm.set_verbose = True assignments...")
|
||||
violations = scan_litellm_files(base_dir)
|
||||
|
||||
if violations:
|
||||
print("\n❌ FOUND PROHIBITED litellm.set_verbose = True ASSIGNMENTS:")
|
||||
print("=" * 60)
|
||||
|
||||
total_violations = 0
|
||||
for file_path, assignments in violations.items():
|
||||
print(f"\nFile: {file_path}")
|
||||
for line_num, line_text in assignments:
|
||||
print(f" Line {line_num}: {line_text}")
|
||||
total_violations += 1
|
||||
|
||||
print(f"\n📊 Total violations found: {total_violations}")
|
||||
print("\n🚫 REASON: litellm.set_verbose = True should not be hardcoded in production code.")
|
||||
print(" Instead, use environment variables or configuration files to control verbosity.")
|
||||
print(" Example alternatives:")
|
||||
print(" - Use LITELLM_LOG=DEBUG environment variable")
|
||||
print(" - Use litellm.set_verbose = os.getenv('LITELLM_VERBOSE', 'false').lower() == 'true'")
|
||||
print(" - Use configuration-based verbosity settings")
|
||||
|
||||
raise Exception(
|
||||
f"Found {total_violations} prohibited litellm.set_verbose = True assignments. "
|
||||
"Remove these hardcoded verbosity settings and use configuration-based approaches instead."
|
||||
)
|
||||
else:
|
||||
print("✅ No prohibited litellm.set_verbose = True assignments found.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user