From 5fe74b39d72816ac980cf54ec6581e3a2dbb9f5e Mon Sep 17 00:00:00 2001 From: yibo Date: Thu, 27 Aug 2026 01:06:16 +0800 Subject: [PATCH] fix(open-api): 全局 agent invoke 端点补写会话历史 --- server/routes/agent-chat.js | 7 +++++++ server/routes/open-api.js | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/server/routes/agent-chat.js b/server/routes/agent-chat.js index 539fbb1..1c2f668 100644 --- a/server/routes/agent-chat.js +++ b/server/routes/agent-chat.js @@ -2872,3 +2872,10 @@ ${resultsText.join('\n\n')} }); module.exports = router; +// 供 open-api.js 的 invoke 端点复用——外部 API 调用也要写进同一份会话存储, +// 否则网页 AgentChat 看不到 API 触发的对话(见 docs/done/open-api-manual.md 的 invoke 端点)。 +module.exports.loadMeta = loadMeta; +module.exports.saveMeta = saveMeta; +module.exports.appendHistory = appendHistory; +module.exports.logMessage = logMessage; +module.exports.flushLogBufferForConv = flushLogBufferForConv; diff --git a/server/routes/open-api.js b/server/routes/open-api.js index 7ce23b0..2d5ad0e 100644 --- a/server/routes/open-api.js +++ b/server/routes/open-api.js @@ -607,9 +607,26 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont const { loadConfigFromSkills } = require('../src/core/skill-config-loader'); const AgentManager = require('../src/core/agent-manager'); const config = require('../config'); + // 复用 agent-chat.js 的会话存储,让 API 调用也能在网页 AgentChat 里追溯 + // (否则 job 结果只落 .data/jobs-openapi.json,网页永远看不到)。 + const agentChat = require('./agent-chat'); + const convId = `conv-${Date.now().toString(36)}`; jobManager.updateJob(job.jobId, { status: 'running', progress: 'Initializing agent session...' }); + agentChat.saveMeta(namespacedId, convId, { + conversationId: convId, + agentId: namespacedId, + title: task.slice(0, 50), + type: 'api_invoke', + createdAt: new Date().toISOString(), + status: 'running', + stats: { messageCount: 1, toolCallCount: 0 }, + jobId: job.jobId, + }); + agentChat.logMessage(namespacedId, convId, 'user', task); + agentChat.appendHistory(namespacedId, convId, { role: 'user', content: task, messageId: `job-${job.jobId}`, timestamp: new Date().toISOString() }); + let enrichedTask = task; // Process Context Files @@ -662,18 +679,28 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont try { const result = await manager.callAgent(namespacedId, enrichedTask, { onData: onData(namespacedId) }); - - jobManager.updateJob(job.jobId, { - status: 'completed', - progress: 'Invocation completed', - result: { - output: result.output || fullOutput || '(Empty Output)' + const output = result.output || fullOutput || '(Empty Output)'; + + jobManager.updateJob(job.jobId, { + status: 'completed', + progress: 'Invocation completed', + result: { + output } }); + agentChat.logMessage(namespacedId, convId, 'agent', output); + agentChat.appendHistory(namespacedId, convId, { role: 'assistant', content: output, messageId: `job-${job.jobId}-out`, timestamp: new Date().toISOString() }); + const meta = agentChat.loadMeta(namespacedId, convId); + if (meta) { meta.status = 'completed'; agentChat.saveMeta(namespacedId, convId, meta); } + agentChat.flushLogBufferForConv(namespacedId, convId); + try { await manager.closeAllSessions(); } catch {} } catch (err) { jobManager.updateJob(job.jobId, { status: 'failed', error: err.message, progress: `Agent execution failed: ${err.message}` }); + const meta = agentChat.loadMeta(namespacedId, convId); + if (meta) { meta.status = 'failed'; agentChat.saveMeta(namespacedId, convId, meta); } + agentChat.flushLogBufferForConv(namespacedId, convId); try { await manager.closeAllSessions(); } catch {} throw err; } -- libgit2 0.21.4