hardkpentium101 Qwen-Coder commited on
Commit
8c73bf4
·
1 Parent(s): 07bfaca

Fix: Run backend on port 7860 for HF Spaces

Browse files

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

Files changed (4) hide show
  1. Dockerfile +7 -10
  2. app.py +66 -0
  3. backend/main.py +75 -13
  4. docker-compose.yml +2 -8
Dockerfile CHANGED
@@ -2,19 +2,16 @@ FROM python:3.10-slim
2
 
3
  WORKDIR /app
4
 
5
- # Install system deps
6
- RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
7
 
8
- # Set env
9
  ENV PYTHONUNBUFFERED=1
10
 
11
- # Install deps
12
- COPY backend/requirements.txt .
13
  RUN pip install --no-cache-dir -r requirements.txt
14
 
15
- # Copy code
16
- COPY backend/ .
17
 
18
- # Start
19
- EXPOSE 8000
20
- CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
 
2
 
3
  WORKDIR /app
4
 
5
+ RUN apt-get update && apt-get install -y gcc g++ curl && rm -rf /var/lib/apt/lists/*
 
6
 
 
7
  ENV PYTHONUNBUFFERED=1
8
 
9
+ COPY requirements.txt .
 
10
  RUN pip install --no-cache-dir -r requirements.txt
11
 
12
+ COPY backend/ ./backend/
13
+ COPY app.py ./app.py
14
 
15
+ EXPOSE 7860
16
+
17
+ CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Simple RAG - Streamlit App
3
+ Combined frontend and backend for HF Spaces
4
+ """
5
+ import os
6
+ import sys
7
+ import logging
8
+
9
+ # Setup logging
10
+ logging.basicConfig(level=logging.INFO)
11
+ logger = logging.getLogger(__name__)
12
+
13
+ logger.info("=== Simple RAG Starting ===")
14
+
15
+ import streamlit as st
16
+ import httpx
17
+
18
+ # Configuration
19
+ st.set_page_config(page_title="Simple RAG", page_icon="🤖", layout="centered")
20
+
21
+ SUPPORTED_LANGUAGES = [
22
+ {"code": "hi", "name": "Hindi", "native": "हिंदी"},
23
+ {"code": "bn", "name": "Bengali", "native": "বাংলা"},
24
+ {"code": "gu", "name": "Gujarati", "native": "ગુજરાતી"},
25
+ {"code": "kn", "name": "Kannada", "native": "ಕನ್ನಡ"},
26
+ {"code": "ml", "name": "Malayalam", "native": "മലയാളം"},
27
+ {"code": "mr", "name": "Marathi", "native": "मराठी"},
28
+ {"code": "or", "name": "Odia", "native": "ଓଡ଼ିଆ"},
29
+ {"code": "pa", "name": "Punjabi", "native": "ਪੰਜਾਬੀ"},
30
+ {"code": "ta", "name": "Tamil", "native": "தமிழ்"},
31
+ {"code": "te", "name": "Telugu", "native": "తెలుగు"},
32
+ ]
33
+
34
+ st.title("🤖 Simple RAG System")
35
+ st.markdown("Ask questions in any supported Indic language.")
36
+
37
+ # Language selection
38
+ language_options = [f"{lang['native']} ({lang['name']})" for lang in SUPPORTED_LANGUAGES]
39
+ selected_language = st.selectbox("Choose a language", options=language_options, index=0)
40
+ selected_lang_code = SUPPORTED_LANGUAGES[language_options.index(selected_language)]["code"]
41
+
42
+ # Query input
43
+ query = st.text_area("Ask Your Question", height=100, placeholder=f"Type in {selected_language}...")
44
+
45
+ if st.button("🔍 Search"):
46
+ if not query.strip():
47
+ st.warning("Please enter a question")
48
+ else:
49
+ with st.spinner("Searching..."):
50
+ try:
51
+ response = httpx.post(
52
+ "http://localhost:8000/query",
53
+ json={"query": query, "top_k": 5, "language": selected_lang_code},
54
+ timeout=120.0
55
+ )
56
+ if response.status_code == 200:
57
+ result = response.json()
58
+ st.write("### Answer")
59
+ st.write(result["answer"])
60
+ else:
61
+ st.error(f"Error: {response.status_code}")
62
+ except Exception as e:
63
+ st.error(f"Error: {str(e)}")
64
+
65
+ st.markdown("---")
66
+ st.markdown("Simple RAG - Powered by Sarvam-1 and Qdrant")
backend/main.py CHANGED
@@ -1,9 +1,10 @@
1
  """
2
- Minimal FastAPI backend - test if container starts
3
  """
4
  import os
5
  import sys
6
  import logging
 
7
 
8
  # Setup logging FIRST
9
  logging.basicConfig(
@@ -13,30 +14,91 @@ logging.basicConfig(
13
  )
14
  logger = logging.getLogger(__name__)
15
 
16
- logger.info("=== CONTAINER STARTING ===")
17
- logger.info(f"Python version: {sys.version}")
18
- logger.info(f"QDRANT_URL env set: {bool(os.getenv('QDRANT_URL'))}")
19
- logger.info(f"HF_TOKEN env set: {bool(os.getenv('HF_TOKEN'))}")
20
 
21
- from fastapi import FastAPI
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  app = FastAPI(title="Simple RAG API")
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  @app.get("/")
26
  def root():
27
- logger.info("Root endpoint called")
28
  return {"status": "running", "message": "Simple RAG API"}
29
 
30
  @app.get("/health")
31
  def health():
32
- logger.info("Health check called")
33
  return {"status": "healthy"}
34
 
35
- @app.get("/test")
36
- def test():
37
- return {"env": dict(os.environ)}
 
 
 
 
 
 
 
 
 
38
 
39
  if __name__ == "__main__":
40
  import uvicorn
41
- logger.info("=== Starting uvicorn on 0.0.0.0:8000 ===")
42
- uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info")
 
1
  """
2
+ FastAPI Backend for Simple RAG - HF Spaces
3
  """
4
  import os
5
  import sys
6
  import logging
7
+ from pathlib import Path
8
 
9
  # Setup logging FIRST
10
  logging.basicConfig(
 
14
  )
15
  logger = logging.getLogger(__name__)
16
 
17
+ logger.info("=== Simple RAG Backend Starting ===")
18
+ logger.info(f"Python: {sys.version}")
 
 
19
 
20
+ # Add src to path
21
+ sys.path.insert(0, str(Path(__file__).parent / "src"))
22
+
23
+ from fastapi import FastAPI, HTTPException
24
+ from fastapi.middleware.cors import CORSMiddleware
25
+ from pydantic import BaseModel
26
+ from typing import Optional, List, Dict
27
+
28
+ logger.info("Importing modules...")
29
+
30
+ try:
31
+ from rag_system import SimpleRAGSystem
32
+ from language_constants import get_supported_languages
33
+ logger.info("✓ Modules imported")
34
+ except Exception as e:
35
+ logger.error(f"✗ Import failed: {e}")
36
+ raise
37
 
38
  app = FastAPI(title="Simple RAG API")
39
 
40
+ app.add_middleware(
41
+ CORSMiddleware,
42
+ allow_origins=["*"],
43
+ allow_credentials=True,
44
+ allow_methods=["*"],
45
+ allow_headers=["*"],
46
+ )
47
+
48
+ class QueryRequest(BaseModel):
49
+ query: str
50
+ top_k: int = 5
51
+ language: Optional[str] = None
52
+
53
+ class QueryResponse(BaseModel):
54
+ question: str
55
+ answer: str
56
+ user_selected_language: Optional[str]
57
+ supported_languages: List[Dict[str, str]]
58
+
59
+ rag_system: Optional[SimpleRAGSystem] = None
60
+
61
+ def get_rag_system():
62
+ global rag_system
63
+ if rag_system is None:
64
+ logger.info("Initializing RAG system...")
65
+ rag_system = SimpleRAGSystem()
66
+ logger.info("✓ RAG initialized")
67
+ return rag_system
68
+
69
+ @app.on_event("startup")
70
+ async def startup():
71
+ logger.info("=== Startup ===")
72
+ logger.info(f"QDRANT_URL: {bool(os.getenv('QDRANT_URL'))}")
73
+ logger.info(f"HF_TOKEN: {bool(os.getenv('HF_TOKEN'))}")
74
+ try:
75
+ get_rag_system()
76
+ logger.info("✓ Startup complete")
77
+ except Exception as e:
78
+ logger.error(f"✗ Startup failed: {e}")
79
+
80
  @app.get("/")
81
  def root():
 
82
  return {"status": "running", "message": "Simple RAG API"}
83
 
84
  @app.get("/health")
85
  def health():
 
86
  return {"status": "healthy"}
87
 
88
+ @app.get("/languages")
89
+ def languages():
90
+ return {"languages": get_supported_languages()}
91
+
92
+ @app.post("/query")
93
+ async def query(req: QueryRequest):
94
+ try:
95
+ result = get_rag_system().query(req.query, req.top_k, req.language)
96
+ return QueryResponse(**result)
97
+ except Exception as e:
98
+ logger.error(f"Query error: {e}")
99
+ raise HTTPException(500, str(e))
100
 
101
  if __name__ == "__main__":
102
  import uvicorn
103
+ logger.info("Starting uvicorn on 0.0.0.0:8000")
104
+ uvicorn.run(app, host="0.0.0.0", port=8000)
docker-compose.yml CHANGED
@@ -2,15 +2,9 @@ version: '3.8'
2
 
3
  services:
4
  backend:
5
- build:
6
- context: .
7
- dockerfile: Dockerfile
8
  ports:
9
- - "8000:8000"
10
  env_file:
11
  - .env
12
- environment:
13
- - QDRANT_URL=${QDRANT_URL:-}
14
- - QDRANT_API_KEY=${QDRANT_API_KEY:-}
15
- - HF_TOKEN=${HF_TOKEN:-}
16
  restart: unless-stopped
 
2
 
3
  services:
4
  backend:
5
+ build: .
 
 
6
  ports:
7
+ - "7860:7860"
8
  env_file:
9
  - .env
 
 
 
 
10
  restart: unless-stopped