fix(openai): strip unsupported ChatGPT prompt cache retention options while preserving prompt cache keys
This commit is contained in:
@@ -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;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user