agent功能开发增加MCP后端
This commit is contained in:
@@ -1431,6 +1431,10 @@ class MCPAgentIntegrated:
|
|||||||
user_query: str,
|
user_query: str,
|
||||||
tools: List[dict],
|
tools: List[dict],
|
||||||
tool_handlers: Dict[str, Any],
|
tool_handlers: Dict[str, Any],
|
||||||
|
session_id: str = None,
|
||||||
|
user_id: str = None,
|
||||||
|
user_nickname: str = None,
|
||||||
|
user_avatar: str = None,
|
||||||
) -> AsyncGenerator[str, None]:
|
) -> AsyncGenerator[str, None]:
|
||||||
"""主流程(流式输出)- 逐步返回执行结果"""
|
"""主流程(流式输出)- 逐步返回执行结果"""
|
||||||
logger.info(f"[Agent Stream] 处理查询: {user_query}")
|
logger.info(f"[Agent Stream] 处理查询: {user_query}")
|
||||||
@@ -1683,6 +1687,36 @@ class MCPAgentIntegrated:
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# 保存 Agent 回复到 ES(如果提供了 session_id)
|
||||||
|
if session_id and user_id:
|
||||||
|
try:
|
||||||
|
# 将执行步骤转换为 JSON 字符串
|
||||||
|
steps_json = json.dumps(
|
||||||
|
[{"tool": step.tool, "status": step.status, "result": step.result} for step in step_results],
|
||||||
|
ensure_ascii=False
|
||||||
|
)
|
||||||
|
|
||||||
|
# 将 plan 转换为 JSON 字符串(ES 中 plan 字段是 text 类型)
|
||||||
|
plan_json = json.dumps({
|
||||||
|
"goal": plan.goal,
|
||||||
|
"reasoning": plan.reasoning,
|
||||||
|
"steps": [{"tool": step.tool, "description": step.description, "parameters": step.parameters} for step in plan.steps]
|
||||||
|
}, ensure_ascii=False)
|
||||||
|
|
||||||
|
es_client.save_chat_message(
|
||||||
|
session_id=session_id,
|
||||||
|
user_id=user_id,
|
||||||
|
user_nickname=user_nickname or "匿名用户",
|
||||||
|
user_avatar=user_avatar or "",
|
||||||
|
message_type="assistant",
|
||||||
|
message=final_summary,
|
||||||
|
plan=plan_json,
|
||||||
|
steps=steps_json,
|
||||||
|
)
|
||||||
|
logger.info(f"[ES] Agent 回复已保存到会话 {session_id}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"[ES] 保存 Agent 回复失败: {e}", exc_info=True)
|
||||||
|
|
||||||
# 发送完成事件
|
# 发送完成事件
|
||||||
yield self._format_sse("done", {"message": "处理完成"})
|
yield self._format_sse("done", {"message": "处理完成"})
|
||||||
|
|
||||||
@@ -1880,6 +1914,23 @@ async def agent_chat_stream(request: AgentChatRequest):
|
|||||||
f"subscription_type: {user_subscription}"
|
f"subscription_type: {user_subscription}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 如果没有提供 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,
|
||||||
|
)
|
||||||
|
logger.info(f"[ES] 用户消息已保存到会话 {session_id}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"[ES] 保存用户消息失败: {e}")
|
||||||
|
|
||||||
# 获取工具列表
|
# 获取工具列表
|
||||||
tools = [tool.dict() for tool in TOOLS]
|
tools = [tool.dict() for tool in TOOLS]
|
||||||
|
|
||||||
@@ -1909,6 +1960,10 @@ async def agent_chat_stream(request: AgentChatRequest):
|
|||||||
user_query=request.message,
|
user_query=request.message,
|
||||||
tools=tools,
|
tools=tools,
|
||||||
tool_handlers=TOOL_HANDLERS,
|
tool_handlers=TOOL_HANDLERS,
|
||||||
|
session_id=session_id,
|
||||||
|
user_id=request.user_id,
|
||||||
|
user_nickname=request.user_nickname,
|
||||||
|
user_avatar=request.user_avatar,
|
||||||
),
|
),
|
||||||
media_type="text/event-stream",
|
media_type="text/event-stream",
|
||||||
headers={
|
headers={
|
||||||
|
|||||||
@@ -414,6 +414,7 @@ const AgentChatV3 = () => {
|
|||||||
content: '',
|
content: '',
|
||||||
plan: currentPlan,
|
plan: currentPlan,
|
||||||
stepResults: stepResults,
|
stepResults: stepResults,
|
||||||
|
isStreaming: true, // 标记为流式输出中
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
});
|
});
|
||||||
setCurrentProgress(85);
|
setCurrentProgress(85);
|
||||||
@@ -430,11 +431,11 @@ const AgentChatV3 = () => {
|
|||||||
} else if (currentEvent === 'summary') {
|
} else if (currentEvent === 'summary') {
|
||||||
// 收到完整总结(包含元数据)
|
// 收到完整总结(包含元数据)
|
||||||
if (summaryMessageId) {
|
if (summaryMessageId) {
|
||||||
// 更新已有消息的元数据
|
// 更新已有消息的元数据,并标记流式输出完成
|
||||||
setMessages((prev) =>
|
setMessages((prev) =>
|
||||||
prev.map((m) =>
|
prev.map((m) =>
|
||||||
m.id === summaryMessageId
|
m.id === summaryMessageId
|
||||||
? { ...m, metadata: data.metadata }
|
? { ...m, metadata: data.metadata, isStreaming: false }
|
||||||
: m
|
: m
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -449,6 +450,7 @@ const AgentChatV3 = () => {
|
|||||||
plan: currentPlan,
|
plan: currentPlan,
|
||||||
stepResults: stepResults,
|
stepResults: stepResults,
|
||||||
metadata: data.metadata,
|
metadata: data.metadata,
|
||||||
|
isStreaming: false, // 非流式,直接标记完成
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -964,7 +966,14 @@ const MessageRenderer = ({ message, userAvatar }) => {
|
|||||||
borderColor={borderColor}
|
borderColor={borderColor}
|
||||||
boxShadow="md"
|
boxShadow="md"
|
||||||
>
|
>
|
||||||
<MarkdownWithCharts content={message.content} />
|
{/* 流式输出中显示纯文本,完成后才渲染 Markdown + 图表 */}
|
||||||
|
{message.isStreaming ? (
|
||||||
|
<Text fontSize="sm" whiteSpace="pre-wrap">
|
||||||
|
{message.content}
|
||||||
|
</Text>
|
||||||
|
) : (
|
||||||
|
<MarkdownWithCharts content={message.content} />
|
||||||
|
)}
|
||||||
|
|
||||||
{/* 元数据 */}
|
{/* 元数据 */}
|
||||||
{message.metadata && (
|
{message.metadata && (
|
||||||
|
|||||||
Reference in New Issue
Block a user