chatgpt-vision / utils.py
dipta007's picture
added option to append message
8469de9
from PIL import Image
from io import BytesIO
import base64
import time
import streamlit as st
UNIT_COST = {
"user": 0.01,
"assistant": 0.03,
}
# Convert Image to Base64
def im_2_b64(image):
image = Image.open(image)
image.thumbnail((512, 512), Image.Resampling.LANCZOS)
image = image.convert("RGB")
buff = BytesIO()
image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue())
return img_str
def calculate_cost():
def get_text_cost(text, unit_cost):
num_of_words = len(text.split())
tokens = max(1000.0 * num_of_words / 750.0, 0.0)
tokens = tokens / 1000.0
cost = tokens * unit_cost
return cost
def get_image_cost(unit_cost=0.01):
cost = 0.00255 # 512x512 image: https://openai.com/pricing
return cost
messages = st.session_state.messages
total_cost = 0
for message in messages:
role = message["role"]
for content in message["content"]:
if content["type"] == "image_url":
total_cost += get_image_cost(UNIT_COST[role])
else:
total_cost += get_text_cost(content["text"], UNIT_COST[role])
st.session_state.cost.append(total_cost)
def clear_uploader():
st.session_state["uploader_key"] += 1
st.rerun()
def undo():
if len(st.session_state.messages) > 0:
st.query_params.clear()
msg = st.session_state.messages.pop()
if msg["role"] == "assistant":
st.session_state.cost.pop()
time.sleep(0.1)
st.rerun()
def restart():
st.query_params.clear()
st.session_state.messages = []
st.session_state.cost = []
time.sleep(0.2)
clear_uploader()