|
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) |
|
|
|
|
|
session = requests.Session() |
|
session.headers = { |
|
"Host": "bard.google.com", |
|
"X-Same-Domain": "1", |
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", |
|
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", |
|
"Origin": "https://bard.google.com", |
|
"Referer": "https://bard.google.com/", |
|
} |
|
session.cookies.set("__Secure-1PSID", os.getenv("_BARD_API_KEY")) |
|
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.") |
|
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, session=session, timeout=30) |
|
|
|
TITLE = "Palm 2π΄ Chatbot" |
|
DESCRIPTION = """ |
|
""" |
|
|
|
|
|
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']) |
|
|
|
if response['code']: |
|
if exportToReplIt: |
|
with st.status("Exporting replit..."): |
|
fale = False |
|
try: |
|
url = bard.export_replit(code=response['code'],program_lang=response['program_lang'])['url'] |
|
except error: |
|
fale=True |
|
st.write('ERROR') |
|
if not fale: |
|
st.title('Export to repl.it') |
|
st.markdown(f'[link]({url})') |
|
if code_interpreter: |
|
try: |
|
exec(response['code']) |
|
except Exception as e: |
|
st.write(f"ERROR {e}...") |
|
|
|
st.session_state.messages.append({"role": "assistant", "content": response['content']}) |
|
|