import os
import requests
from dotenv import load_dotenv
import streamlit as st
load_dotenv()
DEPLOY_URL = os.getenv("DEPLOY_API_URL")
LOCAL_URL = os.getenv("LOCAL_API_URL")
API_URL = DEPLOY_URL or LOCAL_URL
def get_docs():
if "docs" not in st.session_state:
with st.spinner("Fetching available docs..."):
response = requests.get(f"{API_URL}/get_tables", timeout=10)
response.raise_for_status()
data = response.json()
tables = data.get("tables")
st.session_state.docs = tables
def render_sidebar():
if "docs" in st.session_state:
with st.sidebar:
st.markdown(
"""
📚 PyDocs AI
""",
unsafe_allow_html=True,
)
option = st.selectbox(
label=" ",
label_visibility="collapsed",
placeholder="Documentation",
index=None,
options=st.session_state.get("docs", None),
)
if st.button("New Chat"):
st.session_state.messages = []
return option
def fetch_response(prompt, option, context):
with requests.post(
f"{API_URL}/query",
timeout=50,
json={"prompt": prompt, "doc_name": option, "context": context},
stream=True,
) as response:
response.raise_for_status()
for chunk in response.iter_content(chunk_size=None):
if chunk:
text = chunk.decode("utf-8")
yield text
def render_chat_ui(option):
if "messages" not in st.session_state:
with st.chat_message("assistant"):
st.write(
"Hello! I'am your python libraries AI assistant. Please first :blue[**select a documentation**] from the sidebar dropdown, and then ask me anything from :blue[**that documentation**]."
)
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
if message["role"] == "user":
st.write(message["content"])
else:
st.write(message["content"])
if prompt := st.chat_input("Ask question:"):
if not option:
st.error("Please select documentation")
return
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)
with st.chat_message("assistant"):
with st.spinner("Generating response...", show_time=True):
stream = fetch_response(prompt, option, st.session_state.messages)
response_text = str(st.write_stream(stream, cursor="|"))
st.session_state.messages.append(
{"role": "assistant", "content": response_text}
)