ArthurSrz commited on
Commit
7f6b009
·
1 Parent(s): 2b45c4a

Add FastAPI wrapper for direct API access

Browse files
Files changed (2) hide show
  1. api_wrapper.py +86 -0
  2. requirements.txt +2 -0
api_wrapper.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from pydantic import BaseModel
4
+ import asyncio
5
+ import os
6
+ from app import BorgesGraphRAG
7
+
8
+ # Create FastAPI app for direct API access
9
+ api_app = FastAPI(title="Borges GraphRAG API", version="1.0.0")
10
+
11
+ # Add CORS middleware
12
+ api_app.add_middleware(
13
+ CORSMiddleware,
14
+ allow_origins=["*"],
15
+ allow_credentials=True,
16
+ allow_methods=["*"],
17
+ allow_headers=["*"],
18
+ )
19
+
20
+ class QueryRequest(BaseModel):
21
+ query: str
22
+ mode: str = "local"
23
+ book_id: str = None
24
+
25
+ class QueryResponse(BaseModel):
26
+ success: bool
27
+ answer: str = None
28
+ searchPath: dict = None
29
+ error: str = None
30
+ book_id: str = None
31
+ mode: str = None
32
+
33
+ # Initialize GraphRAG
34
+ borges_rag = BorgesGraphRAG()
35
+
36
+ # Load available books
37
+ available_books = []
38
+ for item in os.listdir('.'):
39
+ if os.path.isdir(item) and not item.startswith('.'):
40
+ graph_file = os.path.join(item, 'graph_chunk_entity_relation.graphml')
41
+ if os.path.exists(graph_file):
42
+ available_books.append(item)
43
+
44
+ if available_books:
45
+ default_book = available_books[0]
46
+ borges_rag.load_book_data(default_book)
47
+ print(f"✅ Livre chargé: {default_book}")
48
+
49
+ @api_app.get("/")
50
+ async def root():
51
+ return {
52
+ "status": "active",
53
+ "service": "Borges GraphRAG API",
54
+ "books_loaded": len(available_books),
55
+ "default_book": available_books[0] if available_books else None
56
+ }
57
+
58
+ @api_app.post("/query", response_model=QueryResponse)
59
+ async def query_graphrag(request: QueryRequest):
60
+ """Direct GraphRAG query endpoint"""
61
+ try:
62
+ if not request.query.strip():
63
+ raise HTTPException(status_code=400, detail="Query cannot be empty")
64
+
65
+ # Query the GraphRAG system
66
+ result = await borges_rag.query_book(request.query, request.mode)
67
+
68
+ return QueryResponse(**result)
69
+
70
+ except Exception as e:
71
+ return QueryResponse(
72
+ success=False,
73
+ error=str(e)
74
+ )
75
+
76
+ @api_app.get("/books")
77
+ async def list_books():
78
+ """List available books"""
79
+ return {
80
+ "books": available_books,
81
+ "count": len(available_books)
82
+ }
83
+
84
+ if __name__ == "__main__":
85
+ import uvicorn
86
+ uvicorn.run(api_app, host="0.0.0.0", port=8000)
requirements.txt CHANGED
@@ -1,4 +1,6 @@
1
  gradio>=4.0.0
 
 
2
  nano-graphrag
3
  openai>=1.0.0
4
  networkx>=3.0
 
1
  gradio>=4.0.0
2
+ fastapi>=0.104.0
3
+ uvicorn>=0.24.0
4
  nano-graphrag
5
  openai>=1.0.0
6
  networkx>=3.0