import copy import json from typing import List from openai.types.chat import ChatCompletionMessageParam import base64 def pprint_prompt(prompt_messages: List[ChatCompletionMessageParam]): print(json.dumps(truncate_data_strings(prompt_messages), indent=4)) def truncate_data_strings(data: List[ChatCompletionMessageParam]): # type: ignore # Deep clone the data to avoid modifying the original object cloned_data = copy.deepcopy(data) if isinstance(cloned_data, dict): for key, value in cloned_data.items(): # type: ignore # Recursively call the function if the value is a dictionary or a list if isinstance(value, (dict, list)): cloned_data[key] = truncate_data_strings(value) # type: ignore # Truncate the string if it it's long and add ellipsis and length elif isinstance(value, str): cloned_data[key] = value[:40] # type: ignore if len(value) > 40: cloned_data[key] += "..." + f" ({len(value)} chars)" # type: ignore elif isinstance(cloned_data, list): # type: ignore # Process each item in the list cloned_data = [truncate_data_strings(item) for item in cloned_data] # type: ignore return cloned_data # type: ignore def make_json_serializable(content): if isinstance(content, bytes): return base64.b64encode(content).decode('utf-8') elif isinstance(content, dict): return {key: make_json_serializable(value) for key, value in content.items()} elif isinstance(content, list): return [make_json_serializable(item) for item in content] return content