97e91a83f3
Ruff / Ruff (push) Has been cancelled
Test / Core Tests (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.10) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.11) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.12) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.13) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.9) (push) Has been cancelled
Test / Full Coverage (Python 3.11) (push) Has been cancelled
Test / Core Provider Tests (OpenAI) (push) Has been cancelled
Test / Core Provider Tests (Anthropic) (push) Has been cancelled
Test / Core Provider Tests (Google) (push) Has been cancelled
Test / Core Provider Tests (Other) (push) Has been cancelled
Test / Anthropic Tests (push) Has been cancelled
Test / Gemini Tests (push) Has been cancelled
Test / Google GenAI Tests (push) Has been cancelled
Test / Vertex AI Tests (push) Has been cancelled
Test / OpenAI Tests (push) Has been cancelled
Test / Writer Tests (push) Has been cancelled
Test / Auto Client Tests (push) Has been cancelled
ty / type-check (push) Has been cancelled
66 lines
1.7 KiB
Python
Executable File
66 lines
1.7 KiB
Python
Executable File
from pydantic import BaseModel, model_validator
|
|
from openai import OpenAI
|
|
import instructor
|
|
|
|
|
|
client = instructor.from_openai(
|
|
client=OpenAI(),
|
|
mode=instructor.Mode.TOOLS,
|
|
)
|
|
|
|
|
|
class Item(BaseModel):
|
|
name: str
|
|
price: float
|
|
quantity: int
|
|
|
|
|
|
class Receipt(BaseModel):
|
|
items: list[Item]
|
|
total: float
|
|
|
|
@model_validator(mode="after")
|
|
def check_total(cls, values: "Receipt"):
|
|
items = values.items
|
|
total = values.total
|
|
calculated_total = sum(item.price * item.quantity for item in items)
|
|
if calculated_total != total:
|
|
raise ValueError(
|
|
f"Total {total} does not match the sum of item prices {calculated_total}"
|
|
)
|
|
return values
|
|
|
|
|
|
def extract(url: str) -> Receipt:
|
|
return client.chat.completions.create(
|
|
model="gpt-4o",
|
|
max_tokens=4000,
|
|
response_model=Receipt,
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {"url": url},
|
|
},
|
|
{
|
|
"type": "text",
|
|
"text": "Analyze the image and return the items in the receipt and the total amount.",
|
|
},
|
|
],
|
|
}
|
|
],
|
|
)
|
|
|
|
|
|
# URLs of images containing receipts. Exhibits the use of the model validator to check the total amount.
|
|
urls = [
|
|
"https://templates.mediamodifier.com/645124ff36ed2f5227cbf871/supermarket-receipt-template.jpg",
|
|
"https://ocr.space/Content/Images/receipt-ocr-original.jpg",
|
|
]
|
|
|
|
for url in urls:
|
|
receipt = extract(url)
|
|
print(receipt)
|