import streamlit as st
from dotenv import load_dotenv
import os
import time
from csv_handler import load_csvs_from_folder, build_metadata2, mount_nfe
from vector_store import build_vector_index, query_vector_index
from agent import CsvAgent
from utils import t as translation, extract_archive, save_to_temp
from actions import get_max_item_info, get_max_head_info
load_dotenv()
USE_OPENAI = os.getenv("USE_OPENAI", "false").lower() in ("1", "true", "yes")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
CHROMA_KEY = os.getenv("CHROMA_K", 5)
MODEL = os.getenv("OPENAI_MODEL", "gpt-4.1-nano")
TEMPERATURE = float(os.getenv("OPENAI_TEMPERATURE", 0.1))
def t(key):
lang = "pt" if not st.session_state.get("lang", False) else "en"
try:
return translation(key, lang)
except Exception:
return key
st.write(t("language"))
lang_label = "🇧🇷 Português" if not st.session_state.get("lang", False) else "🇺🇸 English"
st.toggle(lang_label, key="lang", value=st.session_state.get("lang", False))
st.title(t("title"))
if not USE_OPENAI:
st.markdown(
"
"
"Demo mode is not activated, please request the activation."
"
",
unsafe_allow_html=True,
)
st.stop()
uploaded = st.session_state.get("uploaded", False)
raw = "ERROR"
if not uploaded:
uploaded = st.file_uploader(
t("upload_label"), type=["zip", "tar", "tar.gz"], disabled=uploaded
)
if uploaded and (
"csv_data" not in st.session_state
or "csv_meta" not in st.session_state
or "vectordb" not in st.session_state
or "agent" not in st.session_state
):
filepath = save_to_temp(uploaded)
csv_folder = extract_archive(filepath)
raw = load_csvs_from_folder(csv_folder)
if raw != "ERROR":
with st.spinner(t("loading_embeddings")):
st.session_state.csv_data = mount_nfe(raw)
st.session_state.csv_meta = build_metadata2(st.session_state.csv_data)
st.session_state.vectordb = build_vector_index(st.session_state.csv_data)
st.session_state.agent = CsvAgent(OPENAI_API_KEY, MODEL, TEMPERATURE)
if "history" not in st.session_state:
st.session_state.history = []
for msg in st.session_state.history:
st.chat_message(msg["role"]).write(msg["content"])
if uploaded and "csv_data" in st.session_state and "vectordb" in st.session_state:
st.write(t("common"))
col1, col2 = st.columns(2)
if col1.button(t("common_question_quantity")):
user_query = t("common_question_quantity")
elif col2.button(t("common_question_supplier")):
user_query = t("common_question_supplier")
else:
user_query = None
if not user_query:
user_query = st.chat_input(t("input_label"))
else:
user_query = None
if user_query and uploaded:
st.session_state.history.append({"role": "user", "content": user_query})
ql = user_query.lower()
if t("quantity") in ql:
info = get_max_item_info(st.session_state.csv_data)
reply = (
st.session_state.agent.format_summary(info, lang_label, query=user_query)
if info
else t("error_no_item_found")
)
elif t("amount") in ql:
info = get_max_head_info(st.session_state.csv_data)
reply = (
st.session_state.agent.format_summary(info, lang_label, query=user_query)
if info
else t("error_no_supplier_found")
)
else:
docs = query_vector_index(
st.session_state.vectordb, user_query, k=int(CHROMA_KEY)
)
print(f"Found {len(docs)} relevant documents.")
reply = (
st.session_state.agent.ask(
user_query,
docs,
st.session_state.csv_meta,
)
if st.session_state.csv_meta != "ERROR"
else t("error_csv")
)
assistant_msg = {"role": "assistant", "content": ""}
st.session_state.history.append(assistant_msg)
placeholder = st.empty()
display = ""
for c in reply:
display += c
placeholder.markdown(display + "▌")
assistant_msg["content"] = display
time.sleep(0.02)
placeholder.markdown(display)
assistant_msg["content"] = display
st.rerun()
st.markdown("---")
if len(st.session_state.history) > 0:
if st.button(t("clear_history")):
st.session_state.history = []
st.rerun()