from openai import OpenAI import streamlit as st from src.utils import image_path_to_uri st.title("ChatGPT-like clone") client = OpenAI(api_key=st.secrets["OPENAI_API_KEY"]) image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"]) if "openai_model" not in st.session_state: st.session_state["openai_model"] = "gpt-4o" if "messages" not in st.session_state: st.session_state.messages = [] if "image" not in st.session_state: st.session_state.image = None for message in st.session_state.messages: with st.chat_message(message["role"]): for content in message["content"]: if content["type"] == "text": st.markdown(content["text"]) elif content["type"] == "image_url": st.image(content["image_url"]["url"]) if prompt := st.chat_input("What is up?"): # Add image to the message if it exists if image is not None: st.session_state.image = image if st.session_state.image: image_url = image_path_to_uri(st.session_state.image) st.session_state.messages.append({"role": "user", "content": [ {"type": "text", "text": prompt}, {"type": "image_url", "image_url": {"url": image_url}} ]}) else: st.session_state.messages.append({"role": "user", "content": [ {"type": "text", "text": prompt} ]}) with st.chat_message("user"): if st.session_state.image: st.image(st.session_state.image) st.markdown(prompt) with st.chat_message("assistant"): stream = client.chat.completions.create( model=st.session_state["openai_model"], messages=[ {"role": m["role"], "content": m["content"]} for m in st.session_state.messages ], stream=True, ) response = st.write_stream(stream) st.session_state.messages.append({"role": "assistant", "content": [ {"type": "text", "text": response} ]})