Browse Source

langsmith

jihuaqiang 1 week ago
parent
commit
40959ebcb9
4 changed files with 84 additions and 17 deletions
  1. 15 0
      .env
  2. 17 4
      README.md
  3. 52 6
      agent.py
  4. 0 7
      start_service.sh

+ 15 - 0
.env

@@ -19,3 +19,18 @@ DYNAMIC_HTTP_PROXY=http://t10952018781111:1ap37oc3@d844.kdltps.com:15818
 # GRPC
 CONTAINER_GRPC_HOST=192.168.203.112
 CONTAINER_GRPC_PORT=50051
+
+
+# LangSmith 追踪配置
+# 启用 LangSmith 追踪
+LANGCHAIN_TRACING_V2=false
+
+# LangSmith API 端点
+LANGCHAIN_ENDPOINT=https://api.smith.langchain.com
+
+# 你的 LangSmith API 密钥
+LANGCHAIN_API_KEY=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
+
+# 项目名称(可选)
+LANGCHAIN_PROJECT=knowledge-agent
+

+ 17 - 4
README.md

@@ -100,14 +100,27 @@ uvicorn agent:app --host 0.0.0.0 --port 8080 --reload
 
 ### LangSmith 配置
 
-为了避免网络连接错误,系统会自动禁用 LangSmith 追踪。如果需要启用,可以设置以下环境变量
+系统支持 LangSmith 追踪功能,可以通过 `.env` 文件配置
 
+1. 在 `.env` 文件中配置:
 ```bash
-export LANGCHAIN_TRACING_V2=true
-export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
-export LANGCHAIN_API_KEY="your_langsmith_api_key"
+# 启用 LangSmith 追踪
+LANGCHAIN_TRACING_V2=true
+
+# LangSmith API 端点
+LANGCHAIN_ENDPOINT=https://api.smith.langchain.com
+
+# 你的 LangSmith API 密钥
+LANGCHAIN_API_KEY=your_langsmith_api_key_here
+
+# 项目名称(可选)
+LANGCHAIN_PROJECT=knowledge-agent
 ```
 
+3. 重启服务即可生效
+
+**注意**: 如果没有配置 `.env` 文件或相关环境变量,系统将自动禁用 LangSmith 追踪以避免网络连接错误。
+
 ### 数据库配置
 
 在 `utils/mysql_db.py` 中配置数据库连接信息。

+ 52 - 6
agent.py

@@ -15,11 +15,6 @@ from contextlib import asynccontextmanager
 # 保证可以导入本项目模块
 sys.path.append(os.path.dirname(os.path.abspath(__file__)))
 
-# 禁用 LangSmith 追踪,避免网络连接错误
-os.environ["LANGCHAIN_TRACING_V2"] = "false"
-os.environ["LANGCHAIN_ENDPOINT"] = ""
-os.environ["LANGCHAIN_API_KEY"] = ""
-
 from fastapi import FastAPI, HTTPException, BackgroundTasks
 from fastapi.responses import JSONResponse
 from pydantic import BaseModel, Field
@@ -66,6 +61,28 @@ class TriggerResponse(BaseModel):
 # 全局变量
 identify_tool = None
 
+def update_request_status(request_id: str, status: int):
+    """
+    更新 knowledge_request 表中的 parsing_status
+    
+    Args:
+        request_id: 请求ID
+        status: 状态值 (1: 处理中, 2: 处理完成, 3: 处理失败)
+    """
+    try:
+        from utils.mysql_db import MysqlHelper
+        
+        sql = "UPDATE knowledge_request SET parsing_status = %s WHERE request_id = %s"
+        result = MysqlHelper.update_values(sql, (status, request_id))
+        
+        if result is not None:
+            logger.info(f"更新请求状态成功: requestId={request_id}, status={status}")
+        else:
+            logger.error(f"更新请求状态失败: requestId={request_id}, status={status}")
+            
+    except Exception as e:
+        logger.error(f"更新请求状态异常: requestId={request_id}, status={status}, error={e}")
+
 @asynccontextmanager
 async def lifespan(app: FastAPI):
     """应用生命周期管理"""
@@ -104,6 +121,9 @@ def create_langgraph_workflow():
             request_id = state["request_id"]
             logger.info(f"开始获取数据: requestId={request_id}")
             
+            # 更新状态为处理中
+            update_request_status(request_id, 1)
+            
             items = QueryDataTool.fetch_crawl_data_list(request_id)
             state["items"] = items
             state["processed"] = len(items)
@@ -186,12 +206,16 @@ def create_langgraph_workflow():
     def should_continue(state: AgentState) -> str:
         """判断是否继续处理"""
         if state.get("error"):
+            # 处理失败,更新状态为3
+            update_request_status(state["request_id"], 3)
             return "end"
         
         current_index = state.get("current_index", 0)
         items = state.get("items", [])
         
         if current_index >= len(items):
+            # 所有数据处理完毕,更新状态为2
+            update_request_status(state["request_id"], 2)
             return "end"
         
         return "continue"
@@ -217,7 +241,7 @@ def create_langgraph_workflow():
         }
     )
     
-    # 编译工作流,禁用 LangSmith 追踪
+    # 编译工作流
     return workflow.compile()
 
 # 全局工作流实例
@@ -298,9 +322,14 @@ async def parse_processing(request: TriggerRequest, background_tasks: Background
             # 回退到传统模式
             logger.info("使用传统模式处理")
             
+            # 更新状态为处理中
+            update_request_status(request.requestId, 1)
+            
             # 获取待处理数据
             items = QueryDataTool.fetch_crawl_data_list(request.requestId)
             if not items:
+                # 无数据需要处理,更新状态为完成
+                update_request_status(request.requestId, 2)
                 return TriggerResponse(
                     requestId=request.requestId,
                     processed=0,
@@ -357,12 +386,17 @@ async def parse_processing(request: TriggerRequest, background_tasks: Background
                 success=success_count,
                 details=details
             )
+            
+            # 更新状态为处理完成
+            update_request_status(request.requestId, 2)
         
         logger.info(f"处理完成: requestId={request.requestId}, processed={result.processed}, success={result.success}")
         return result
         
     except Exception as e:
         logger.error(f"处理请求失败: {e}")
+        # 处理失败,更新状态为3
+        update_request_status(request.requestId, 3)
         raise HTTPException(status_code=500, detail=f"处理失败: {str(e)}")
 
 @app.post("/parse/async")
@@ -396,6 +430,9 @@ async def process_request_background(request_id: str):
         
         if WORKFLOW and HAS_LANGGRAPH:
             # 使用 LangGraph 工作流
+            # 更新状态为处理中
+            update_request_status(request_id, 1)
+            
             initial_state = AgentState(
                 request_id=request_id,
                 items=[],
@@ -417,9 +454,14 @@ async def process_request_background(request_id: str):
             
         else:
             # 传统模式
+            # 更新状态为处理中
+            update_request_status(request_id, 1)
+            
             items = QueryDataTool.fetch_crawl_data_list(request_id)
             if not items:
                 logger.info(f"后台处理完成: requestId={request_id}, 无数据需要处理")
+                # 无数据需要处理,更新状态为完成
+                update_request_status(request_id, 2)
                 return
 
             success_count = 0
@@ -450,9 +492,13 @@ async def process_request_background(request_id: str):
                     logger.error(f"后台处理第 {idx} 项时出错: {e}")
 
             logger.info(f"传统模式后台处理完成: requestId={request_id}, processed={len(items)}, success={success_count}")
+            # 更新状态为处理完成
+            update_request_status(request_id, 2)
         
     except Exception as e:
         logger.error(f"后台处理失败: requestId={request_id}, error={e}")
+        # 处理失败,更新状态为3
+        update_request_status(request_id, 3)
 
 if __name__ == "__main__":
     # 启动服务

+ 0 - 7
start_service.sh

@@ -33,16 +33,9 @@ echo "🌟 启动服务..."
 echo "📍 服务地址: http://localhost:8080"
 echo "📚 API文档: http://localhost:8080/docs"
 echo "🔍 健康检查: http://localhost:8080/health"
-echo "🔄 LangGraph 状态: 将在健康检查中显示"
-echo "🚫 LangSmith 追踪已禁用"
 echo ""
 echo "按 Ctrl+C 停止服务"
 echo ""
 
-# 设置环境变量禁用 LangSmith
-export LANGCHAIN_TRACING_V2=false
-export LANGCHAIN_ENDPOINT=""
-export LANGCHAIN_API_KEY=""
-
 # 启动服务
 python3 agent.py