refactor(storage): 统一消息存储到 Core 层
问题:Server 端只存储最终文本响应,工具调用的中间消息丢失。 解决方案: - Agent.chat() 返回 ChatResult,包含完整消息链 - Server SessionManager 简化为只管理会话元数据 - 消息 API 改为从 Core Storage 读取 - 移除 Server 端的消息存储和 addMessage 方法 影响范围: - core: Agent.chat() 返回类型变更 - server: SessionManager 接口变更,移除消息存储 - server: GET /sessions/:id/messages 从 Core 读取 - server: 移除 POST /sessions/:id/messages 端点
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
import { Hono } from 'hono';
|
||||
import { getSessionManager } from '../session/manager.js';
|
||||
import { CreateSessionInputSchema, SendMessageInputSchema } from '../types.js';
|
||||
import { CreateSessionInputSchema } from '../types.js';
|
||||
|
||||
export const sessionsRouter = new Hono();
|
||||
|
||||
@@ -99,8 +99,10 @@ sessionsRouter.delete('/:id', async (c) => {
|
||||
|
||||
/**
|
||||
* GET /sessions/:id/messages - 获取会话消息
|
||||
*
|
||||
* 从 Core 存储读取完整的消息历史(包含 tool-call 和 tool-result)
|
||||
*/
|
||||
sessionsRouter.get('/:id/messages', (c) => {
|
||||
sessionsRouter.get('/:id/messages', async (c) => {
|
||||
const id = c.req.param('id');
|
||||
|
||||
if (!sessionManager.exists(id)) {
|
||||
@@ -113,66 +115,27 @@ sessionsRouter.get('/:id/messages', (c) => {
|
||||
);
|
||||
}
|
||||
|
||||
const messages = sessionManager.getMessages(id);
|
||||
// 从 Core Storage 读取消息
|
||||
const storage = sessionManager.getStorage();
|
||||
if (!storage) {
|
||||
return c.json({
|
||||
success: true,
|
||||
data: [],
|
||||
});
|
||||
}
|
||||
|
||||
const projectId = sessionManager.getProjectId(id);
|
||||
const sessionData = await storage.loadSession(projectId, id);
|
||||
|
||||
if (!sessionData) {
|
||||
return c.json({
|
||||
success: true,
|
||||
data: [],
|
||||
});
|
||||
}
|
||||
|
||||
return c.json({
|
||||
success: true,
|
||||
data: messages,
|
||||
data: sessionData.messages,
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /sessions/:id/messages - 发送消息
|
||||
*
|
||||
* 注意: 这个端点仅用于添加消息记录。
|
||||
* 实际的 AI 对话应该通过 WebSocket 进行。
|
||||
*/
|
||||
sessionsRouter.post('/:id/messages', async (c) => {
|
||||
const id = c.req.param('id');
|
||||
|
||||
if (!sessionManager.exists(id)) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
error: 'Session not found',
|
||||
},
|
||||
404
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
const body = await c.req.json();
|
||||
const input = SendMessageInputSchema.parse(body);
|
||||
|
||||
const message = await sessionManager.addMessage(id, {
|
||||
role: input.role,
|
||||
content: input.content,
|
||||
});
|
||||
|
||||
if (!message) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
error: 'Failed to add message',
|
||||
},
|
||||
500
|
||||
);
|
||||
}
|
||||
|
||||
return c.json(
|
||||
{
|
||||
success: true,
|
||||
data: message,
|
||||
},
|
||||
201
|
||||
);
|
||||
} catch (error) {
|
||||
return c.json(
|
||||
{
|
||||
success: false,
|
||||
error: error instanceof Error ? error.message : 'Invalid input',
|
||||
},
|
||||
400
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user