feat: add pre-compaction memory flush
This commit is contained in:
103
src/auto-reply/reply/memory-flush.test.ts
Normal file
103
src/auto-reply/reply/memory-flush.test.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import {
|
||||
DEFAULT_MEMORY_FLUSH_SOFT_TOKENS,
|
||||
resolveMemoryFlushContextWindowTokens,
|
||||
resolveMemoryFlushSettings,
|
||||
shouldRunMemoryFlush,
|
||||
} from "./memory-flush.js";
|
||||
|
||||
describe("memory flush settings", () => {
|
||||
it("defaults to enabled with fallback prompt and system prompt", () => {
|
||||
const settings = resolveMemoryFlushSettings();
|
||||
expect(settings).not.toBeNull();
|
||||
expect(settings?.enabled).toBe(true);
|
||||
expect(settings?.prompt.length).toBeGreaterThan(0);
|
||||
expect(settings?.systemPrompt.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("respects disable flag", () => {
|
||||
expect(
|
||||
resolveMemoryFlushSettings({
|
||||
agents: {
|
||||
defaults: { compaction: { memoryFlush: { enabled: false } } },
|
||||
},
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it("appends NO_REPLY hint when missing", () => {
|
||||
const settings = resolveMemoryFlushSettings({
|
||||
agents: {
|
||||
defaults: {
|
||||
compaction: {
|
||||
memoryFlush: {
|
||||
prompt: "Write memories now.",
|
||||
systemPrompt: "Flush memory.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
expect(settings?.prompt).toContain("NO_REPLY");
|
||||
expect(settings?.systemPrompt).toContain("NO_REPLY");
|
||||
});
|
||||
});
|
||||
|
||||
describe("shouldRunMemoryFlush", () => {
|
||||
it("requires totalTokens and threshold", () => {
|
||||
expect(
|
||||
shouldRunMemoryFlush({
|
||||
entry: { totalTokens: 0 },
|
||||
contextWindowTokens: 16_000,
|
||||
reserveTokensFloor: 20_000,
|
||||
softThresholdTokens: DEFAULT_MEMORY_FLUSH_SOFT_TOKENS,
|
||||
}),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("skips when under threshold", () => {
|
||||
expect(
|
||||
shouldRunMemoryFlush({
|
||||
entry: { totalTokens: 10_000 },
|
||||
contextWindowTokens: 100_000,
|
||||
reserveTokensFloor: 20_000,
|
||||
softThresholdTokens: 10_000,
|
||||
}),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("skips when already flushed for current compaction count", () => {
|
||||
expect(
|
||||
shouldRunMemoryFlush({
|
||||
entry: {
|
||||
totalTokens: 90_000,
|
||||
compactionCount: 2,
|
||||
memoryFlushCompactionCount: 2,
|
||||
},
|
||||
contextWindowTokens: 100_000,
|
||||
reserveTokensFloor: 5_000,
|
||||
softThresholdTokens: 2_000,
|
||||
}),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("runs when above threshold and not flushed", () => {
|
||||
expect(
|
||||
shouldRunMemoryFlush({
|
||||
entry: { totalTokens: 96_000, compactionCount: 1 },
|
||||
contextWindowTokens: 100_000,
|
||||
reserveTokensFloor: 5_000,
|
||||
softThresholdTokens: 2_000,
|
||||
}),
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveMemoryFlushContextWindowTokens", () => {
|
||||
it("falls back to agent config or default tokens", () => {
|
||||
expect(
|
||||
resolveMemoryFlushContextWindowTokens({ agentCfgContextTokens: 42_000 }),
|
||||
).toBe(42_000);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user