Compaction/Safeguard: add summary quality audit retries (#25556)

Merged via squash.

Prepared head SHA: be473efd16
Co-authored-by: rodrigouroz <384037+rodrigouroz@users.noreply.github.com>
Co-authored-by: jalehman <550978+jalehman@users.noreply.github.com>
Reviewed-by: @jalehman
This commit is contained in:
Rodrigo Uroz
2026-03-05 18:39:25 -03:00
committed by GitHub
parent 029c473727
commit 036c329716
15 changed files with 967 additions and 65 deletions

View File

@@ -0,0 +1,74 @@
import type { Api, Model } from "@mariozechner/pi-ai";
import type { SessionManager } from "@mariozechner/pi-coding-agent";
import { describe, expect, it } from "vitest";
import type { OpenClawConfig } from "../../config/config.js";
import { getCompactionSafeguardRuntime } from "../pi-extensions/compaction-safeguard-runtime.js";
import compactionSafeguardExtension from "../pi-extensions/compaction-safeguard.js";
import { buildEmbeddedExtensionFactories } from "./extensions.js";
describe("buildEmbeddedExtensionFactories", () => {
it("does not opt safeguard mode into quality-guard retries", () => {
const sessionManager = {} as SessionManager;
const model = {
id: "claude-sonnet-4-20250514",
contextWindow: 200_000,
} as Model<Api>;
const cfg = {
agents: {
defaults: {
compaction: {
mode: "safeguard",
},
},
},
} as OpenClawConfig;
const factories = buildEmbeddedExtensionFactories({
cfg,
sessionManager,
provider: "anthropic",
modelId: "claude-sonnet-4-20250514",
model,
});
expect(factories).toContain(compactionSafeguardExtension);
expect(getCompactionSafeguardRuntime(sessionManager)).toMatchObject({
qualityGuardEnabled: false,
});
});
it("wires explicit safeguard quality-guard runtime flags", () => {
const sessionManager = {} as SessionManager;
const model = {
id: "claude-sonnet-4-20250514",
contextWindow: 200_000,
} as Model<Api>;
const cfg = {
agents: {
defaults: {
compaction: {
mode: "safeguard",
qualityGuard: {
enabled: true,
maxRetries: 2,
},
},
},
},
} as OpenClawConfig;
const factories = buildEmbeddedExtensionFactories({
cfg,
sessionManager,
provider: "anthropic",
modelId: "claude-sonnet-4-20250514",
model,
});
expect(factories).toContain(compactionSafeguardExtension);
expect(getCompactionSafeguardRuntime(sessionManager)).toMatchObject({
qualityGuardEnabled: true,
qualityGuardMaxRetries: 2,
});
});
});

View File

@@ -71,6 +71,7 @@ export function buildEmbeddedExtensionFactories(params: {
const factories: ExtensionFactory[] = [];
if (resolveCompactionMode(params.cfg) === "safeguard") {
const compactionCfg = params.cfg?.agents?.defaults?.compaction;
const qualityGuardCfg = compactionCfg?.qualityGuard;
const contextWindowInfo = resolveContextWindowInfo({
cfg: params.cfg,
provider: params.provider,
@@ -83,6 +84,8 @@ export function buildEmbeddedExtensionFactories(params: {
contextWindowTokens: contextWindowInfo.tokens,
identifierPolicy: compactionCfg?.identifierPolicy,
identifierInstructions: compactionCfg?.identifierInstructions,
qualityGuardEnabled: qualityGuardCfg?.enabled ?? false,
qualityGuardMaxRetries: qualityGuardCfg?.maxRetries,
model: params.model,
});
factories.push(compactionSafeguardExtension);