fix(ai): require OpenAI Responses terminal events

This commit is contained in:
Mario Zechner
2026-06-23 16:35:45 +02:00
parent 2285f87964
commit cd95c2749f
12 changed files with 378 additions and 39 deletions
@@ -140,4 +140,28 @@ describe("AgentSession.getSessionStats", () => {
session.dispose();
}
});
it("ignores zero-usage messages when checking for post-compaction context usage", () => {
const { session, sessionManager } = createSession();
try {
sessionManager.appendMessage(createUserMessage("first", 1));
sessionManager.appendMessage(createAssistantMessage("response1", 180_000, 2));
const keptUserId = sessionManager.appendMessage(createUserMessage("second", 3));
sessionManager.appendMessage(createAssistantMessage("response2", 195_000, 4));
sessionManager.appendCompaction("summary", keptUserId, 195_000);
sessionManager.appendMessage(createUserMessage("third", 5));
sessionManager.appendMessage(createAssistantMessage("response3", 25_000, 6));
sessionManager.appendMessage(createUserMessage("continue", 7));
sessionManager.appendMessage(createAssistantMessage("partial", 0, 8));
syncAgentMessages(session, sessionManager);
const stats = session.getSessionStats();
expect(stats.contextUsage).toBeDefined();
expect(stats.contextUsage?.tokens).not.toBeNull();
expect(stats.contextUsage?.tokens ?? 0).toBeGreaterThan(25_000);
} finally {
session.dispose();
}
});
});
@@ -9,6 +9,7 @@ import {
calculateContextTokens,
compact,
DEFAULT_COMPACTION_SETTINGS,
estimateContextTokens,
findCutPoint,
getLastAssistantUsage,
prepareCompaction,
@@ -217,12 +218,43 @@ describe("getLastAssistantUsage", () => {
expect(usage!.input).toBe(100);
});
it("should skip all-zero assistant usage", () => {
const entries: SessionEntry[] = [
createMessageEntry(createUserMessage("Hello")),
createMessageEntry(createAssistantMessage("Hi", createMockUsage(100, 50))),
createMessageEntry(createUserMessage("continue")),
createMessageEntry(createAssistantMessage("Partial", createMockUsage(0, 0))),
];
const usage = getLastAssistantUsage(entries);
expect(usage).not.toBeNull();
expect(usage!.input).toBe(100);
});
it("should return undefined if no assistant messages", () => {
const entries: SessionEntry[] = [createMessageEntry(createUserMessage("Hello"))];
expect(getLastAssistantUsage(entries)).toBeUndefined();
});
});
describe("estimateContextTokens", () => {
it("uses the last non-zero assistant usage as the context anchor", () => {
const messages: AgentMessage[] = [
createUserMessage("Hello"),
createAssistantMessage("Hi", createMockUsage(100, 50)),
createUserMessage("continue"),
createAssistantMessage("Partial thinking", createMockUsage(0, 0)),
];
const estimate = estimateContextTokens(messages);
expect(estimate.usageTokens).toBe(150);
expect(estimate.lastUsageIndex).toBe(1);
expect(estimate.trailingTokens).toBeGreaterThan(0);
expect(estimate.tokens).toBe(150 + estimate.trailingTokens);
});
});
describe("shouldCompact", () => {
it("should return true when context exceeds threshold", () => {
const settings: CompactionSettings = {