graphrag/unified-search-app/app/ui/report_details.py
gaudyb 0e1a6e3770
Unified search added to graphrag (#1862)
* unified search app added to graphrag repository

* ignore print statements

* update words for unified-search

* fix lint errors

* fix lint error

* fix module name

---------

Co-authored-by: Gaudy Blanco <gaudy-microsoft@MacBook-Pro-m4-Gaudy-For-Work.local>
2025-04-07 11:59:02 -06:00

99 lines
3.7 KiB
Python

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License
"""Report details module."""
import json
import pandas as pd
import streamlit as st
from state.session_variables import SessionVariables
from ui.search import (
display_graph_citations,
format_response_hyperlinks,
get_ids_per_key,
)
def create_report_details_ui(sv: SessionVariables):
"""Return report details UI component."""
if sv.selected_report.value is not None and sv.selected_report.value.empty is False:
text = ""
entity_ids = []
relationship_ids = []
try:
report = json.loads(sv.selected_report.value.full_content_json)
title = report["title"]
summary = report["summary"]
rating = report["rating"]
rating_explanation = report["rating_explanation"]
findings = report["findings"]
text += f"#### {title}\n\n{summary}\n\n"
text += f"**Priority: {rating}**\n\n{rating_explanation}\n\n##### Key Findings\n\n"
if isinstance(findings, list):
for finding in findings:
# extract data for citations
entity_ids.extend(
get_ids_per_key(finding["explanation"], "Entities")
)
relationship_ids.extend(
get_ids_per_key(finding["explanation"], "Relationships")
)
formatted_text = format_response_hyperlinks(
finding["explanation"], "graph"
)
text += f"\n\n**{finding['summary']}**\n\n{formatted_text}"
elif isinstance(findings, str):
# extract data for citations
entity_ids.extend(get_ids_per_key(finding["explanation"], "Entities")) # type: ignore
relationship_ids.extend(
get_ids_per_key(finding["explanation"], "Relationships") # type: ignore
)
formatted_text = format_response_hyperlinks(findings, "graph")
text += f"\n\n{formatted_text}"
except json.JSONDecodeError:
st.write("Error parsing report.")
st.write(sv.selected_report.value.full_content_json)
text_replacement = (
text.replace("Entity_Relationships", "Relationships")
.replace("Entity_Claims", "Claims")
.replace("Entity_Details", "Entities")
)
st.markdown(f"{text_replacement}", unsafe_allow_html=True)
# extract entities
selected_entities = []
for _index, row in sv.entities.value.iterrows():
if str(row["human_readable_id"]) in entity_ids:
selected_entities.append({
"id": str(row["human_readable_id"]),
"title": row["title"],
"description": row["description"],
})
sorted_entities = sorted(selected_entities, key=lambda x: int(x["id"]))
# extract relationships
selected_relationships = []
for _index, row in sv.relationships.value.iterrows():
if str(row["human_readable_id"]) in relationship_ids:
selected_relationships.append({
"id": str(row["human_readable_id"]),
"source": row["source"],
"target": row["target"],
"description": row["description"],
})
sorted_relationships = sorted(
selected_relationships, key=lambda x: int(x["id"])
)
display_graph_citations(
pd.DataFrame(sorted_entities), pd.DataFrame(sorted_relationships), "graph"
)
else:
st.write("No report selected")