|
import os |
|
import base64 |
|
from pathlib import Path |
|
import streamlit as st |
|
import requests |
|
from settings import settings |
|
|
|
|
|
BASE_DIR = str(Path(__file__).resolve().parent) |
|
|
|
|
|
|
|
API_URL_CHAT = "http://localhost/api/chatting/chat" |
|
API_URL_EMBEDDING = "http://localhost/api/embeddings/embedded" |
|
API_URL_SUM = "http://localhost/api/chatting/summary" |
|
|
|
st.set_page_config( |
|
page_title="CV_JBDENIS", |
|
page_icon="🧊", |
|
) |
|
|
|
|
|
|
|
|
|
def get_base64_of_bin_file(bin_file): |
|
with open(bin_file, "rb") as f: |
|
data = f.read() |
|
return base64.b64encode(data).decode() |
|
|
|
|
|
def set_png_as_page_bg(png_file) -> None: |
|
bin_str = get_base64_of_bin_file(png_file) |
|
page_bg_img = ( |
|
""" |
|
<style> |
|
.stApp { |
|
background-image: url("data:image/png;base64,%s"); |
|
background-size: cover; |
|
} |
|
</style> |
|
""" |
|
% bin_str |
|
) |
|
st.markdown(page_bg_img, unsafe_allow_html=True) |
|
return |
|
|
|
|
|
|
|
set_png_as_page_bg(png_file=r"app\resources\aide-financiere-ademe.jpg") |
|
|
|
logo_path = r"app\resources\logo_ademe.png" |
|
|
|
col1, col2 = st.columns([3, 2]) |
|
with col1: |
|
st.image(logo_path, width=400) |
|
with col2: |
|
st.title("Dis-ADEME") |
|
st.write("Bienvenue dans votre application de chat.") |
|
|
|
|
|
st.sidebar.title("Menu") |
|
page = st.sidebar.radio("Navigation", ["Accueil", "Admin"]) |
|
|
|
|
|
def save_uploaded_files(uploaded_files: list): |
|
save_dir = BASE_DIR + r"\uploaded_files\user" |
|
|
|
if not os.path.exists(save_dir): |
|
os.makedirs(save_dir) |
|
|
|
saved_file_paths = [] |
|
for uploaded_file in uploaded_files: |
|
file_path = os.path.join(save_dir, uploaded_file.name) |
|
with open(file_path, "wb") as f: |
|
f.write(uploaded_file.getbuffer()) |
|
saved_file_paths.append(file_path) |
|
st.session_state.uploaded_files.append(file_path) |
|
|
|
return saved_file_paths |
|
|
|
|
|
|
|
if page == "Accueil": |
|
if "uploaded_files" not in st.session_state: |
|
st.session_state.uploaded_files = [] |
|
|
|
if "messages" not in st.session_state: |
|
st.session_state.messages = [] |
|
|
|
saved_paths = [] |
|
with st.sidebar: |
|
st.header("Uploader des fichiers PDF") |
|
uploaded_files = st.file_uploader( |
|
"Choisissez des fichiers PDF", |
|
type="pdf", |
|
accept_multiple_files=True, |
|
key="pdf_uploader", |
|
) |
|
|
|
if uploaded_files: |
|
saved_paths = save_uploaded_files(uploaded_files) |
|
st.success(f"Fichiers sauvegardés : {saved_paths[-1]}, en analyse ...") |
|
|
|
if saved_paths: |
|
try: |
|
response = requests.post( |
|
API_URL_EMBEDDING, |
|
json={"doc_paths": saved_paths[-1], "vectorstor_type": "user"}, |
|
) |
|
response.raise_for_status() |
|
embedded = response.json().get( |
|
"message", |
|
"Désolé, une erreur s'est produite durant la lecture du fichier.", |
|
) |
|
|
|
if response: |
|
st.success(f"Analyse du fichiers {saved_paths[-1]} terminée.") |
|
|
|
saved_paths = [] |
|
except requests.RequestException as e: |
|
embedded = f"Erreur lors de la communication avec l'API : {e}" |
|
|
|
if st.session_state.messages: |
|
st.write("") |
|
st.divider() |
|
st.write("") |
|
st.header("Rapport de conversation") |
|
if st.button("Générer le rapport de conversation"): |
|
try: |
|
response = requests.post( |
|
API_URL_SUM, json={"messages": st.session_state.messages} |
|
) |
|
response.raise_for_status() |
|
summary = response.json().get("summary", "Résumé non disponible.") |
|
st.subheader("Résumé généré") |
|
st.text_area("Rapport", summary, height=200) |
|
except requests.exceptions.RequestException as e: |
|
st.error(f"Erreur lors de l'appel de l'API : {e}") |
|
if response: |
|
with open(r"..\Shared_data\export.pdf", "rb") as pdf_file: |
|
|
|
|
|
PDFbyte = pdf_file.read() |
|
|
|
if PDFbyte: |
|
st.download_button( |
|
label="Télécharger le rapport de conversation", |
|
data=PDFbyte, |
|
file_name="Conversation_Dis_ADEME.pdf", |
|
mime="application/octet-stream", |
|
) |
|
|
|
|
|
for message in st.session_state.messages: |
|
with st.chat_message(message["role"], avatar=message["avatar"]): |
|
st.write(message["content"]) |
|
|
|
if prompt := st.chat_input("Comment puis-je vous aider ?"): |
|
st.session_state.messages.append( |
|
{"role": "user", "content": prompt, "avatar": "👤"} |
|
) |
|
with st.chat_message("user", avatar="👤"): |
|
st.write(prompt) |
|
|
|
try: |
|
response = requests.post(API_URL_CHAT, json={"user_query": prompt}) |
|
response.raise_for_status() |
|
data = response.json() |
|
answer = data.get( |
|
"formatted_output", "Désolé, je n'ai pas de réponse à cette question." |
|
) |
|
except requests.RequestException as e: |
|
answer = f"Erreur lors de la communication avec l'API : {e}" |
|
|
|
st.session_state.messages.append( |
|
{"role": "assistant", "content": answer, "avatar": "🤖"} |
|
) |
|
with st.chat_message("assistant", avatar="🤖"): |
|
st.write(answer) |
|
|
|
|
|
elif page == "Admin": |
|
st.title("Admin - Ajouter des documents à la base de données") |
|
|
|
doc_path = st.text_input("Entrez le chemin du document ou du dossier à ajouter") |
|
|
|
if st.button("Ajouter les documents PDF à la base de données"): |
|
if doc_path: |
|
print("SAVED DOC:", doc_path) |
|
try: |
|
response = requests.post( |
|
API_URL_EMBEDDING, |
|
json={"doc_paths": doc_path, "vectorstor_type": "doc"}, |
|
) |
|
response.raise_for_status() |
|
st.success("Documents ajoutés à la base de données avec succès.") |
|
except requests.RequestException as e: |
|
st.error(f"Erreur lors de l'ajout des documents : {e}") |
|
else: |
|
st.warning("Veuillez entrer un chemin valide.") |
|
|