Spaces:
Running
Running
File size: 4,783 Bytes
c2374f4 0aa159f c2374f4 0aa159f c2374f4 f8cb5da 0aa159f c2374f4 0aa159f c2374f4 f8cb5da c2374f4 f8cb5da c2374f4 f8cb5da c2374f4 f8cb5da c2374f4 |
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 125 126 127 128 129 130 131 |
import os
import uuid
import gradio as gr
import requests
from datetime import datetime
# Cấu hình
LLAMA_SERVER_URL = "http://localhost:8000/completion" # llama-server chạy trên cổng 8000 nội bộ
# Hàm gọi API llama-server
def call_llama_server(messages, max_length=50):
payload = {
"prompt": messages[-1]["content"], # Chỉ gửi prompt cuối
"n_predict": max_length
}
try:
response = requests.post(LLAMA_SERVER_URL, json=payload, timeout=10)
response.raise_for_status()
return response.json().get("content", "No response")
except requests.RequestException as e:
return f"Error: {str(e)}"
# Định dạng lịch sử cho giao diện
def format_history(history):
return [{"role": "user", "content": item["content"]} if item["role"] == "user"
else {"role": "assistant", "content": item["content"]}
for item in history if item["role"] != "placeholder"]
# Giao diện chính
with gr.Blocks(
title="LLaMA Chat",
theme=gr.themes.Soft(primary_hue="purple", secondary_hue="gray"),
css="""
.chatbot { height: calc(100vh - 100px); overflow-y: auto; }
.message-user { background-color: #e6f3ff; padding: 10px; border-radius: 5px; margin: 5px 0; }
.message-assistant { background-color: #f0f0f0; padding: 10px; border-radius: 5px; margin: 5px 0; }
"""
) as demo:
# Trạng thái lưu lịch sử
state = gr.State({
"conversations_history": {},
"conversations": [],
"conversation_id": ""
})
gr.Markdown("# LLaMA Chat\nChat với mô hình Qwen2.5-0.5B - Powered by llama.cpp")
with gr.Row():
# Cột trái: Danh sách hội thoại
with gr.Column(scale=1, min_width=200):
gr.Markdown("### Hội thoại")
conversations = gr.Dropdown(label="Chọn hội thoại", choices=[], value=None, allow_custom_value=True)
new_chat_btn = gr.Button("Tạo hội thoại mới", variant="primary")
clear_btn = gr.Button("Xóa lịch sử", variant="secondary")
# Cột phải: Chatbot
with gr.Column(scale=3):
chatbot = gr.Chatbot(label="Cuộc trò chuyện", type="messages", elem_classes="chatbot")
with gr.Row():
prompt_input = gr.Textbox(
label="Nhập tin nhắn",
placeholder="Gõ tin nhắn hoặc '/' để xem gợi ý...",
show_label=False,
container=False
)
submit_btn = gr.Button("Gửi", variant="primary")
# Hàm xử lý sự kiện
def submit_prompt(prompt, state):
if not prompt.strip():
return state, [], ""
# Tạo hội thoại mới nếu chưa có
if not state["conversation_id"]:
convo_id = str(uuid.uuid4())
state["conversation_id"] = convo_id
state["conversations_history"][convo_id] = []
state["conversations"].append({"label": prompt[:20] + "...", "value": convo_id})
history = state["conversations_history"][state["conversation_id"]]
history.append({"role": "user", "content": prompt, "key": str(uuid.uuid4())})
# Gọi llama-server
response = call_llama_server(format_history(history))
history.append({"role": "assistant", "content": response, "key": str(uuid.uuid4())})
return (
state,
format_history(history),
""
)
def new_chat(state):
state["conversation_id"] = ""
return state, [], gr.update(choices=[(c["label"], c["value"]) for c in state["conversations"]])
def select_conversation(state, convo_id):
if convo_id and convo_id in state["conversations_history"]:
state["conversation_id"] = convo_id
history = state["conversations_history"][convo_id]
return state, format_history(history)
return state, []
def clear_history(state):
if state["conversation_id"]:
state["conversations_history"][state["conversation_id"]] = []
return state, []
# Sự kiện
submit_btn.click(
fn=submit_prompt,
inputs=[prompt_input, state],
outputs=[state, chatbot, prompt_input]
)
new_chat_btn.click(
fn=new_chat,
inputs=[state],
outputs=[state, chatbot, conversations]
)
conversations.change(
fn=select_conversation,
inputs=[state, conversations],
outputs=[state, chatbot]
)
clear_btn.click(
fn=clear_history,
inputs=[state],
outputs=[state, chatbot]
)
demo.launch(server_name="0.0.0.0", server_port=3000) |