瀏覽代碼

fix(langgraph): 问卷生成服务接入旧入口 — src 路由重构为 router + LLM env 兼容 + healthcheck 修复

- src/app.py: 问卷端点抽为 /api/v1 router,保留 /health,供 app.main 复用
- app/main.py: 合并 questionnaire_router,旧路由/中间件/知识库同步不变
- src/llm/client.py: LLM_* 环境变量优先(与 .env.production 一致),兼容 OPENAI_*
- Dockerfile: 新增 COPY src/ src/(生产镜像此前无问卷代码)
- docker-compose.yml: langgraph-svc healthcheck 改用 python urllib 探 /health(镜像无 curl + 原路径 404)
iwt 1 月之前
父節點
當前提交
7077cbabcd
共有 5 個文件被更改,包括 20 次插入14 次删除
  1. 1 0
      cfc-langgraph/Dockerfile
  2. 2 0
      cfc-langgraph/app/main.py
  3. 1 1
      cfc-langgraph/docker-compose.yml
  4. 12 10
      cfc-langgraph/src/app.py
  5. 4 3
      cfc-langgraph/src/llm/client.py

+ 1 - 0
cfc-langgraph/Dockerfile

@@ -11,6 +11,7 @@ RUN tar xzf /tmp/pkgs.tar.gz -C /usr/local/lib/python3.12/site-packages/ && \
     rm /tmp/pkgs.tar.gz
 
 COPY app/ app/
+COPY src/ src/
 COPY data/ data/
 
 RUN useradd -m -u 1000 appuser && \

+ 2 - 0
cfc-langgraph/app/main.py

@@ -5,6 +5,7 @@ import logging
 from fastapi import FastAPI, Request
 from app.api import health, recommend, chat, analyze, tongue, adapter
 from app import monitoring
+from src.app import router as questionnaire_router
 
 logger = logging.getLogger(__name__)
 
@@ -17,6 +18,7 @@ app.include_router(analyze.router)
 app.include_router(tongue.router)
 app.include_router(adapter.router)
 app.include_router(monitoring.router)
+app.include_router(questionnaire_router)
 
 
 @app.middleware("http")

+ 1 - 1
cfc-langgraph/docker-compose.yml

@@ -39,7 +39,7 @@ services:
       - cfc-net
     restart: unless-stopped
     healthcheck:
-      test: ["CMD", "curl", "-f", "http://localhost:9000/api/v1/health"]
+      test: ["CMD", "python", "-c", "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:9000/health', timeout=5).status==200 else 1)"]
       interval: 30s
       timeout: 5s
       retries: 3

+ 12 - 10
cfc-langgraph/src/app.py

@@ -1,26 +1,19 @@
-import os
 import json
-import uuid
 from datetime import datetime
 
 from dotenv import load_dotenv
 load_dotenv()
 
-from fastapi import FastAPI
+from fastapi import APIRouter, FastAPI
 from fastapi.responses import JSONResponse
 
 from .schemas.questionnaire import GenerateRequest, GenerateResponse
 from .graphs.questionnaire import get_questionnaire_graph
 
-app = FastAPI(title="CFC LangGraph 问卷生成服务")
+router = APIRouter(prefix="/api/v1", tags=["questionnaire"])
 
 
-@app.get("/health")
-def health():
-    return {"status": "ok"}
-
-
-@app.post("/api/v1/questionnaire/generate")
+@router.post("/questionnaire/generate")
 async def generate_questionnaire(req: GenerateRequest):
     graph = get_questionnaire_graph()
     try:
@@ -45,3 +38,12 @@ async def generate_questionnaire(req: GenerateRequest):
             status_code=500,
             content={"error": f"graph 执行失败: {str(e)}"}
         )
+
+
+app = FastAPI(title="CFC LangGraph 问卷生成服务")
+app.include_router(router)
+
+
+@app.get("/health")
+def health():
+    return {"status": "ok"}

+ 4 - 3
cfc-langgraph/src/llm/client.py

@@ -3,9 +3,10 @@ from langchain_openai import ChatOpenAI
 
 
 def get_llm() -> ChatOpenAI:
+    # 优先 LLM_* 系列(与 .env.production 一致),兼容 OPENAI_* 系列
     return ChatOpenAI(
-        model=os.getenv("LLM_MODEL", "gpt-4o-mini"),
-        api_key=os.getenv("OPENAI_API_KEY", ""),
-        base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
+        model=os.getenv("LLM_MODEL", os.getenv("OPENAI_MODEL", "gpt-4o-mini")),
+        api_key=os.getenv("LLM_API_KEY", os.getenv("OPENAI_API_KEY", "")),
+        base_url=os.getenv("LLM_BASE_URL", os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")),
         temperature=0.7,
     )