| import socketio |
| import uvicorn |
| from fastapi import FastAPI |
|
|
| from main import build_rag_chain, build_vectorstore, load_env |
|
|
| load_env() |
|
|
| app = FastAPI() |
| sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*") |
| socket_app = socketio.ASGIApp(sio, other_asgi_app=app) |
|
|
| rag_chain = None |
|
|
|
|
| @app.on_event("startup") |
| async def startup(): |
| global rag_chain |
| print("Loading vectorstore...") |
| vectorstore = build_vectorstore() |
| print("Building RAG chain...") |
| rag_chain = build_rag_chain(vectorstore) |
| print("Server ready!") |
|
|
|
|
| @sio.event |
| async def connect(sid, environ): |
| print(f"Client connected: {sid}") |
|
|
|
|
| @sio.event |
| async def disconnect(sid): |
| print(f"Client disconnected: {sid}") |
|
|
|
|
| @sio.event |
| async def ask(sid, data): |
| question = data.get("question", "").strip() |
| if not question: |
| await sio.emit("answer", {"error": "Câu hỏi trống"}, to=sid) |
| return |
|
|
| try: |
| answer = await rag_chain.ainvoke(question) |
| await sio.emit("answer", {"answer": answer}, to=sid) |
| except Exception as e: |
| print(f"Error: {e}") |
| await sio.emit("answer", {"error": str(e)}, to=sid) |
|
|
|
|
| if __name__ == "__main__": |
| uvicorn.run(socket_app, host="0.0.0.0", port=8000) |
|
|