agent功能开发增加MCP后端
This commit is contained in:
145
mcp_server.py
145
mcp_server.py
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user