File size: 3,231 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
 
8f95ed0
 
deb315d
091451d
d2d0847
3114f31
 
 
 
8f95ed0
 
 
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...")
    demo.launch(server_name="0.0.0.0", server_port=7860, share=False, show_error=True, ssr_mode=False)

# 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 (Hugging Face Spaces sẽ tự định nghĩa port)
    logging.info("Starting FastAPI...")
    uvicorn.run(app, host="0.0.0.0", port=80)  # Port 80 sẽ được Spaces tự động xử lý