agent功能开发增加MCP后端

This commit is contained in:
2025-11-07 21:46:50 +08:00
parent d1d8d1a25d
commit 3a058fd805
5 changed files with 2098 additions and 6 deletions

View File

@@ -17,6 +17,8 @@ import mcp_database as db
from openai import OpenAI
import json
import asyncio
import uuid
from mcp_elasticsearch import es_client
# 配置日志
logging.basicConfig(level=logging.INFO)
@@ -135,6 +137,10 @@ class AgentChatRequest(BaseModel):
"""聊天请求"""
message: str
conversation_history: List[ConversationMessage] = []
user_id: Optional[str] = None # 用户ID
user_nickname: Optional[str] = None # 用户昵称
user_avatar: Optional[str] = None # 用户头像URL
session_id: Optional[str] = None # 会话ID如果为空则创建新会话
# ==================== MCP工具定义 ====================
@@ -1023,7 +1029,14 @@ class MCPAgentIntegrated:
for tool in tools
])
return f"""你是一个专业的金融研究助手。根据用户问题,制定详细的执行计划
return f"""你是"价小前"北京价值前沿科技公司的AI投研聊天助手
## 你的人格特征
- **名字**: 价小前
- **身份**: 北京价值前沿科技公司的专业AI投研助手
- **专业领域**: 股票投资研究、市场分析、新闻解读、财务分析
- **性格**: 专业、严谨、友好,擅长用简洁的语言解释复杂的金融概念
- **服务宗旨**: 帮助投资者做出更明智的投资决策,提供数据驱动的研究支持
## 可用工具
@@ -1040,7 +1053,7 @@ class MCPAgentIntegrated:
- 概念板块: 相同题材股票分类
## 任务
分析用户问题,制定执行计划。返回 JSON
分析用户问题,制定详细的执行计划。返回 JSON
```json
{{
@@ -1533,7 +1546,32 @@ async def chat(request: ChatRequest):
@app.post("/agent/chat", response_model=AgentResponse)
async def agent_chat(request: AgentChatRequest):
"""智能代理对话端点(非流式)"""
logger.info(f"Agent chat: {request.message}")
logger.info(f"Agent chat: {request.message} (user: {request.user_id})")
# ==================== 权限检查 ====================
# 仅允许 max 用户使用
if request.user_id != "max":
raise HTTPException(
status_code=403,
detail="很抱歉,「价小前投研」功能目前仅对特定用户开放。如需使用,请联系管理员。"
)
# ==================== 会话管理 ====================
# 如果没有提供 session_id创建新会话
session_id = request.session_id or str(uuid.uuid4())
# 保存用户消息到 ES
try:
es_client.save_chat_message(
session_id=session_id,
user_id=request.user_id or "anonymous",
user_nickname=request.user_nickname or "匿名用户",
user_avatar=request.user_avatar or "",
message_type="user",
message=request.message,
)
except Exception as e:
logger.error(f"保存用户消息失败: {e}")
# 获取工具列表
tools = [tool.dict() for tool in TOOLS]
@@ -1565,7 +1603,31 @@ async def agent_chat(request: AgentChatRequest):
tool_handlers=TOOL_HANDLERS,
)
return response
# 保存 Agent 回复到 ES
try:
# 将执行步骤转换为JSON字符串
steps_json = json.dumps(
[{"tool": step.tool, "result": step.result} for step in response.steps],
ensure_ascii=False
)
es_client.save_chat_message(
session_id=session_id,
user_id=request.user_id or "anonymous",
user_nickname=request.user_nickname or "匿名用户",
user_avatar=request.user_avatar or "",
message_type="assistant",
message=response.final_answer,
plan=response.plan,
steps=steps_json,
)
except Exception as e:
logger.error(f"保存 Agent 回复失败: {e}")
# 在响应中返回 session_id
response_dict = response.dict()
response_dict["session_id"] = session_id
return response_dict
@app.post("/agent/chat/stream")
async def agent_chat_stream(request: AgentChatRequest):
@@ -1610,6 +1672,81 @@ async def agent_chat_stream(request: AgentChatRequest):
},
)
# ==================== 聊天记录管理 API ====================
@app.get("/agent/sessions")
async def get_chat_sessions(user_id: str, limit: int = 50):
"""
获取用户的聊天会话列表
Args:
user_id: 用户ID
limit: 返回数量默认50
Returns:
会话列表
"""
try:
sessions = es_client.get_chat_sessions(user_id, limit)
return {
"success": True,
"data": sessions,
"count": len(sessions)
}
except Exception as e:
logger.error(f"获取会话列表失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/agent/history/{session_id}")
async def get_chat_history(session_id: str, limit: int = 100):
"""
获取指定会话的聊天历史
Args:
session_id: 会话ID
limit: 返回数量默认100
Returns:
聊天记录列表
"""
try:
messages = es_client.get_chat_history(session_id, limit)
return {
"success": True,
"data": messages,
"count": len(messages)
}
except Exception as e:
logger.error(f"获取聊天历史失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/agent/search")
async def search_chat_history(user_id: str, query: str, top_k: int = 10):
"""
向量搜索聊天历史
Args:
user_id: 用户ID
query: 查询文本
top_k: 返回数量默认10
Returns:
相关聊天记录列表
"""
try:
results = es_client.search_chat_history(user_id, query, top_k)
return {
"success": True,
"data": results,
"count": len(results)
}
except Exception as e:
logger.error(f"向量搜索失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
# ==================== 健康检查 ====================
@app.get("/health")