fix(agents): auto-enable OpenAI Responses server-side compaction (#16930, #22441, #25088)

Landed from contributor PRs #16930, #22441, and #25088.

Co-authored-by: liweiguang <codingpunk@gmail.com>
Co-authored-by: EdwardWu7 <wuzhiyuan7@gmail.com>
Co-authored-by: MoerAI <friendnt@g.skku.edu>
This commit is contained in:
Peter Steinberger
2026-02-27 16:14:49 +00:00
parent 6675aacb5e
commit 8da3a9a92d
5 changed files with 277 additions and 14 deletions

View File

@@ -161,7 +161,7 @@ describe("applyExtraParamsToAgent", () => {
};
}
function runStoreMutationCase(params: {
function runResponsesPayloadMutationCase(params: {
applyProvider: string;
applyModelId: string;
model:
@@ -169,14 +169,21 @@ describe("applyExtraParamsToAgent", () => {
| Model<"openai-codex-responses">
| Model<"openai-completions">;
options?: SimpleStreamOptions;
cfg?: Record<string, unknown>;
payload?: Record<string, unknown>;
}) {
const payload = { store: false };
const payload = params.payload ?? { store: false };
const baseStreamFn: StreamFn = (_model, _context, options) => {
options?.onPayload?.(payload);
return {} as ReturnType<StreamFn>;
};
const agent = { streamFn: baseStreamFn };
applyExtraParamsToAgent(agent, undefined, params.applyProvider, params.applyModelId);
applyExtraParamsToAgent(
agent,
params.cfg as Parameters<typeof applyExtraParamsToAgent>[1],
params.applyProvider,
params.applyModelId,
);
const context: Context = { messages: [] };
void agent.streamFn?.(params.model, context, params.options ?? {});
return payload;
@@ -814,7 +821,7 @@ describe("applyExtraParamsToAgent", () => {
});
it("forces store=true for direct OpenAI Responses payloads", () => {
const payload = runStoreMutationCase({
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
model: {
@@ -828,7 +835,7 @@ describe("applyExtraParamsToAgent", () => {
});
it("does not force store for OpenAI Responses routed through non-OpenAI base URLs", () => {
const payload = runStoreMutationCase({
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
model: {
@@ -841,11 +848,152 @@ describe("applyExtraParamsToAgent", () => {
expect(payload.store).toBe(false);
});
it("does not force store for OpenAI Responses when baseUrl is empty", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
model: {
api: "openai-responses",
provider: "openai",
id: "gpt-5",
baseUrl: "",
} as Model<"openai-responses">,
});
expect(payload.store).toBe(false);
});
it("does not force store for models that declare supportsStore=false", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "azure-openai-responses",
applyModelId: "gpt-4o",
model: {
api: "openai-responses",
provider: "azure-openai-responses",
id: "gpt-4o",
baseUrl: "https://example.openai.azure.com/openai/v1",
compat: { supportsStore: false },
} as Model<"openai-responses">,
});
expect(payload.store).toBe(false);
});
it("auto-injects OpenAI Responses context_management compaction for direct OpenAI models", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
model: {
api: "openai-responses",
provider: "openai",
id: "gpt-5",
baseUrl: "https://api.openai.com/v1",
contextWindow: 200_000,
} as Model<"openai-responses">,
});
expect(payload.context_management).toEqual([
{
type: "compaction",
compact_threshold: 140_000,
},
]);
});
it("does not auto-inject OpenAI Responses context_management for Azure by default", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "azure-openai-responses",
applyModelId: "gpt-4o",
model: {
api: "openai-responses",
provider: "azure-openai-responses",
id: "gpt-4o",
baseUrl: "https://example.openai.azure.com/openai/v1",
} as Model<"openai-responses">,
});
expect(payload).not.toHaveProperty("context_management");
});
it("allows explicitly enabling OpenAI Responses context_management compaction", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "azure-openai-responses",
applyModelId: "gpt-4o",
cfg: {
agents: {
defaults: {
models: {
"azure-openai-responses/gpt-4o": {
params: {
responsesServerCompaction: true,
responsesCompactThreshold: 42_000,
},
},
},
},
},
},
model: {
api: "openai-responses",
provider: "azure-openai-responses",
id: "gpt-4o",
baseUrl: "https://example.openai.azure.com/openai/v1",
} as Model<"openai-responses">,
});
expect(payload.context_management).toEqual([
{
type: "compaction",
compact_threshold: 42_000,
},
]);
});
it("preserves existing context_management payload values", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
model: {
api: "openai-responses",
provider: "openai",
id: "gpt-5",
baseUrl: "https://api.openai.com/v1",
} as Model<"openai-responses">,
payload: {
store: false,
context_management: [{ type: "compaction", compact_threshold: 12_345 }],
},
});
expect(payload.context_management).toEqual([{ type: "compaction", compact_threshold: 12_345 }]);
});
it("allows disabling OpenAI Responses context_management compaction via model params", () => {
const payload = runResponsesPayloadMutationCase({
applyProvider: "openai",
applyModelId: "gpt-5",
cfg: {
agents: {
defaults: {
models: {
"openai/gpt-5": {
params: {
responsesServerCompaction: false,
},
},
},
},
},
},
model: {
api: "openai-responses",
provider: "openai",
id: "gpt-5",
baseUrl: "https://api.openai.com/v1",
} as Model<"openai-responses">,
});
expect(payload).not.toHaveProperty("context_management");
});
it.each([
{
name: "with openai-codex provider config",
run: () =>
runStoreMutationCase({
runResponsesPayloadMutationCase({
applyProvider: "openai-codex",
applyModelId: "codex-mini-latest",
model: {
@@ -859,7 +1007,7 @@ describe("applyExtraParamsToAgent", () => {
{
name: "without config via provider/model hints",
run: () =>
runStoreMutationCase({
runResponsesPayloadMutationCase({
applyProvider: "openai-codex",
applyModelId: "codex-mini-latest",
model: {