fix(coding-agent): isolate summarization requests
CI / build-check-test (push) Has been cancelled

This commit is contained in:
Armin Ronacher
2026-07-22 23:54:57 +02:00
parent ecb9410c5c
commit 9b3a205917
3 changed files with 24 additions and 3 deletions
+1
View File
@@ -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
@@ -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<AssistantMessage> {
// 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<AssistantMessage> =>
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);
}
/**
@@ -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,