# app.py import os import uvicorn from fastapi import FastAPI, HTTPException from pydantic import BaseModel from dotenv import load_dotenv from rag import build_rag_chain load_dotenv() app = FastAPI( title="Recipe RAG API (Gemini 2.0)", description="使用 FastAPI + LangChain + postgres + PGVector + HuggingFace Embeddings 的服務", version="1.0.0" ) # 建立 RAG chain(可共用) RAG_CHAIN = build_rag_chain(k=4) class RecipeRequest(BaseModel): query: str @app.get("/") def root(): return {"message": "COOK BOOK API ready!"} @app.post("/recipe") def generate_recipe(req: RecipeRequest): if not req.query or req.query.strip() == "": raise HTTPException(status_code=400, detail="query 必填") try: # 使用 LangChain chain 呼叫 output = RAG_CHAIN( req.query ) # output 結構通常包含 'result' 和 'source_documents' result_text = output.get("result") or output.get("output_text") or str(output) sources = [] for d in output.get("source_documents", []): sources.append({"content": d.page_content, "meta": getattr(d, "metadata", {})}) return {"query": req.query, "recipe": result_text, "sources": sources} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=False)