fix(openai): strip unsupported ChatGPT prompt cache retention options while preserving prompt cache keys

This commit is contained in:
2026-05-14 19:59:30 +00:00
parent 0e2053f538
commit 4725b55566
3 changed files with 34 additions and 10 deletions
+19 -10
View File
@@ -11,6 +11,10 @@ const getSystemInstructions = (prompt: LanguageModelV3CallOptions['prompt']): st
return instructions.length > 0 ? instructions.join('\n') : undefined;
};
const hasUnsupportedChatGptCacheRetention = (options: JSONObject): boolean => {
return options.promptCacheRetention !== undefined || options.prompt_cache_retention !== undefined;
};
/**
* ChatGPT's Codex backend requires top-level Responses API instructions.
* The standard OpenAI provider otherwise serializes system prompts as input items.
@@ -20,25 +24,30 @@ export function createOpenAiChatGptInstructionsMiddleware(): LanguageModelV3Midd
specificationVersion: 'v3',
transformParams: async ({ params }) => {
const instructions = getSystemInstructions(params.prompt);
if (!instructions) {
const providerOptions = params.providerOptions ?? {};
const openAiProviderOptions = providerOptions.openai ?? {};
const shouldApplyInstructions = !!instructions && !isNonEmptyString(openAiProviderOptions.instructions);
const shouldStripCacheRetention = hasUnsupportedChatGptCacheRetention(openAiProviderOptions);
if (!shouldApplyInstructions && !shouldStripCacheRetention) {
return params;
}
const providerOptions = params.providerOptions ?? {};
const openAiProviderOptions = providerOptions.openai ?? {};
if (isNonEmptyString(openAiProviderOptions.instructions)) {
return params;
const nextOpenAiProviderOptions: JSONObject = { ...openAiProviderOptions };
delete nextOpenAiProviderOptions.promptCacheRetention;
delete nextOpenAiProviderOptions.prompt_cache_retention;
if (shouldApplyInstructions) {
nextOpenAiProviderOptions.instructions = instructions;
}
return {
...params,
prompt: params.prompt.filter((message) => message.role !== 'system'),
prompt: shouldApplyInstructions
? params.prompt.filter((message) => message.role !== 'system')
: params.prompt,
providerOptions: {
...providerOptions,
openai: {
...openAiProviderOptions,
instructions,
} as JSONObject,
openai: nextOpenAiProviderOptions,
},
} satisfies LanguageModelV3CallOptions;
},