File size: 1,409 Bytes
a9e6507
 
 
 
 
 
 
 
 
 
 
a4137be
a9e6507
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# 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)