image_test / app.py
tysonsoni's picture
Update app.py
8615d33 verified
raw
history blame
5.52 kB
import gradio as gr
import json
import io
import base64
import requests
from openai import OpenAI
import pandas as pd
import smtplib
import ssl
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os
def process_images(image_list, app_password_input, progress=gr.Progress()):
app_password = os.getenv('app_password')
if app_password_input == app_password:
progress(0, desc="Starting")
counter = 1
with open('output_columns.json') as f:
output_columns = json.load(f)
out_df = pd.DataFrame(columns=output_columns)
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
email = os.getenv('email')
email_password = os.getenv('email_password')
for image in progress.tqdm(image_list):
try:
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
image_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8")
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
}
payload = {
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": """
Wie lautet der Unternehmensname, der Gesamtbetrag und das Datum in der folgenden Rechnung?
Das Datum soll das Format TTMM haben.
Der Gesamtbetrag soll ein Komma zur Abtrennung von Euro und Cent haben.
Gebe mir die Antwort in folgender Struktur:
{
"Unternehmensname" : 'String',
"Gesamtbetrag" : 'String',
"Datum" : 'String'
}
"""
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}"
# "url": image_base64
}
}
]
}
],
"max_tokens": 300
}
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
resp = json.loads(response.json()['choices'][0]['message']['content'])
booking = {
"Umsatz (ohne Soll/Haben-Kz)": resp["Gesamtbetrag"],
"Soll/Haben-Kennzeichen": "H",
"Konto": 1371,
"Gegenkonto (ohne BU-Schlüssel)": 3300,
"Belegdatum": resp["Datum"],
"Belegfeld 1": counter,
"Buchungstext": resp["Unternehmensname"],
"Festschreibung": 0
}
except:
booking = {
"Umsatz (ohne Soll/Haben-Kz)": "1,00",
"Soll/Haben-Kennzeichen": "H",
"Konto": 1371,
"Gegenkonto (ohne BU-Schlüssel)": 3300,
"Belegdatum": 101,
"Belegfeld 1": counter,
"Buchungstext":"???",
"Festschreibung": 0
}
booking_df = pd.DataFrame(booking, index=[0])
out_df = pd.concat([out_df, booking_df])
counter = counter + 1
subject = "Sending Datev ASCII file"
body = "Sending Datev ASCII file"
sender_email = email
receiver_email = email
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message.attach(MIMEText(body, "plain"))
buffer = io.StringIO()
out_df.to_csv(buffer, index=False)
buffer.seek(0)
part = MIMEBase("application", "octet-stream")
part.set_payload(buffer.getvalue())
encoders.encode_base64(part)
part.add_header(
"Content-Disposition",
"attachment; filename= Datev_ASCII_file.csv",
)
message.attach(part)
text = message.as_string()
# context = ssl.create_default_context()
# with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, email_password)
server.sendmail(sender_email, receiver_email, text)
return out_df
return "wrong password"
with gr.Blocks() as demo:
app_password = gr.Textbox(label="Enter app password")
images = gr.State([])
image_input = gr.Image(label="Upload Images", type="pil")
save_image = gr.Button("Save Image")
num_images = gr.Number(value=0, label="Number images", interactive=False)
save_image.click(lambda i,l,n:(l+[i],n+1), inputs=[image_input, images, num_images], outputs=[images, num_images])
submit = gr.Button("Send to OpenAI and email")
output = gr.Textbox()
submit.click(process_images, inputs=[images, app_password], outputs=output)
demo.launch()