senatus123 commited on
Commit
a4d342b
·
verified ·
1 Parent(s): d889689

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +71 -18
app.py CHANGED
@@ -1,41 +1,94 @@
1
  import nh3
2
- from fastapi import FastAPI, Request
3
- # from doc_searcher import DocSearcher
4
  from doc_searcher_v2 import DocSearcherV2
5
  from huggingface_hub import login
6
- from config import HUGGING_FACE_API_KEY, COLLECTION_NAME, API_KEY, COLLECTION_NAME_SUGGESTION
7
- from fastapi.responses import StreamingResponse
8
- import httpx
 
 
 
 
9
 
10
  login(HUGGING_FACE_API_KEY)
11
 
12
- app = FastAPI()
 
 
 
 
13
 
14
- # doc_searcher = DocSearcher(collection_name=COLLECTION_NAME)
15
  doc_searcher_v2 = DocSearcherV2(collection_name=COLLECTION_NAME)
16
 
17
  ALLOWED_API_KEY = str(API_KEY)
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  @app.get("/")
20
  async def root():
21
  """Root endpoint za provjeru da li aplikacija radi"""
22
- return {"status": "ok", "message": "Senatus API is running", "version": "v2"}
 
 
 
 
 
 
 
 
 
23
 
24
  @app.get("/health")
25
  async def health():
26
  """Health check endpoint"""
27
- return {"status": "healthy"}
28
-
29
- # @app.get("/api/search")
30
- # async def search(q: str, type: int, lt: str | None = None, offset: int = 0):
31
- # query = q.lower()
32
- # xss = nh3.clean(query)
33
- # data = await doc_searcher.search(text=xss,type=type,law_type=lt,offset=offset)
34
- # return data
35
 
36
  @app.get("/api/v2/search")
37
- async def v2_search(q: str):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  query = q.lower()
39
  xss = nh3.clean(query)
40
- data = await doc_searcher_v2.search_semantic(text=xss)
 
 
 
 
 
 
 
 
 
 
41
  return data
 
1
  import nh3
2
+ from fastapi import FastAPI, Query
 
3
  from doc_searcher_v2 import DocSearcherV2
4
  from huggingface_hub import login
5
+ from config import HUGGING_FACE_API_KEY, COLLECTION_NAME, API_KEY
6
+ import time
7
+ import logging
8
+
9
+ # Setup logging
10
+ logging.basicConfig(level=logging.INFO)
11
+ logger = logging.getLogger(__name__)
12
 
13
  login(HUGGING_FACE_API_KEY)
14
 
15
+ app = FastAPI(
16
+ title="Senatus Legal Search API",
17
+ description="Semantička pretraga pravnih dokumenata sa Qwen3 reranker-om",
18
+ version="2.0"
19
+ )
20
 
21
+ # Globalno inicijalizuj DocSearcher (učitava se samo jednom)
22
  doc_searcher_v2 = DocSearcherV2(collection_name=COLLECTION_NAME)
23
 
24
  ALLOWED_API_KEY = str(API_KEY)
25
 
26
+ @app.on_event("startup")
27
+ async def warm_up():
28
+ """Warm up modela pri pokretanju aplikacije"""
29
+ logger.info("🔥 Warming up models...")
30
+ start = time.time()
31
+ try:
32
+ # Pokreni dummy query da učita sve modele u memoriju
33
+ _ = await doc_searcher_v2.search_semantic("test", qdrant_limit=5, top_k=1)
34
+ elapsed = time.time() - start
35
+ logger.info(f"✅ Models ready! Warmup took {elapsed:.1f}s")
36
+ except Exception as e:
37
+ logger.error(f"❌ Warmup failed: {e}")
38
+
39
  @app.get("/")
40
  async def root():
41
  """Root endpoint za provjeru da li aplikacija radi"""
42
+ return {
43
+ "status": "ok",
44
+ "message": "Senatus API is running",
45
+ "version": "2.0",
46
+ "endpoints": {
47
+ "search": "/api/v2/search",
48
+ "docs": "/docs",
49
+ "health": "/health"
50
+ }
51
+ }
52
 
53
  @app.get("/health")
54
  async def health():
55
  """Health check endpoint"""
56
+ return {
57
+ "status": "healthy",
58
+ "models_loaded": True,
59
+ "version": "2.0"
60
+ }
 
 
 
61
 
62
  @app.get("/api/v2/search")
63
+ async def v2_search(
64
+ q: str = Query(..., description="Query tekst za pretragu"),
65
+ limit: int = Query(3, ge=1, le=10, description="Broj rezultata (1-10, default: 3)"),
66
+ qdrant_limit: int = Query(20, ge=10, le=50, description="Broj chunk-ova iz Qdrant-a (10-50, default: 20)")
67
+ ):
68
+ """
69
+ Semantička pretraga pravnih dokumenata
70
+
71
+ - **q**: Tekstualni upit
72
+ - **limit**: Broj rezultata za vraćanje (default: 3, max: 10)
73
+ - **qdrant_limit**: Broj dokumenata iz Qdrant-a prije rerankinga (default: 20, max: 50)
74
+
75
+ Returns: Lista rezultata sa skorovima, sortirana po relevantnosti
76
+ """
77
+ logger.info(f"Search query: '{q}' | limit={limit} | qdrant_limit={qdrant_limit}")
78
+ start = time.time()
79
+
80
+ # Sanitizacija inputa
81
  query = q.lower()
82
  xss = nh3.clean(query)
83
+
84
+ # Pretraga sa parametrima
85
+ data = await doc_searcher_v2.search_semantic(
86
+ text=xss,
87
+ qdrant_limit=qdrant_limit,
88
+ top_k=limit
89
+ )
90
+
91
+ elapsed = time.time() - start
92
+ logger.info(f"Search completed in {elapsed:.2f}s | Results: {len(data)}")
93
+
94
  return data