kwedel/FrameworkMatchmaker
0
1import os2from fastapi import FastAPI, HTTPException, Request3from pydantic import BaseModel4from langchain_openai import OpenAIEmbeddings5from langchain_community.vectorstores import FAISS6 7# Load OpenAI key from Hugging Face secret8openai_key = os.getenv("OPENAI_API_KEY")9if not openai_key:10 raise ValueError("โ OPENAI_API_KEY is missing. Add it in Hugging Face Secrets.")11 12# Load FAISS index13vectorstore = FAISS.load_local(14 "framework_index",15 OpenAIEmbeddings(openai_api_key=openai_key),16 allow_dangerous_deserialization=True17)18 19app = FastAPI(title="Framework Matchmaker API")20 21# Request schema22class TaskQuery(BaseModel):23 task_description: str24 top_k: int = 325 source: str = ""26 27# Health check route for container pings28@app.get("/")29def root():30 return {"status": "Framework Matchmaker API is running."}31 32# Main endpoint33@app.post("/recommend")34def recommend_frameworks(query: TaskQuery, request: Request):35 # Soft access control: only allow from Custom GPT36 if query.source != "gpt-custom":37 raise HTTPException(status_code=403, detail="Unauthorized request")38 39 print(f"๐ Source: {query.source}")40 print(f"๐ฏ Task Description: {query.task_description}")41 42 try:43 retriever = vectorstore.as_retriever(search_kwargs={"k": query.top_k})44 results = retriever.get_relevant_documents(query.task_description)45 print(f"โ
Retrieved {len(results)} results")46 47 frameworks = []48 for doc in results:49 meta = doc.metadata50 frameworks.append({51 "name": meta.get("name", "N/A"),52 "category": meta.get("category", "N/A"),53 "description": meta.get("description", "N/A"),54 "template_link": meta.get("template_link", "N/A"),55 "ai_prompt": meta.get("ai_prompt", "N/A")56 })57 58 return {"recommendations": frameworks}59 60 except Exception as e:61 print(f"โ Error: {str(e)}")62 raise HTTPException(status_code=500, detail=str(e))