Skip to content

Commit 37d6fd2

Browse files
snowzlmobviyus
authored andcommitted
test(OpenAI Responses): cover storeless replay compatibility
1 parent 8ecf55b commit 37d6fd2

2 files changed

Lines changed: 151 additions & 0 deletions

File tree

src/agents/embedded-agent-runner-extraparams.test.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3100,6 +3100,59 @@ describe("applyExtraParamsToAgent", () => {
31003100
expect(capturedOptions?.replayResponsesItemIds).toBe(true);
31013101
});
31023102

3103+
it("keeps Responses replay item ids enabled for Azure OpenAI store-enabled requests", () => {
3104+
let capturedOptions:
3105+
| (SimpleStreamOptions & {
3106+
replayResponsesItemIds?: boolean;
3107+
})
3108+
| undefined;
3109+
const baseStreamFn: StreamFn = (_model, _context, options) => {
3110+
capturedOptions = options;
3111+
return {} as ReturnType<StreamFn>;
3112+
};
3113+
const streamFn = createOpenAIResponsesContextManagementWrapper(baseStreamFn, undefined);
3114+
3115+
void streamFn(
3116+
{
3117+
api: "openai-responses",
3118+
provider: "azure-openai",
3119+
id: "gpt-5-mini",
3120+
baseUrl: "https://example.openai.azure.com/openai/v1",
3121+
} as unknown as Model<"openai-responses">,
3122+
{ messages: [] },
3123+
{},
3124+
);
3125+
3126+
expect(capturedOptions?.replayResponsesItemIds).toBe(true);
3127+
});
3128+
3129+
it("does not disable replay defaults for store-capable third-party Responses routes", () => {
3130+
let capturedOptions:
3131+
| (SimpleStreamOptions & {
3132+
replayResponsesItemIds?: boolean;
3133+
})
3134+
| undefined;
3135+
const baseStreamFn: StreamFn = (_model, _context, options) => {
3136+
capturedOptions = options;
3137+
return {} as ReturnType<StreamFn>;
3138+
};
3139+
const streamFn = createOpenAIResponsesContextManagementWrapper(baseStreamFn, undefined);
3140+
3141+
void streamFn(
3142+
{
3143+
api: "openai-responses",
3144+
provider: "custom-openai-responses",
3145+
id: "store-capable-model",
3146+
baseUrl: "https://custom.example.invalid/v1",
3147+
compat: { supportsStore: true },
3148+
} as unknown as Model<"openai-responses">,
3149+
{ messages: [] },
3150+
{ replayResponsesItemIds: true } as never,
3151+
);
3152+
3153+
expect(capturedOptions?.replayResponsesItemIds).toBe(true);
3154+
});
3155+
31033156
it("disables Responses replay item ids when custom Responses routes strip store", () => {
31043157
let capturedOptions:
31053158
| (SimpleStreamOptions & {

src/agents/openai-transport-stream.test.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3839,6 +3839,104 @@ describe("openai transport stream", () => {
38393839
});
38403840
});
38413841

3842+
it("preserves Responses replay item ids for store-capable third-party opt-in routes", () => {
3843+
const params = buildOpenAIResponsesParams(
3844+
{
3845+
id: "store-capable-model",
3846+
name: "Store-capable model",
3847+
api: "openai-responses",
3848+
provider: "custom-openai-responses",
3849+
baseUrl: "https://custom.example.com/v1",
3850+
compat: { supportsStore: true } as never,
3851+
reasoning: true,
3852+
input: ["text"],
3853+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
3854+
contextWindow: 200000,
3855+
maxTokens: 8192,
3856+
} satisfies Model<"openai-responses">,
3857+
{
3858+
systemPrompt: "system",
3859+
messages: [
3860+
{
3861+
role: "assistant",
3862+
api: "openai-responses",
3863+
provider: "custom-openai-responses",
3864+
model: "store-capable-model",
3865+
usage: {
3866+
input: 0,
3867+
output: 0,
3868+
cacheRead: 0,
3869+
cacheWrite: 0,
3870+
totalTokens: 0,
3871+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
3872+
},
3873+
stopReason: "toolUse",
3874+
timestamp: 1,
3875+
content: [
3876+
{
3877+
type: "thinking",
3878+
thinking: "Need a tool.",
3879+
thinkingSignature: JSON.stringify({
3880+
type: "reasoning",
3881+
id: "rs_prior",
3882+
summary: [],
3883+
}),
3884+
},
3885+
{
3886+
type: "text",
3887+
text: "Checking the price.",
3888+
textSignature: JSON.stringify({
3889+
v: 1,
3890+
id: "msg_prior",
3891+
phase: "commentary",
3892+
}),
3893+
},
3894+
{
3895+
type: "toolCall",
3896+
id: "call_abc|fc_prior",
3897+
name: "price_lookup",
3898+
arguments: { symbol: "SOL" },
3899+
},
3900+
],
3901+
},
3902+
],
3903+
tools: [],
3904+
} as never,
3905+
{ replayResponsesItemIds: true, sessionId: "session-123" },
3906+
) as {
3907+
input?: Array<{
3908+
type?: string;
3909+
role?: string;
3910+
id?: string;
3911+
call_id?: string;
3912+
phase?: string;
3913+
summary?: unknown;
3914+
}>;
3915+
};
3916+
3917+
const reasoningItem = params.input?.find((item) => item.type === "reasoning");
3918+
expectRecordFields(reasoningItem, {
3919+
type: "reasoning",
3920+
id: "rs_prior",
3921+
summary: [],
3922+
});
3923+
const assistantMessage = params.input?.find(
3924+
(item) => item.type === "message" && item.role === "assistant",
3925+
);
3926+
expectRecordFields(assistantMessage, {
3927+
type: "message",
3928+
role: "assistant",
3929+
id: "msg_prior",
3930+
phase: "commentary",
3931+
});
3932+
const functionCall = params.input?.find((item) => item.type === "function_call");
3933+
expectRecordFields(functionCall, {
3934+
type: "function_call",
3935+
id: "fc_prior",
3936+
call_id: "call_abc",
3937+
});
3938+
});
3939+
38423940
it("omits prior Responses replay item ids when store is disabled for custom Codex-compatible responses", () => {
38433941
const model = {
38443942
id: "gpt-5.4",

0 commit comments

Comments
 (0)