File size: 5,098 Bytes
3dbf4e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import streamlit as st
import datetime
import requests
from streamlit_extras.add_vertical_space import add_vertical_space
from streamlit_lottie import st_lottie
import streamlit.components.v1 as components

# Senin lokal servislerini doğrudan içeri aktarıyoruz (FastAPI veya Render'a gerek yok!)
from app.services.nlp_triplet import extract_triplets_from_text
from app.services.memory_engine import group_by_author, count_predicates, most_common_subjects
from app.services.graph_builder import build_graph_from_triplets
from app.services.graph_visualizer import visualize_graph

st.set_page_config(page_title="AI Memory Graph", layout="wide", page_icon="🧠")

# Lottie Animasyonu Yükleme
def load_lottieurl(url: str):
    r = requests.get(url)
    if r.status_code != 200: return None
    return r.json()

lottie_ai = load_lottieurl("https://assets9.lottiefiles.com/packages/lf20_touohxv0.json")

col1, col2 = st.columns([4, 1])
with col1:
    st.title("🧠 AI Memory Graph")
    st.markdown("A visual way to extract and understand multi-user chat memories using NLP + Graphs.")
with col2:
    if lottie_ai:
        st_lottie(lottie_ai, height=100, key="ai")

add_vertical_space(1)

# Session State Tanımlamaları
if "messages" not in st.session_state:
    st.session_state["messages"] = []
if "triplets" not in st.session_state:
    st.session_state["triplets"] = []

# --- SOHBET GİRİŞ ALANI ---
st.subheader("💬 Add Chat Messages")
with st.form("message_form", clear_on_submit=True):
    col_sender, col_msg = st.columns([1, 3])
    with col_sender:
        sender = st.text_input("Sender", placeholder="e.g. Erdem")
    with col_msg:
        text = st.text_input("Message", placeholder="e.g. I recommend using FastAPI for the backend.")
    
    submitted = st.form_submit_button("➕ Add Message")
    if submitted and sender and text:
        st.session_state["messages"].append({
            "sender": sender,
            "text": text,
            "timestamp": datetime.datetime.utcnow().isoformat()
        })
        st.success(f"Message added for {sender}!")

# Eklenen mesajları göster
if st.session_state["messages"]:
    with st.expander("📑 View Current Messages", expanded=False):
        st.json(st.session_state["messages"])

    add_vertical_space(1)
    
    # --- İŞLEM BUTONLARI ---
    c1, c2, c3 = st.columns(3)

    # 1. Triplet Çıkarma İşlemi
    with c1:
        if st.button("🔍 Extract Triplets", use_container_width=True):
            with st.spinner("Analyzing text with SpaCy Transformer..."):
                all_triplets = []
                for msg in st.session_state["messages"]:
                    extracted = extract_triplets_from_text(msg["text"])
                    for triplet in extracted:
                        triplet["timestamp"] = msg["timestamp"]
                        triplet["author"] = msg["sender"]
                        all_triplets.append(triplet)
                
                st.session_state["triplets"] = all_triplets
                st.success(f"Extracted {len(all_triplets)} triplets!")
                st.json(all_triplets)

    # 2. Hafıza Özeti İşlemi
    with c2:
        if st.button("📝 Memory Summary", use_container_width=True):
            if not st.session_state["triplets"]:
                st.warning("Please extract triplets first!")
            else:
                summary = {
                    "total_triplets": len(st.session_state["triplets"]),
                    "by_user": group_by_author(st.session_state["triplets"]),
                    "predicate_counts": count_predicates(st.session_state["triplets"]),
                    "common_subjects": most_common_subjects(st.session_state["triplets"])
                }
                st.write("### 📊 Stats")
                st.json(summary)

    # 3. Grafik Çizdirme İşlemi
    with c3:
        if st.button("🌐 Show Knowledge Graph", use_container_width=True):
            if not st.session_state["triplets"]:
                st.warning("Please extract triplets first!")
            else:
                with st.spinner("Building and rendering graph..."):
                    # Grafiği oluştur
                    G = build_graph_from_triplets(st.session_state["triplets"])
                    
                    # HTML olarak kaydet (webbrowser.open KESİNLİKLE KAPALI OLMALI)
                    visualize_graph(G, output_path="memory_graph.html")
                    
                    # Kaydedilen HTML'i Streamlit içine göm
                    try:
                        with open("memory_graph.html", "r", encoding="utf-8") as f:
                            html_content = f.read()
                        st.write("### 🕸️ Graph Visualization")
                        components.html(html_content, height=600, scrolling=True)
                    except FileNotFoundError:
                        st.error("Graph HTML file could not be generated.")

# Footer
add_vertical_space(3)
st.markdown("---")
st.caption("Developed by Erdem Yavuz Hacisoftaoglu | Powered by SpaCy, NetworkX & Streamlit")