agent功能开发增加MCP后端
This commit is contained in:
@@ -307,6 +307,12 @@ const AgentChatV3 = () => {
|
||||
const decoder = new TextDecoder();
|
||||
let buffer = '';
|
||||
|
||||
// 流式状态变量
|
||||
let thinkingMessageId = null;
|
||||
let thinkingContent = '';
|
||||
let summaryMessageId = null;
|
||||
let summaryContent = '';
|
||||
|
||||
// 读取流式数据
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
@@ -316,11 +322,14 @@ const AgentChatV3 = () => {
|
||||
const lines = buffer.split('\n');
|
||||
buffer = lines.pop(); // 保留不完整的行
|
||||
|
||||
let currentEvent = null;
|
||||
|
||||
for (const line of lines) {
|
||||
if (!line.trim() || line.startsWith(':')) continue;
|
||||
|
||||
if (line.startsWith('event:')) {
|
||||
// 忽略事件类型行
|
||||
// 提取事件类型
|
||||
currentEvent = line.substring(6).trim();
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -328,19 +337,37 @@ const AgentChatV3 = () => {
|
||||
try {
|
||||
const data = JSON.parse(line.substring(5).trim());
|
||||
|
||||
// 处理不同类型的事件
|
||||
if (data.stage === 'planning') {
|
||||
// 正在制定计划
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING));
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_THINKING,
|
||||
content: '正在制定执行计划...',
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(20);
|
||||
} else if (data.goal) {
|
||||
// 根据事件类型处理数据
|
||||
if (currentEvent === 'thinking') {
|
||||
// Kimi 流式思考过程
|
||||
if (!thinkingMessageId) {
|
||||
thinkingMessageId = Date.now();
|
||||
thinkingContent = '';
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING));
|
||||
addMessage({
|
||||
id: thinkingMessageId,
|
||||
type: MessageTypes.AGENT_THINKING,
|
||||
content: '',
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
}
|
||||
thinkingContent += data.content;
|
||||
// 实时更新思考内容
|
||||
setMessages((prev) =>
|
||||
prev.map((m) =>
|
||||
m.id === thinkingMessageId
|
||||
? { ...m, content: thinkingContent }
|
||||
: m
|
||||
)
|
||||
);
|
||||
} else if (currentEvent === 'reasoning') {
|
||||
// Kimi 推理过程(可选显示)
|
||||
logger.info('Kimi reasoning:', data.content);
|
||||
} else if (currentEvent === 'plan') {
|
||||
// 收到执行计划
|
||||
currentPlan = data;
|
||||
thinkingMessageId = null;
|
||||
thinkingContent = '';
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING));
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_PLAN,
|
||||
@@ -349,20 +376,7 @@ const AgentChatV3 = () => {
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(30);
|
||||
} else if (data.stage === 'executing') {
|
||||
// 开始执行步骤
|
||||
const msgId = Date.now();
|
||||
executingMessageId = msgId;
|
||||
addMessage({
|
||||
id: msgId,
|
||||
type: MessageTypes.AGENT_EXECUTING,
|
||||
content: `正在执行 ${data.message}`,
|
||||
plan: currentPlan,
|
||||
stepResults: [],
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(40);
|
||||
} else if (data.step_index !== undefined && data.tool) {
|
||||
} else if (currentEvent === 'step_complete') {
|
||||
// 收到步骤完成事件
|
||||
const stepResult = {
|
||||
step_index: data.step_index,
|
||||
@@ -386,29 +400,90 @@ const AgentChatV3 = () => {
|
||||
// 更新进度
|
||||
const progress = 40 + (stepResults.length / (currentPlan?.steps?.length || 5)) * 40;
|
||||
setCurrentProgress(Math.min(progress, 80));
|
||||
} else if (data.stage === 'summarizing') {
|
||||
// 正在生成总结
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_EXECUTING));
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_THINKING,
|
||||
content: '正在生成分析报告...',
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(85);
|
||||
} else if (data.content) {
|
||||
// 收到最终总结
|
||||
} else if (currentEvent === 'summary_chunk') {
|
||||
// 流式总结内容
|
||||
if (!summaryMessageId) {
|
||||
summaryMessageId = Date.now();
|
||||
summaryContent = '';
|
||||
setMessages((prev) =>
|
||||
prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING && m.type !== MessageTypes.AGENT_EXECUTING)
|
||||
);
|
||||
addMessage({
|
||||
id: summaryMessageId,
|
||||
type: MessageTypes.AGENT_RESPONSE,
|
||||
content: '',
|
||||
plan: currentPlan,
|
||||
stepResults: stepResults,
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(85);
|
||||
}
|
||||
summaryContent += data.content;
|
||||
// 实时更新总结内容
|
||||
setMessages((prev) =>
|
||||
prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING && m.type !== MessageTypes.AGENT_EXECUTING)
|
||||
prev.map((m) =>
|
||||
m.id === summaryMessageId
|
||||
? { ...m, content: summaryContent }
|
||||
: m
|
||||
)
|
||||
);
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_RESPONSE,
|
||||
content: data.content,
|
||||
plan: currentPlan,
|
||||
stepResults: stepResults,
|
||||
metadata: data.metadata,
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
} else if (currentEvent === 'summary') {
|
||||
// 收到完整总结(包含元数据)
|
||||
if (summaryMessageId) {
|
||||
// 更新已有消息的元数据
|
||||
setMessages((prev) =>
|
||||
prev.map((m) =>
|
||||
m.id === summaryMessageId
|
||||
? { ...m, metadata: data.metadata }
|
||||
: m
|
||||
)
|
||||
);
|
||||
} else {
|
||||
// 如果没有流式片段,直接显示完整总结
|
||||
setMessages((prev) =>
|
||||
prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING && m.type !== MessageTypes.AGENT_EXECUTING)
|
||||
);
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_RESPONSE,
|
||||
content: data.content,
|
||||
plan: currentPlan,
|
||||
stepResults: stepResults,
|
||||
metadata: data.metadata,
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
}
|
||||
setCurrentProgress(100);
|
||||
} else if (currentEvent === 'status') {
|
||||
// 状态更新
|
||||
if (data.stage === 'planning') {
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_THINKING));
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_THINKING,
|
||||
content: data.message,
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(10);
|
||||
} else if (data.stage === 'executing') {
|
||||
const msgId = Date.now();
|
||||
executingMessageId = msgId;
|
||||
addMessage({
|
||||
id: msgId,
|
||||
type: MessageTypes.AGENT_EXECUTING,
|
||||
content: data.message,
|
||||
plan: currentPlan,
|
||||
stepResults: [],
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(40);
|
||||
} else if (data.stage === 'summarizing') {
|
||||
setMessages((prev) => prev.filter((m) => m.type !== MessageTypes.AGENT_EXECUTING));
|
||||
addMessage({
|
||||
type: MessageTypes.AGENT_THINKING,
|
||||
content: data.message,
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
setCurrentProgress(80);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
logger.error('解析 SSE 数据失败', e);
|
||||
|
||||
Reference in New Issue
Block a user