| import base64 | |
| import io | |
| import re | |
| import pytesseract | |
| from PIL import Image | |
| from pdf2image import convert_from_bytes | |
| def transform_messages_to_openai(messages: list, user_query: str) -> list[dict]: | |
| openai_messages = [] | |
| for message in messages: | |
| content = message.text | |
| openai_messages.append({ | |
| "role": message.author.value, | |
| "content": content | |
| }) | |
| openai_messages.append({"role": "user", "content": user_query}) | |
| return openai_messages | |
| def divide_images(contents: bytes) -> list[bytes]: | |
| images = convert_from_bytes(contents, dpi=250) | |
| image_bytes_list = [] | |
| for image in images: | |
| img_byte_array = io.BytesIO() | |
| image.save(img_byte_array, format='PNG') | |
| img_byte_array.seek(0) | |
| image_bytes_list.append(img_byte_array.read()) | |
| return image_bytes_list | |
| def extract_text_from_images(images: list[bytes]) -> str: | |
| extracted_texts = [] | |
| for image_bytes in images: | |
| image = Image.open(io.BytesIO(image_bytes)) | |
| text = pytesseract.image_to_string(image) | |
| extracted_texts.append(text) | |
| return '\n'.join(extracted_texts) | |
| def clean_response(text: str) -> str: | |
| try: | |
| text = re.search(r'```markdown\s*(.*?)\s*```', text, re.DOTALL).group(1) | |
| except Exception as e: | |
| pass | |
| return text | |
| def prepare_request_content(images: list[bytes]): | |
| content = [ | |
| {"type": "text", "text": "Generate a report on the attached document"}, | |
| *[ | |
| { | |
| "type": "image_url", | |
| "image_url": { | |
| "url": f"data:image/jpeg;base64,{base64.b64encode(image).decode('utf-8')}", | |
| }, | |
| } | |
| for image in images | |
| ] | |
| ] | |
| return content |