File size: 2,935 Bytes
c151c44
 
ed5b42d
c151c44
 
77e56ff
c151c44
8fde879
17ea087
8fde879
77e56ff
ed5b42d
17ea087
c151c44
 
 
ed5b42d
 
 
 
 
 
 
 
 
 
 
 
 
c151c44
 
ed5b42d
30989e3
 
 
c151c44
fefb5c9
 
 
c151c44
 
 
 
fefb5c9
 
dcefa44
fefb5c9
77e56ff
 
 
fefb5c9
 
 
8fde879
fefb5c9
 
8fde879
fefb5c9
 
 
 
 
 
 
 
dcefa44
 
77e56ff
 
 
 
 
dcefa44
c151c44
 
77e56ff
 
 
 
 
c151c44
 
 
77e56ff
 
 
 
 
c151c44
 
 
77e56ff
 
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from backend.utils import generate_completions
from backend.utils.handlers import handle_generation_request, INSTRUCTION_TEMPLATES
from backend import config
from typing import Union, List, Literal, Optional
import logging
import json
from backend.cache import cache

logging.basicConfig(level=logging.INFO)

app = FastAPI()

# Add CORS middleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Allows all origins
    allow_credentials=True,
    allow_methods=["*"],  # Allows all methods
    allow_headers=["*"],  # Allows all headers
)

class Message(BaseModel):
    role: Literal["user", "assistant"]
    content: str

class GenerationRequest(BaseModel):
    user_id: int
    query: Union[str, List[Message]]
    native_language: Optional[str] = None
    target_language: Optional[str] = None
    proficiency: Optional[str] = None

class MetadataRequest(BaseModel):
    query: str

@app.get("/")
async def root():
    return {"message": "Welcome to the AI Learning Assistant API!"}

@app.post("/extract/metadata")
async def extract_metadata(data: MetadataRequest):
    logging.info(f"Query: {data.query}")
    try:
        response_str = await cache.get_or_set(
            (str(data.query), config.language_metadata_extraction_prompt),
            generate_completions.get_completions,
            data.query,
            config.language_metadata_extraction_prompt
        )
        metadata_dict = json.loads(response_str)
        return JSONResponse(
            content={
                "data": metadata_dict,
                "type": "language_metadata",
                "status": "success"
            },
            status_code=200
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/generate/curriculum")
async def generate_curriculum(data: GenerationRequest):
    return await handle_generation_request(
        data=data,
        mode="curriculum",
        instructions_template=INSTRUCTION_TEMPLATES["curriculum"]
    )

@app.post("/generate/flashcards")
async def generate_flashcards(data: GenerationRequest):
    return await handle_generation_request(
        data=data,
        mode="flashcards",
        instructions_template=INSTRUCTION_TEMPLATES["flashcards"]
    )

@app.post("/generate/exercises")
async def generate_exercises(data: GenerationRequest):
    return await handle_generation_request(
        data=data,
        mode="exercises",
        instructions_template=INSTRUCTION_TEMPLATES["exercises"]
    )

@app.post("/generate/simulation")
async def generate_simulation(data: GenerationRequest):
    return await handle_generation_request(
        data=data,
        mode="simulation",
        instructions_template=INSTRUCTION_TEMPLATES["simulation"]
    )