Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 ĐỦ
|
| 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,17 +1511,25 @@ footer {display: none !important;}
|
|
| 1511 |
box-shadow: 0 2px 4px rgba(0,0,0,0.02);
|
| 1512 |
}
|
| 1513 |
|
| 1514 |
-
/*
|
| 1515 |
-
.home-
|
| 1516 |
-
|
| 1517 |
-
|
| 1518 |
-
|
| 1519 |
-
|
| 1520 |
-
|
| 1521 |
-
|
|
|
|
| 1522 |
}
|
| 1523 |
-
.
|
| 1524 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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Ủ (
|
| 1589 |
with gr.Tab("🏠 Trang chủ"):
|
| 1590 |
-
gr.HTML("
|
| 1591 |
-
|
| 1592 |
-
|
| 1593 |
-
|
| 1594 |
-
|
| 1595 |
-
|
| 1596 |
-
<
|
| 1597 |
-
<
|
| 1598 |
-
|
| 1599 |
-
|
| 1600 |
-
|
| 1601 |
-
|
| 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 |
-
|
| 1609 |
-
|
| 1610 |
-
|
| 1611 |
-
<
|
| 1612 |
-
|
| 1613 |
-
|
| 1614 |
-
</
|
| 1615 |
-
<
|
| 1616 |
-
|
| 1617 |
-
|
| 1618 |
-
|
| 1619 |
-
|
| 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
|
| 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("
|
| 1662 |
gr.Examples(
|
| 1663 |
examples=[
|
| 1664 |
-
[None, '
|
| 1665 |
-
[None, '
|
| 1666 |
-
[None, '
|
| 1667 |
-
[None, '
|
| 1668 |
-
[None, '
|
|
|
|
|
|
|
|
|
|
| 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 (
|
| 1679 |
with gr.Tab("⚙️ Admin Panel"):
|
| 1680 |
gr.Markdown("### 🔐 Xác thực quyền quản trị")
|
| 1681 |
|
| 1682 |
-
#
|
| 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
|
| 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 |
-
#
|
| 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 ô
|
| 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
|
| 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
|