Просмотр исходного кода

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 3 месяцев назад
Родитель
Сommit
7077cbabcd

+ 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
     rm /tmp/pkgs.tar.gz
 
 
 COPY app/ app/
 COPY app/ app/
+COPY src/ src/
 COPY data/ data/
 COPY data/ data/
 
 
 RUN useradd -m -u 1000 appuser && \
 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 fastapi import FastAPI, Request
 from app.api import health, recommend, chat, analyze, tongue, adapter
 from app.api import health, recommend, chat, analyze, tongue, adapter
 from app import monitoring
 from app import monitoring
+from src.app import router as questionnaire_router
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
@@ -17,6 +18,7 @@ app.include_router(analyze.router)
 app.include_router(tongue.router)
 app.include_router(tongue.router)
 app.include_router(adapter.router)
 app.include_router(adapter.router)
 app.include_router(monitoring.router)
 app.include_router(monitoring.router)
+app.include_router(questionnaire_router)
 
 
 
 
 @app.middleware("http")
 @app.middleware("http")

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

@@ -39,7 +39,7 @@ services:
       - cfc-net
       - cfc-net
     restart: unless-stopped
     restart: unless-stopped
     healthcheck:
     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
       interval: 30s
       timeout: 5s
       timeout: 5s
       retries: 3
       retries: 3

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

@@ -1,26 +1,19 @@
-import os
 import json
 import json
-import uuid
 from datetime import datetime
 from datetime import datetime
 
 
 from dotenv import load_dotenv
 from dotenv import load_dotenv
 load_dotenv()
 load_dotenv()
 
 
-from fastapi import FastAPI
+from fastapi import APIRouter, FastAPI
 from fastapi.responses import JSONResponse
 from fastapi.responses import JSONResponse
 
 
 from .schemas.questionnaire import GenerateRequest, GenerateResponse
 from .schemas.questionnaire import GenerateRequest, GenerateResponse
 from .graphs.questionnaire import get_questionnaire_graph
 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):
 async def generate_questionnaire(req: GenerateRequest):
     graph = get_questionnaire_graph()
     graph = get_questionnaire_graph()
     try:
     try:
@@ -45,3 +38,12 @@ async def generate_questionnaire(req: GenerateRequest):
             status_code=500,
             status_code=500,
             content={"error": f"graph 执行失败: {str(e)}"}
             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:
 def get_llm() -> ChatOpenAI:
+    # 优先 LLM_* 系列(与 .env.production 一致),兼容 OPENAI_* 系列
     return ChatOpenAI(
     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,
         temperature=0.7,
     )
     )