diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 03973318..18385c77 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -8,6 +8,7 @@ ### Fixed +- Fixed compaction and branch-summary requests to use fresh routing session IDs with prompt caching disabled where supported. - Fixed explicit self-updates when `PI_SKIP_VERSION_CHECK` is set ([#6977](https://github.com/earendil-works/pi/issues/6977)). ## [0.81.1] - 2026-07-21 diff --git a/packages/coding-agent/src/core/compaction/compaction.ts b/packages/coding-agent/src/core/compaction/compaction.ts index 0ae6deeb..3f9b90ca 100644 --- a/packages/coding-agent/src/core/compaction/compaction.ts +++ b/packages/coding-agent/src/core/compaction/compaction.ts @@ -6,7 +6,7 @@ */ import type { AgentMessage, StreamFn, ThinkingLevel } from "@earendil-works/pi-agent-core"; -import { contentText, type RetryCallbacks, type RetryPolicy, retryAssistantCall } from "@earendil-works/pi-ai"; +import { contentText, type RetryCallbacks, type RetryPolicy, retryAssistantCall, uuidv7 } from "@earendil-works/pi-ai"; import type { AssistantMessage, Context, Model, SimpleStreamOptions, Usage } from "@earendil-works/pi-ai/compat"; import { completeSimple } from "@earendil-works/pi-ai/compat"; import { convertToLlm } from "../messages.ts"; @@ -567,9 +567,17 @@ export async function completeSummarization( retry?: RetryPolicy, callbacks?: RetryCallbacks, ): Promise { + // Summaries are standalone requests, so isolate routing and avoid cache writes that cannot be reused. + const requestOptions: SimpleStreamOptions = { + ...options, + cacheRetention: "none", + sessionId: uuidv7(), + }; const produce = async (): Promise => - streamFn ? (await streamFn(model, context, options)).result() : completeSimple(model, context, options); - return retryAssistantCall(produce, retry, options.signal, callbacks); + streamFn + ? (await streamFn(model, context, requestOptions)).result() + : completeSimple(model, context, requestOptions); + return retryAssistantCall(produce, retry, requestOptions.signal, callbacks); } /** diff --git a/packages/coding-agent/test/compaction-summary-reasoning.test.ts b/packages/coding-agent/test/compaction-summary-reasoning.test.ts index 41766238..e79a5504 100644 --- a/packages/coding-agent/test/compaction-summary-reasoning.test.ts +++ b/packages/coding-agent/test/compaction-summary-reasoning.test.ts @@ -90,6 +90,18 @@ describe("generateSummary reasoning options", () => { ); }); + it("uses fresh routing sessions without prompt caching", async () => { + await generateSummary(messages, createModel(false), 2000, "test-key"); + await generateSummary(messages, createModel(false), 2000, "test-key"); + + const requestOptions = completeSimpleMock.mock.calls.map((call) => call[2]); + expect(requestOptions).toHaveLength(2); + expect(requestOptions.every((options) => options?.cacheRetention === "none")).toBe(true); + + const sessionIds = requestOptions.map((options) => options?.sessionId); + expect(sessionIds[0]).not.toBe(sessionIds[1]); + }); + it("does not set reasoning when thinking is off", async () => { await generateSummary( messages,