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()