feat: add new examples from pocketflow-academy

This commit is contained in:
Alan ALves
2025-03-19 10:31:04 -03:00
parent 84720ceebd
commit 557a14f695
129 changed files with 13455 additions and 0 deletions
@@ -0,0 +1,52 @@
import fitz # PyMuPDF
from PIL import Image
import io
import base64
from typing import List, Tuple
def pdf_to_images(pdf_path: str, max_size: int = 2000) -> List[Tuple[Image.Image, int]]:
"""Convert PDF pages to PIL Images with size limit
Args:
pdf_path (str): Path to PDF file
max_size (int): Maximum dimension (width/height) for images
Returns:
list: List of tuples (PIL Image, page number)
"""
doc = fitz.open(pdf_path)
images = []
try:
for page_num in range(len(doc)):
page = doc[page_num]
pix = page.get_pixmap()
# Convert to PIL Image
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
# Resize if needed while maintaining aspect ratio
if max(img.size) > max_size:
ratio = max_size / max(img.size)
new_size = tuple(int(dim * ratio) for dim in img.size)
img = img.resize(new_size, Image.Resampling.LANCZOS)
images.append((img, page_num + 1))
finally:
doc.close()
return images
def image_to_base64(image: Image.Image) -> str:
"""Convert PIL Image to base64 string
Args:
image (PIL.Image): Image to convert
Returns:
str: Base64 encoded image string
"""
buffer = io.BytesIO()
image.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode('utf-8')
@@ -0,0 +1,40 @@
from PIL import Image
from utils.call_llm import client
from tools.pdf import image_to_base64
def extract_text_from_image(image: Image.Image, prompt: str = None) -> str:
"""Extract text from image using OpenAI Vision API
Args:
image (PIL.Image): Image to process
prompt (str, optional): Custom prompt for extraction. Defaults to general OCR.
Returns:
str: Extracted text from image
"""
# Convert image to base64
img_base64 = image_to_base64(image)
# Default prompt for general OCR
if prompt is None:
prompt = "Please extract all text from this image."
# Call Vision API
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_base64}"}}
]
}]
)
return response.choices[0].message.content
if __name__ == "__main__":
# Test vision processing
test_image = Image.open("example.png")
result = extract_text_from_image(test_image)
print("Extracted text:", result)