Atsatoru commited on
Commit
b08e34e
·
verified ·
1 Parent(s): 5675238

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -61
app.py CHANGED
@@ -1349,12 +1349,12 @@ print(' - Advanced RAG: Tìm kiếm chính xác hơn')
1349
  print()
1350
  print('='*70)
1351
  # ======================================================================
1352
- # PHẦN 12.5: GRADIO INTERFACE (ĐẦY ĐỦ TÍNH NĂNG + NÚT LOG OUT CHO ADMIN)
1353
  # ======================================================================
1354
 
1355
  import gradio as gr
1356
  print('='*70)
1357
- print('🖥️ KHỞI TẠO GRADIO INTERFACE CHUẨN HÓA LAYOUT')
1358
  print('='*70)
1359
  print()
1360
 
@@ -1511,17 +1511,25 @@ footer {display: none !important;}
1511
  box-shadow: 0 2px 4px rgba(0,0,0,0.02);
1512
  }
1513
 
1514
- /* CSS Khung Card Trang Chủ */
1515
- .home-card-custom {
1516
- background: #ffffff !important;
1517
- padding: 20px !important;
1518
- border-radius: 8px !important;
1519
- border: 1px solid #dee2e6 !important;
1520
- box-shadow: 0 2px 10px rgba(0,0,0,0.02) !important;
1521
- height: 100%;
 
1522
  }
1523
- .card-intro-line { border-top: 4px solid #1e3c72 !important; }
1524
- .card-guide-line { border-top: 4px solid #0056b3 !important; }
 
 
 
 
 
 
 
1525
 
1526
  button.primary {
1527
  background-color: #0056b3 !important;
@@ -1585,42 +1593,35 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1585
  # 2. Hệ thống chuyển Tab làm việc chính
1586
  with gr.Tabs():
1587
 
1588
- # TAB 1: TRANG CHỦ (Ép 2 ô nằm ngang song song cố định)
1589
  with gr.Tab("🏠 Trang chủ"):
1590
- gr.HTML("<div style='margin-top: 10px;'></div>")
1591
-
1592
- with gr.Row():
1593
- # Ô bên trái: Giới thiệu hệ thống
1594
- with gr.Column(scale=1):
1595
- gr.HTML("""
1596
- <div class="home-card-custom card-intro-line">
1597
- <h3 style="color: #1e3c72; margin-top: 0; font-weight: 600; display: flex; align-items: center; gap: 8px; font-size: 16px;">
1598
- 🏛️ GIỚI THIỆU HỆ THỐNG TRỢ LÝ ẢO
1599
- </h3>
1600
- <p style="font-size: 14px; line-height: 1.6; color: #334155; margin: 10px 0 0 0;">
1601
- Hệ thống <b>Trợ lý ảo tư vấn hành chính công</b> được phát triển nhằm tối ưu hóa trải nghiệm dịch vụ công cho công dân.
1602
- Sử dụng công nghệ trí tuệ nhân tạo phối hợp với kiến trúc bộ nhớ thông minh, trợ lý ảo hỗ trợ tìm kiếm chính xác điều kiện,
1603
- lệ phí và các bước thực hiện của mọi thủ tục hành chính công một cách lập tức, chính xác 24/7.
1604
- </p>
1605
- </div>
1606
- """)
1607
 
1608
- # Ô bên phải: Hướng dẫn sử dụng
1609
- with gr.Column(scale=1):
1610
- gr.HTML("""
1611
- <div class="home-card-custom card-guide-line">
1612
- <h3 style="color: #0056b3; margin-top: 0; font-weight: 600; display: flex; align-items: center; gap: 8px; font-size: 16px;">
1613
- 💡 HƯỚNG DẪN SỬ DỤNG PHÂN HỆ
1614
- </h3>
1615
- <ul style="font-size: 14px; line-height: 1.6; color: #334155; padding-left: 20px; margin: 10px 0 0 0;">
1616
- <li><b>💬 Phân hệ Trợ lý AI:</b> Nhập liệu bằng văn bản hoặc sử dụng microphone ghi âm giọng nói. Hệ thống tự động phân tích dữ liệu RAG và phát loa phản hồi tự động.</li>
1617
- <li><b>⚙️ Phân hệ Admin Panel:</b> Khu vực xác thực mật khẩu dành riêng cho cán bộ quản trị hệ thống nhằm cập nhật hoặc bổ sung trực tiếp dữ liệu thủ tục hành chính mới.</li>
1618
- <li><b>🧠 Phân hệ Memory Manager:</b> Theo dõi trực quan và quản lý toàn bộ các ngữ cảnh hội thoại, lịch sử chat đệm được lưu giữ trong bộ nhớ AI ở phiên làm việc hiện tại.</li>
1619
- </ul>
1620
- </div>
1621
- """)
1622
 
1623
- # TAB 2: Giao diện tương tác tư vấn công dân
1624
  with gr.Tab("💬 Trợ lý AI"):
1625
  with gr.Row():
1626
  with gr.Column(scale=7):
@@ -1650,24 +1651,29 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1650
  ">
1651
  <strong style="color: #1e3c72;">💡 Cách dùng nhanh:</strong>
1652
  <ul style="margin: 5px 0 0 15px; padding: 0;">
1653
- <li>Nhập câu hỏi hoặc dùng 🎤 <b>Micro</b>.</li>
1654
- <li>Nhấn <b>Gửi</b> để nhận phản hồi từ AI.</li>
1655
  <li>Hệ thống sẽ tự động 🔊 <b>Phát loa</b> câu trả lời.</li>
1656
  </ul>
1657
  </div>
1658
  """)
1659
 
 
1660
  gr.Markdown("---")
1661
- gr.Markdown("**📌 Gợi ý tra cứu nhanh:**")
1662
  gr.Examples(
1663
  examples=[
1664
- [None, 'Làm bằng lái xe máy cần giấy tờ gì?'],
1665
- [None, 'Khai sinh quá hạn phải làm sao?'],
1666
- [None, 'Đăng ký xe ô tô mới ở đâu?'],
1667
- [None, 'Tách hộ khẩu cần những gì?'],
1668
- [None, 'Làm hộ chiếu bao nhiêu tiền?'],
 
 
 
1669
  ],
1670
- inputs=[audio_in, msg_in]
 
1671
  )
1672
 
1673
  # Ràng buộc sự kiện Chatbot
@@ -1675,11 +1681,11 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1675
  msg_in.submit(process_chat_pro, [audio_in, msg_in, chat], [chat, audio_out, msg_in])
1676
  btn_clear.click(clear_chat_pro, [], [chat, audio_out, msg_in])
1677
 
1678
- # TAB 3: Quản trị viên cập nhật thủ tục (Có thêm logic Log out bảo mật)
1679
  with gr.Tab("⚙️ Admin Panel"):
1680
  gr.Markdown("### 🔐 Xác thực quyền quản trị")
1681
 
1682
- # Đặt tên biến hàng đăng nhập để dễ xử lý ẩn hiện đồng bộ
1683
  with gr.Row() as login_row:
1684
  input_pass = gr.Textbox(
1685
  label="Nhập mật khẩu để mở khóa tính năng Admin",
@@ -1693,7 +1699,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1693
  admin_content = gr.Group(visible=False)
1694
 
1695
  with admin_content:
1696
- # Dòng đầu tiên của Admin: Tiêu đề và Nút Đăng xuất
1697
  with gr.Row():
1698
  gr.Markdown("### 🏛️ KHU VỰC CẬP NHẬT DỮ LIỆU CẤP CAO")
1699
  btn_logout = gr.Button("Đăng xuất ↩️", variant="stop", scale=1, size="sm")
@@ -1717,7 +1723,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1717
  add_output = gr.Textbox(label="Kết quả xử lý")
1718
  procedures_list = gr.Markdown(value=get_procedures_list())
1719
 
1720
- # --- Logic xử lý ẩn hiện và mật khẩu ---
1721
  def check_admin(password):
1722
  if password == ADMIN_PASSWORD:
1723
  gr.Info("Đăng nhập thành công! Quyền quản trị đã được mở.")
@@ -1729,10 +1735,10 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1729
  # Hàm xử lý đăng xuất an toàn
1730
  def admin_logout():
1731
  gr.Info("Đã đăng xuất an toàn khỏi hệ thống quản trị.")
1732
- # Ẩn nội dung admin, hiện lại thanh đăng nhập và reset trắng ô nhập mật khẩu
1733
  return gr.update(visible=False), gr.update(visible=True), gr.update(value="")
1734
 
1735
- # Đăng ký tương tác sự kiện xác thực đăng nhập
1736
  btn_login.click(
1737
  check_admin,
1738
  inputs=[input_pass],
@@ -1746,13 +1752,32 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"), cs
1746
  outputs=[admin_content, login_row, input_pass]
1747
  )
1748
 
1749
- # Sự kiện nút Thêm thủ tục
1750
  btn_add.click(
1751
  admin_add,
1752
  [admin_code, admin_name, admin_docs, admin_coquan, admin_time, admin_lephi, admin_note, admin_steps],
1753
  [add_output, procedures_list]
1754
  )
1755
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1756
 
1757
  # ======================================================================
1758
  # PHẦN 12.7: LAUNCH SYSTEM APPLICATION
 
1349
  print()
1350
  print('='*70)
1351
  # ======================================================================
1352
+ # PHẦN 12.5: GRADIO INTERFACE (BẢN CHUẨN ĐẦY ĐỦ - TÁCH Ô, EXAMPLES XỊN & LOGOUT)
1353
  # ======================================================================
1354
 
1355
  import gradio as gr
1356
  print('='*70)
1357
+ print('🖥️ KHỞI TẠO GRADIO INTERFACE CHUẨN HÓA')
1358
  print('='*70)
1359
  print()
1360
 
 
1511
  box-shadow: 0 2px 4px rgba(0,0,0,0.02);
1512
  }
1513
 
1514
+ /* Bố cục chia 2 ô ở Trang chủ */
1515
+ .home-grid {
1516
+ display: grid;
1517
+ grid-template-columns: repeat(2, 1fr);
1518
+ gap: 20px;
1519
+ margin-top: 10px;
1520
+ }
1521
+ @media (max-width: 768px) {
1522
+ .home-grid { grid-template-columns: 1fr; }
1523
  }
1524
+ .home-card {
1525
+ background: #ffffff;
1526
+ padding: 20px;
1527
+ border-radius: 8px;
1528
+ border: 1px solid #dee2e6;
1529
+ box-shadow: 0 2px 10px rgba(0,0,0,0.02);
1530
+ }
1531
+ .card-intro { border-top: 4px solid #1e3c72; }
1532
+ .card-guide { border-top: 4px solid #0056b3; }
1533
 
1534
  button.primary {
1535
  background-color: #0056b3 !important;
 
1593
  # 2. Hệ thống chuyển Tab làm việc chính
1594
  with gr.Tabs():
1595
 
1596
+ # TAB 1: TRANG CHỦ (Tách biệt Giới thiệu & HDSD thành 2 ô riêng biệt)
1597
  with gr.Tab("🏠 Trang chủ"):
1598
+ gr.HTML("""
1599
+ <div class="home-grid">
1600
+ <div class="home-card card-intro">
1601
+ <h3 style="color: #1e3c72; margin-top: 0; font-weight: 600; display: flex; align-items: center; gap: 8px;">
1602
+ 🏛️ GIỚI THIỆU HỆ THỐNG TRỢ LÝ ẢO
1603
+ </h3>
1604
+ <p style="font-size: 14px; line-height: 1.6; color: #334155; margin-bottom: 0;">
1605
+ Hệ thống <b>Trợ lý ảo tư vấn hành chính công</b> được phát triển nhằm tối ưu hóa trải nghiệm dịch vụ công cho công dân.
1606
+ Sử dụng công nghệ trí tuệ nhân tạo phối hợp với kiến trúc bộ nhớ thông minh, trợ lý ảo hỗ trợ tìm kiếm chính xác điều kiện,
1607
+ lệ phí và các bước thực hiện của mọi thủ tục hành chính công một cách lập tức, chính xác 24/7.
1608
+ </p>
1609
+ </div>
 
 
 
 
 
1610
 
1611
+ <div class="home-card card-guide">
1612
+ <h3 style="color: #0056b3; margin-top: 0; font-weight: 600; display: flex; align-items: center; gap: 8px;">
1613
+ 💡 HƯỚNG DẪN SỬ DỤNG PHÂN HỆ Chức Năng
1614
+ </h3>
1615
+ <ul style="font-size: 14px; line-height: 1.6; color: #334155; padding-left: 20px; margin: 0;">
1616
+ <li><b>💬 Phân hệ Trợ lý AI:</b> Nhập liệu bằng văn bản hoặc sử dụng microphone ghi âm giọng nói. Hệ thống tự động phân tích dữ liệu RAG và phát loa phản hồi tự động bằng giọng nói thích hợp.</li>
1617
+ <li><b>⚙️ Phân hệ Admin Panel:</b> Khu vực xác thực mật khẩu dành riêng cho cán bộ quản trị hệ thống nhằm cập nhật hoặc bổ sung trực tiếp dữ liệu thủ tục hành chính mới.</li>
1618
+ <li><b>🧠 Phân hệ Memory Manager:</b> Theo dõi trực quan và quản lý toàn bộ các ngữ cảnh hội thoại, lịch sử chat đệm được lưu giữ trong bộ nhớ AI ở phiên làm việc hiện tại.</li>
1619
+ </ul>
1620
+ </div>
1621
+ </div>
1622
+ """)
 
 
1623
 
1624
+ # TAB 2: Giao diện tương tác tư vấn công dân (Đã nâng cấp bộ Examples xịn)
1625
  with gr.Tab("💬 Trợ lý AI"):
1626
  with gr.Row():
1627
  with gr.Column(scale=7):
 
1651
  ">
1652
  <strong style="color: #1e3c72;">💡 Cách dùng nhanh:</strong>
1653
  <ul style="margin: 5px 0 0 15px; padding: 0;">
1654
+ <li>Nhập câu hỏi hoặc chọn một mẫu câu hỏi gợi ý nhanh bên dưới.</li>
1655
+ <li>Nhấn <b>Gửi câu hỏi</b> để nhận phản hồi từ AI.</li>
1656
  <li>Hệ thống sẽ tự động 🔊 <b>Phát loa</b> câu trả lời.</li>
1657
  </ul>
1658
  </div>
1659
  """)
1660
 
1661
+ # Khu vực Examples gợi ý câu hỏi nhanh (Bản mở rộng thực tế)
1662
  gr.Markdown("---")
1663
+ gr.Markdown("### 📌 Gợi ý tra cứu nhanh (Bấm vào câu hỏi để tự động điền)")
1664
  gr.Examples(
1665
  examples=[
1666
+ [None, 'Thủ tục làm hộ chiếu phổ thông trực tuyến cần giấy tờ gì?'],
1667
+ [None, 'Đăng ký khai sinh muộn cho con thì bị phạt bao nhiêu tiền?'],
1668
+ [None, 'Điều kiện và thủ tục cấp lại thẻ Căn cước bị mất như thế nào?'],
1669
+ [None, 'Đổi bằng lái xe máy từ thẻ giấy sang thẻ nhựa (PET) ở đâu?'],
1670
+ [None, 'Thủ tục tách hộ khẩu cho con khi ra ở riêng cần những gì?'],
1671
+ [None, 'Lệ phí trước bạ khi đăng ký xe ô tô mới hiện nay là bao nhiêu?'],
1672
+ [None, 'Làm giấy chứng nhận độc thân (tình trạng hôn nhân) tại xã hay huyện?'],
1673
+ [None, 'Sang tên sổ đỏ đất thổ cư mất bao lâu và phí thế nào?']
1674
  ],
1675
+ inputs=[audio_in, msg_in],
1676
+ label="Danh sách câu hỏi mẫu hành chính công phổ biến"
1677
  )
1678
 
1679
  # Ràng buộc sự kiện Chatbot
 
1681
  msg_in.submit(process_chat_pro, [audio_in, msg_in, chat], [chat, audio_out, msg_in])
1682
  btn_clear.click(clear_chat_pro, [], [chat, audio_out, msg_in])
1683
 
1684
+ # TAB 3: Quản trị viên cập nhật thủ tục (Đã thêm cơ chế Đăng nhập / Đăng xuất đồng bộ)
1685
  with gr.Tab("⚙️ Admin Panel"):
1686
  gr.Markdown("### 🔐 Xác thực quyền quản trị")
1687
 
1688
+ # Khởi tạo biến hàng đăng nhập để dễ dàng ẩn/hiện
1689
  with gr.Row() as login_row:
1690
  input_pass = gr.Textbox(
1691
  label="Nhập mật khẩu để mở khóa tính năng Admin",
 
1699
  admin_content = gr.Group(visible=False)
1700
 
1701
  with admin_content:
1702
+ # Dòng đầu tiên của khu vực quản trị: Tiêu đề và Nút Đăng xuất
1703
  with gr.Row():
1704
  gr.Markdown("### 🏛️ KHU VỰC CẬP NHẬT DỮ LIỆU CẤP CAO")
1705
  btn_logout = gr.Button("Đăng xuất ↩️", variant="stop", scale=1, size="sm")
 
1723
  add_output = gr.Textbox(label="Kết quả xử lý")
1724
  procedures_list = gr.Markdown(value=get_procedures_list())
1725
 
1726
+ # Cấu trúc logic chuyển đổi trạng thái giao diện an toàn
1727
  def check_admin(password):
1728
  if password == ADMIN_PASSWORD:
1729
  gr.Info("Đăng nhập thành công! Quyền quản trị đã được mở.")
 
1735
  # Hàm xử lý đăng xuất an toàn
1736
  def admin_logout():
1737
  gr.Info("Đã đăng xuất an toàn khỏi hệ thống quản trị.")
1738
+ # Ẩn nội dung admin, hiện lại thanh đăng nhập và reset trắng ô mật khẩu cũ
1739
  return gr.update(visible=False), gr.update(visible=True), gr.update(value="")
1740
 
1741
+ # Đăng ký tương tác sự kiện xác thực
1742
  btn_login.click(
1743
  check_admin,
1744
  inputs=[input_pass],
 
1752
  outputs=[admin_content, login_row, input_pass]
1753
  )
1754
 
 
1755
  btn_add.click(
1756
  admin_add,
1757
  [admin_code, admin_name, admin_docs, admin_coquan, admin_time, admin_lephi, admin_note, admin_steps],
1758
  [add_output, procedures_list]
1759
  )
1760
 
1761
+ # TAB 4: Quản lý bộ nhớ hội thoại
1762
+ with gr.Tab("🧠 Memory Manager"):
1763
+ gr.Markdown("### 📊 Quản lý bộ nhớ hội thoại")
1764
+
1765
+ memory_info = gr.Textbox(label="Ngữ cảnh hiện tại", interactive=False, lines=3)
1766
+ memory_history = gr.Textbox(label="Lịch sử chat", interactive=False, lines=10)
1767
+
1768
+ with gr.Row():
1769
+ btn_refresh = gr.Button("🔄 Làm mới")
1770
+ btn_clear_mem = gr.Button("🗑️ Xóa memory", variant='stop')
1771
+
1772
+ def refresh_memory():
1773
+ ctx = conversation_memory.get_context_summary()
1774
+ hist = "\n".join([f"{m['role']}: {m['content'][:100]}..."
1775
+ for m in conversation_memory.history[-5:]])
1776
+ return ctx or "Không có ngữ cảnh", hist or "Không có lịch sử"
1777
+
1778
+ btn_refresh.click(refresh_memory, [], [memory_info, memory_history])
1779
+ btn_clear_mem.click(clear_chat_pro, [], [chat, audio_out, msg_in])
1780
+
1781
 
1782
  # ======================================================================
1783
  # PHẦN 12.7: LAUNCH SYSTEM APPLICATION