|
import streamlit as st |
|
import json |
|
import os |
|
import requests |
|
from bardapi import Bard |
|
|
|
|
|
with open("lang.json", "r") as file: |
|
GOOGLE_LANGUAGES_TO_CODES = json.load(file) |
|
|
|
with st.sidebar: |
|
|
|
selected_language_name = st.sidebar.selectbox("Select Language", list(GOOGLE_LANGUAGES_TO_CODES.keys())) |
|
code_interpreter = st.sidebar.toggle("Code Interpreter", value=True) |
|
system_prompt = st.sidebar.text_input("System prompt for code interpreter", value = "Rule 1: If a user requests a code snippet, provide only one that can run in a Streamlit app without requiring additional libraries. Don't use any type of inputs in streamlit app.") |
|
useSystemPrompt = st.sidebar.toggle("Use System prompt", value=True) |
|
exportToReplIt = st.sidebar.toggle("Export to repl.it", value=False) |
|
showImages = st.sidebar.toggle("Show images", value=True) |
|
|
|
|
|
selected_language_code = GOOGLE_LANGUAGES_TO_CODES[selected_language_name] |
|
|
|
|
|
bard = Bard(token=os.getenv("_BARD_API_KEY"), language=selected_language_code) |
|
|
|
TITLE = "Palm 2π΄ Chatbot" |
|
DESCRIPTION = """ |
|
Welcome to Palm 2π΄ Chatbot! Choose your language, interpret code, prompt the chatbot, export code to repl.it, and display images. |
|
""" |
|
|
|
|
|
|
|
st.title(TITLE) |
|
st.write(DESCRIPTION) |
|
|
|
|
|
def predict(message): |
|
with st.status("Requesting Palm-2π΄..."): |
|
st.write("Requesting API...") |
|
response = bard.get_answer(message if not (code_interpreter and useSystemPrompt) else message + " . "+system_prompt) |
|
st.write("Done...") |
|
|
|
st.write("Checking images...") |
|
if 'images' in response.keys() and showImages: |
|
for i in response['images']: |
|
st.image(i) |
|
|
|
return response |
|
|
|
|
|
if "messages" not in st.session_state: |
|
st.session_state.messages = [] |
|
|
|
for message in st.session_state.messages: |
|
with st.chat_message(message["role"], avatar=("π§βπ»" if message["role"] == 'human' else 'π΄')): |
|
st.markdown(message["content"]) |
|
|
|
|
|
if prompt := st.chat_input("Ask Palm 2 anything..."): |
|
st.chat_message("human", avatar="π§βπ»").markdown(prompt) |
|
st.session_state.messages.append({"role": "human", "content": prompt}) |
|
|
|
response = predict(prompt) |
|
with st.chat_message("assistant", avatar='π΄'): |
|
st.markdown(response['content']) |
|
|
|
MAX_ATTEMPTS = 3 |
|
|
|
if response['code']: |
|
if exportToReplIt: |
|
with st.status("Exporting replit..."): |
|
fail = False |
|
try: |
|
url = bard.export_replit(code=response['code'], program_lang=response['program_lang'])['url'] |
|
except Exception as error: |
|
fail = True |
|
st.write('ERROR exporting to repl.it') |
|
if not fail: |
|
st.title('Export to repl.it') |
|
st.markdown(f'[link]({url})') |
|
|
|
if code_interpreter: |
|
current_attempt = 0 |
|
current_code = response['code'] |
|
while current_attempt < MAX_ATTEMPTS: |
|
try: |
|
exec(current_code) |
|
st.success('Code run succesfully!', icon="β
") |
|
break |
|
except Exception as e: |
|
|
|
st.error("Error running code...") |
|
new_prompt = f"{prompt} . There was an error executing the code: {e}. The last code you provided was: ```{current_code}```. Can you provide a corrected version?" |
|
new_response = predict(new_prompt) |
|
|
|
with st.chat_message("assistant", avatar='π΄'): |
|
st.markdown(new_response['content']) |
|
|
|
current_code = new_response['code'] |
|
current_attempt += 1 |
|
|
|
if current_attempt == MAX_ATTEMPTS: |
|
st.warning("Reached maximum attempts. Unable to execute the code successfully.") |
|
|
|
st.session_state.messages.append({"role": "assistant", "content": response['content']}) |
|
|