fix(gateway): cap chat.history to 1000 messages

This commit is contained in:
Peter Steinberger
2025-12-16 19:44:49 +01:00
parent 2a5f0d6063
commit d691e28675
3 changed files with 49 additions and 4 deletions

View File

@@ -458,7 +458,7 @@ export const CronRunLogEntrySchema = Type.Object(
export const ChatHistoryParamsSchema = Type.Object( export const ChatHistoryParamsSchema = Type.Object(
{ {
sessionKey: NonEmptyString, sessionKey: NonEmptyString,
limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 500 })), limit: Type.Optional(Type.Integer({ minimum: 1 })),
}, },
{ additionalProperties: false }, { additionalProperties: false },
); );

View File

@@ -1786,8 +1786,8 @@ describe("gateway server", () => {
); );
expect(defaultRes.ok).toBe(true); expect(defaultRes.ok).toBe(true);
const defaultMsgs = defaultRes.payload?.messages ?? []; const defaultMsgs = defaultRes.payload?.messages ?? [];
expect(defaultMsgs.length).toBe(200); expect(defaultMsgs.length).toBe(300);
expect(firstContentText(defaultMsgs[0])).toBe("m100"); expect(firstContentText(defaultMsgs[0])).toBe("m0");
const limitedRes = await rpcReq<{ messages?: unknown[] }>( const limitedRes = await rpcReq<{ messages?: unknown[] }>(
ws, ws,
@@ -1802,6 +1802,49 @@ describe("gateway server", () => {
expect(limitedMsgs.length).toBe(5); expect(limitedMsgs.length).toBe(5);
expect(firstContentText(limitedMsgs[0])).toBe("m295"); expect(firstContentText(limitedMsgs[0])).toBe("m295");
const largeLines: string[] = [];
for (let i = 0; i < 1500; i += 1) {
largeLines.push(
JSON.stringify({
message: {
role: "user",
content: [{ type: "text", text: `b${i}` }],
timestamp: Date.now() + i,
},
}),
);
}
await fs.writeFile(
path.join(dir, "sess-main.jsonl"),
largeLines.join("\n"),
"utf-8",
);
const cappedRes = await rpcReq<{ messages?: unknown[] }>(
ws,
"chat.history",
{
sessionKey: "main",
},
);
expect(cappedRes.ok).toBe(true);
const cappedMsgs = cappedRes.payload?.messages ?? [];
expect(cappedMsgs.length).toBe(1000);
expect(firstContentText(cappedMsgs[0])).toBe("b500");
const overLimitRes = await rpcReq<{ messages?: unknown[] }>(
ws,
"chat.history",
{
sessionKey: "main",
limit: 5000,
},
);
expect(overLimitRes.ok).toBe(true);
const overLimitMsgs = overLimitRes.payload?.messages ?? [];
expect(overLimitMsgs.length).toBe(1000);
expect(firstContentText(overLimitMsgs[0])).toBe("b500");
ws.close(); ws.close();
await server.close(); await server.close();
}); });

View File

@@ -1823,7 +1823,9 @@ export async function startGatewayServer(
sessionId && storePath sessionId && storePath
? readSessionMessages(sessionId, storePath) ? readSessionMessages(sessionId, storePath)
: []; : [];
const max = typeof limit === "number" ? limit : 200; const hardMax = 1000;
const requested = typeof limit === "number" ? limit : hardMax;
const max = Math.min(hardMax, requested);
const messages = const messages =
rawMessages.length > max ? rawMessages.slice(-max) : rawMessages; rawMessages.length > max ? rawMessages.slice(-max) : rawMessages;
const thinkingLevel = const thinkingLevel =