| import os |
| from groq import Groq |
| from dotenv import load_dotenv |
|
|
| load_dotenv() |
|
|
|
|
| client = Groq(api_key=os.getenv("GROQ_API_KEY")) |
|
|
| MODEL = "llama-3.3-70b-versatile" |
|
|
|
|
| SYSTEM_PROMPT = """ |
| You are a helpful receipt analysis assistant. |
| The user will give you structured data extracted from a receipt image, |
| along with a question about it. |
| |
| Your job: |
| - Answer the question clearly and concisely |
| - Use the receipt data provided — do not make up values |
| - Format currency values clearly |
| - If the data doesn't contain enough information to answer, say so |
| |
| Keep answers short and direct. No unnecessary explanation. |
| """ |
|
|
|
|
|
|
| def ask_about_receipt(receipt_json: dict, user_question: str) -> str: |
| receipt_text = format_receipt_for_llm(receipt_json) |
|
|
| messages = [ |
| { |
| "role" : "system", |
| "content": SYSTEM_PROMPT |
| }, |
| { |
| "role" : "user", |
| "content": f""" |
| Here is the receipt data: |
| |
| {receipt_text} |
| |
| Question: {user_question} |
| """ |
| } |
| ] |
|
|
| response = client.chat.completions.create( |
| model = MODEL, |
| messages = messages, |
| temperature= 0.2, |
| max_tokens = 512 |
| ) |
|
|
| return response.choices[0].message.content.strip() |
|
|
|
|
|
|
| def format_receipt_for_llm(receipt_json: dict) -> str: |
| lines = [] |
| lines.append(f"Vendor : {receipt_json.get('vendor', 'unknown')}") |
| lines.append("Items :") |
|
|
| for item in receipt_json.get("items", []): |
| name = item.get("name", "") |
| count = item.get("count", "") |
| price = item.get("price", "") |
| lines.append(f" - {name:<25} {count:<6} {price}") |
|
|
| lines.append(f"Subtotal : {receipt_json.get('subtotal', 'N/A')}") |
| lines.append(f"Tax : {receipt_json.get('tax', 'N/A')}") |
| lines.append(f"Service : {receipt_json.get('service', 'N/A')}") |
| lines.append(f"Total : {receipt_json.get('total', 'N/A')}") |
|
|
| return "\n".join(lines) |
|
|
|
|
| sample_receipt = { |
| "vendor" : "unknown", |
| "items" : [ |
| {"name": "Nasi Campur Bali", "count": "1 x", "price": "75,000"}, |
| {"name": "Ice Lemon Tea", "count": "1 x", "price": "24,000"}, |
| {"name": "MilkShake Strawb", "count": "1 x", "price": "37,000"}, |
| {"name": "Hot Tea", "count": "2 x", "price": "44,000"}, |
| ], |
| "subtotal": "1,346,000", |
| "tax" : "144,695", |
| "service" : "100,950", |
| "total" : "1,591,600" |
| } |
|
|
| questions = [ |
| "What is the total amount?", |
| "How much did I spend on drinks?", |
| "How many items were ordered?", |
| "What percentage of the total is tax?" |
| ] |
|
|
| for q in questions: |
| print(f"\nQ: {q}") |
| print(f"A: {ask_about_receipt(sample_receipt, q)}") |