Spaces:
Sleeping
Sleeping
| # 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 | |
| def root(): | |
| return {"message": "COOK BOOK API ready!"} | |
| 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) |