in components/frontend_streamlit/src/pages/5_Query_Engines.py [0:0]
def query_engine_page():
# Get all vector stores as a list
vector_store_list = get_all_vector_stores()
# Prepare table values
reload()
st.title("Query Engine Management")
if st.button("Refresh"):
reload()
tab_qe, tab_jobs, tab_create_qe = st.tabs([
"Query Engines",
"Job List",
"Build Query Engine",
])
with tab_qe:
st.subheader("Query Engines")
if not qe_list:
logging.error("No query engines found.")
st.write("No query engines found.")
for qe in qe_list:
data = [[key, value] for key, value in qe.items()]
summary = f"{qe['llm_type']}, {qe['embedding_type']}, " \
f"{qe['vector_store']}"
url_list = get_all_docs_of_query_engine(qe["id"])
with st.expander(f"**{qe['name']}** - {summary}"):
tab_detail, tab_urls = st.tabs([
"Query Engine Detail", f"URLs ({len(url_list)})"])
with tab_detail:
st.table(data)
with st.form(qe["name"]):
description = st.text_area("Description", qe["description"])
submit = st.form_submit_button("Update")
if submit:
submit_update(qe["id"], qe["name"], description)
delete = st.button("Delete", key=f"delete_{qe['name']}")
if delete:
delete_query_engine(qe["id"])
reload()
with tab_urls:
st.write(f"{len(url_list)} URLs")
for url in url_list:
st.write(f"- [{url}]({url})")
with tab_jobs:
st.subheader("Query Engine Jobs")
if not qe_build_jobs:
logging.error("No query engine build jobs")
st.write("No query engine build jobs")
for job in qe_build_jobs:
created_at = moment.date(
job["created_time"]).format("YYYY-M-D h:m A")
summary_data = [
["Job ID", job["id"]],
["Status", job["status"]],
["Created at", created_at],
["Errors", job.get("errors", {}).get("error_message", "")]
]
input_data = job["input_data"]
data = [[key, value] for key, value in input_data.items()]
query_engine = input_data["query_engine"].strip()
status = job["status"]
icon = "🔄"
if status == "succeeded":
icon = "✅"
elif status == "failed":
icon = "❌"
with st.expander(
f"**{icon} [{job['status']}]** QE: {query_engine} - " \
f"Job created at {created_at}"):
# FIXME: Add this to the backend data model.
job_url = "https://console.cloud.google.com/kubernetes/job/" \
f"us-central1/main-cluster/default/{job['id']}/details" \
f"?project={PROJECT_ID}"
st.write(f"[Link to Kubernetes Job]({job_url})")
st.table(summary_data + data)
if status != "succeeded":
submit = st.button(
"Re-run this job", key=f"rerun-job-{job['id']}", type="secondary")
if submit:
submit_build(
input_data["query_engine"],
input_data["query_engine_type"],
input_data["doc_url"],
input_data["depth_limit"],
input_data["embedding_type"],
input_data["vector_store"],
input_data["description"],
input_data["agents"],
input_data["child_engines"],
input_data["is_multimodal"])
st.toast(
"Job re-submitted with query engine: {job['query_engine']}")
with tab_create_qe:
st.subheader("Build a new Query Engine")
placeholder_build_qe = st.empty()
with placeholder_build_qe.form("build"):
engine_name = st.text_input("Name")
engine_type = st.selectbox(
"Engine Type:",
[QE_TYPE_VERTEX_SEARCH, QE_TYPE_LLM_SERVICE,
QE_TYPE_INTEGRATED_SEARCH])
doc_url = st.text_input("Document URL")
depth_limit = st.selectbox(
"Web depth limit:",
[0,1,2,3])
placeholder_is_multimodal = st.empty()
placeholder_embedding_type = st.empty()
vector_store = st.selectbox(
"Vector Store:",
vector_store_list)
description = st.text_area("Description")
agents = st.text_area("Agents")
child_engines = st.text_area("Child Engines")
submit = st.form_submit_button("Build")
with placeholder_is_multimodal:
is_multimodal = st.toggle("Multimodal Engine?", False)
with placeholder_embedding_type:
embedding_types = get_embedding_types(None, is_multimodal)
embedding_type = st.selectbox(
"Embedding:",
embedding_types)
if submit:
submit_build(
engine_name, engine_type,
doc_url, depth_limit, embedding_type, vector_store, description, agents,
child_engines, str(is_multimodal)
)