File size: 3,533 Bytes
4e28ae5
d9df9ba
 
53b8322
 
 
 
 
95bfed4
4e28ae5
9fe1456
95bfed4
 
 
ab23d27
d9df9ba
 
95bfed4
0d2afb1
4e28ae5
d9df9ba
53b8322
 
 
 
 
d9df9ba
 
0d2afb1
d9df9ba
 
 
 
 
53b8322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9df9ba
53b8322
 
 
 
 
 
d9df9ba
 
53b8322
 
 
 
 
 
 
d9df9ba
 
53b8322
4e28ae5
d9df9ba
53b8322
4e28ae5
 
53b8322
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
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import requests
import pdfkit
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
import os

# Thiết lập API token từ Hugging Face
api_token = os.getenv("api_token")
if api_token is None:
    raise ValueError("API token is not set. Please set it in your Hugging Face settings.")

# Tải mô hình và tokenizer từ Hugging Face
model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=api_token)
model = AutoModelForCausalLM.from_pretrained(model_name, use_auth_token=api_token).to("cpu")

def analyze_chat(link, extraction_request, system_message, max_tokens, temperature, top_p):
    response = requests.get(link)
    if response.status_code != 200:
        return "Không thể lấy nội dung từ link."

    chat_content = response.text
    prompt = f"{system_message}\n\nChat Content:\n{chat_content}\n\nExtraction Request: {extraction_request}"
    
    inputs = tokenizer(prompt, return_tensors="pt", max_length=8192, truncation=True).to("cpu")
    with torch.no_grad():
        outputs = model.generate(**inputs, max_new_tokens=max_tokens, temperature=temperature, top_p=top_p)
    
    extracted_content = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return extracted_content

def generate_file(content, file_type):
    if file_type == "PDF":
        pdfkit.from_string(content, 'output.pdf')
        return "output.pdf"
    elif file_type == "Docx":
        doc = Document()
        doc.styles['Normal'].font.name = 'Arial'
        doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), 'Arial')
        p = doc.add_paragraph()
        run = p.add_run(content)
        run.font.size = Pt(12)
        doc.save('output.docx')
        return "output.docx"

with gr.Blocks() as demo:
    gr.Markdown("# Chatbot Trợ Lý Cá Nhân")
    
    link = gr.Textbox(label="Đường link đoạn chat")
    extraction_request = gr.Textbox(label="Yêu cầu trích xuất nội dung")
    analyze_button = gr.Button("Phân tích")
    extracted_output = gr.Textbox(label="Nội dung đã trích xuất", interactive=True)
    generate_button = gr.Button("Tạo file")
    file_type = gr.Radio(["PDF", "Docx"], label="Loại file", value="PDF")
    file_output = gr.File(label="File kết quả")
    
    def analyze_link(link, extraction_request, system_message, max_tokens, temperature, top_p):
        extracted_content = analyze_chat(link, extraction_request, system_message, max_tokens, temperature, top_p)
        return extracted_content

    def generate_file_action(content, file_type):
        file_path = generate_file(content, file_type)
        return file_path

    system_message = gr.Textbox(value="You are a friendly Chatbot.", label="System message")
    max_tokens = gr.Slider(minimum=1, maximum=8192, value=512, step=1, label="Max new tokens")  # Adjust maximum based on model capabilities
    temperature = gr.Slider(minimum=0.1, maximum=1.0, value=0.7, step=0.1, label="Temperature")
    top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)")

    analyze_button.click(analyze_link, inputs=[link, extraction_request, system_message, max_tokens, temperature, top_p], outputs=extracted_output)
    generate_button.click(generate_file_action, inputs=[extracted_output, file_type], outputs=file_output)

if __name__ == "__main__":
    demo.launch()