File size: 3,180 Bytes
091451d
cfba9db
8ba1afc
091451d
cfba9db
091451d
 
 
3114f31
 
091451d
 
 
cfba9db
091451d
 
 
 
 
 
 
a7aa06f
091451d
 
 
 
 
 
 
 
 
 
 
 
2cfcd90
091451d
 
2cfcd90
 
 
deb315d
091451d
 
 
 
 
 
 
deb315d
091451d
deb315d
 
 
091451d
 
 
 
 
 
 
3114f31
091451d
 
 
 
 
 
 
 
 
 
cfba9db
3114f31
 
 
 
deb315d
091451d
d2d0847
3114f31
 
 
 
 
 
deb315d
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
import logging
import gradio as gr
from transformers import pipeline
import os
import torch
from huggingface_hub import login
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import uvicorn
import threading

# Cấu hình logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Đăng nhập Hugging Face
try:
    login(token=os.getenv("HF_TOKEN"))
    logging.info("Logged in to Hugging Face Hub successfully")
except Exception as e:
    logging.error(f"Failed to login to Hugging Face Hub: {e}")
    raise

# Load mô hình
logging.info("Loading nguyenvulebinh/vi-mrc-base...")
try:
    qa_pipeline = pipeline(
        "question-answering",
        model="nguyenvulebinh/vi-mrc-base",
        device=0 if torch.cuda.is_available() else -1
    )
    logging.info("Model loaded successfully")
except Exception as e:
    logging.error(f"Failed to load model: {e}")
    raise

# Hàm xử lý cho Gradio và API
def gradio_answer(question, context):
    result = qa_pipeline(question=question, context=context)
    return result["answer"]

# Tạo FastAPI app
app = FastAPI()

@app.post("/api/answer")
async def api_answer(request: Request):
    try:
        data = await request.json()
        question = data.get("question")
        context = data.get("context", "Cây lúa là một loại cây trồng phổ biến ở Việt Nam, cần điều kiện đất và nước phù hợp.")
        logging.info(f"Received request - Question: {question}, Context: {context[:200]}...")
        if not question:
            logging.error("Missing question")
            return JSONResponse({"error": "Missing question"}, status_code=400)
        result = qa_pipeline(question=question, context=context)
        logging.info(f"Response - Answer: {result['answer']}")
        return JSONResponse({"answer": result["answer"]})
    except Exception as e:
        logging.error(f"API error: {e}")
        return JSONResponse({"error": str(e)}, status_code=500)

# Tạo Gradio Blocks
with gr.Blocks() as demo:
    gr.Markdown("# AgriBot: Hỏi đáp nông nghiệp")
    gr.Markdown("Nhập câu hỏi và ngữ cảnh để nhận câu trả lời về nông nghiệp.")
    
    with gr.Row():
        question_input = gr.Textbox(label="Câu hỏi", placeholder="Nhập câu hỏi của bạn...")
        context_input = gr.Textbox(label="Ngữ cảnh", placeholder="Nhập ngữ cảnh liên quan...")
    output = gr.Textbox(label="Câu trả lời")
    submit_btn = gr.Button("Gửi")
    submit_btn.click(fn=gradio_answer, inputs=[question_input, context_input], outputs=output)

# Hàm chạy Gradio
def run_gradio():
    logging.info("Starting Gradio on port 7860...")
    demo.launch(server_name="0.0.0.0", server_port=7860, share=False, show_error=True)

# Chạy ứng dụng
if __name__ == "__main__":
    # Chạy Gradio trong một thread riêng
    gradio_thread = threading.Thread(target=run_gradio)
    gradio_thread.start()
    
    # Chạy FastAPI trên port chính (80 cho Hugging Face Spaces)
    logging.info("Starting FastAPI on port 80...")
    uvicorn.run(app, host="0.0.0.0", port=80)