File size: 2,601 Bytes
ec77441
 
 
 
 
 
5ba6f92
 
 
ec77441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import shutil
from typing import List, Optional
from fastapi import FastAPI, UploadFile, File, Header, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from core.config import settings
from core.ingestion import processor
from core.model import generator

app = FastAPI(title=settings.APP_NAME)

# CORS configuration
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# Authentication Dependency
def verify_api_key(x_api_key: Optional[str] = Header(None)):
    if settings.API_KEY and x_api_key != settings.API_KEY:
        raise HTTPException(status_code=403, detail="Invalid API Key")
    return x_api_key

class GenerateRequest(BaseModel):
    course_name: str
    description: str
    constraints: Optional[str] = ""
    max_tokens: int = 2000

@app.get("/health")
def health_check():
    return {
        "status": "healthy",
        "device": settings.DEVICE,
        "gpu_available": generator.is_gpu
    }

@app.post("/ingest")
async def ingest_file(file: UploadFile = File(...), api_key: str = Depends(verify_api_key)):
    if file.size > settings.MAX_FILE_SIZE:
        raise HTTPException(status_code=413, detail="File too large")
    
    file_path = os.path.join(settings.UPLOAD_DIR, file.filename)
    with open(file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)
    
    chunks = processor.ingest_document(file_path)
    if chunks is None:
        raise HTTPException(status_code=400, detail="Could not extract text from file")
        
    return {"filename": file.filename, "chunks_ingested": chunks}

@app.post("/generate_syllabus")
async def generate_syllabus(req: GenerateRequest, api_key: str = Depends(verify_api_key)):
    # 1. Search for relevant context
    query = f"{req.course_name} {req.description}"
    docs = processor.search(query, k=5)
    context = "\n".join([d.page_content for d in docs])
    
    # 2. Build prompt
    prompt = f"Design a comprehensive syllabus for a course titled '{req.course_name}'. Description: {req.description}. Constraints: {req.constraints}"
    
    # 3. Generate
    syllabus = generator.generate(prompt, context=context, max_tokens=req.max_tokens)
    
    return {
        "course_name": req.course_name,
        "syllabus": syllabus,
        "sources": [d.metadata["source"] for d in docs]
    }

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=settings.PORT)