Add gpt-5.3-chat-latest model support (#5241) * Add gpt-5.3-chat-latest model support - Add to OpenAI model dropdown (index.html) - Add to captioning multimodal model list (caption/settings.html) - Add to OPENAI_REASONING_EFFORT_MODELS (constants.js) - Add OPENAI_FIXED_REASONING_EFFORT map to clamp effort to 'medium' (the only value this model accepts) - Apply fixed effort override in both Azure and general OpenAI request paths (chat-completions.js) - Update frontend gpt-5.x regex for parameter handling (openai.js) * Update public/scripts/openai.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

f20aed95d09d51a53867ce696d691fbb2e3b98d8

Spicy Marinara <mgrabower97@gmail.com>

Signed
5 files changed, +17 -3Showing whitespace changes
public/index.html+3 -0
@@ -3028,6 +3028,9 @@
3028 <div>3028 <div>
3029 <h4 data-i18n="OpenAI Model">OpenAI Model</h4>3029 <h4 data-i18n="OpenAI Model">OpenAI Model</h4>
3030 <select id="model_openai_select">3030 <select id="model_openai_select">
3031 <optgroup label="GPT-5.3">
3032 <option value="gpt-5.3-chat-latest">gpt-5.3-chat-latest</option>
3033 </optgroup>
3031 <optgroup label="GPT-5.2">3034 <optgroup label="GPT-5.2">
3032 <option value="gpt-5.2">gpt-5.2</option>3035 <option value="gpt-5.2">gpt-5.2</option>
3033 <option value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>3036 <option value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>
public/scripts/extensions/caption/settings.html+1 -0
@@ -53,6 +53,7 @@
53 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>53 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>
54 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>54 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>
55 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>55 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>
56 <option data-type="openai" value="gpt-5.3-chat-latest">gpt-5.3-chat-latest</option>
56 <option data-type="openai" value="gpt-5.2">gpt-5.2</option>57 <option data-type="openai" value="gpt-5.2">gpt-5.2</option>
57 <option data-type="openai" value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>58 <option data-type="openai" value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>
58 <option data-type="openai" value="gpt-5.2-chat-latest">gpt-5.2-chat-latest</option>59 <option data-type="openai" value="gpt-5.2-chat-latest">gpt-5.2-chat-latest</option>
public/scripts/openai.js+1 -1
@@ -2859,7 +2859,7 @@ export async function createGenerationParameters(settings, model, type, messages
2859 if (/gpt-5-chat-latest/.test(model)) {2859 if (/gpt-5-chat-latest/.test(model)) {
2860 delete generate_data.tools;2860 delete generate_data.tools;
2861 delete generate_data.tool_choice;2861 delete generate_data.tool_choice;
2862 } else if (/gpt-5.(1|2)/.test(model) && !/chat-latest/.test(model)) {2862 } else if (/gpt-5\.(1|2|3)/.test(model) && !/chat-latest/.test(model)) {
2863 delete generate_data.frequency_penalty;2863 delete generate_data.frequency_penalty;
2864 delete generate_data.presence_penalty;2864 delete generate_data.presence_penalty;
2865 delete generate_data.logit_bias;2865 delete generate_data.logit_bias;
src/constants.js+9 -0
@@ -476,12 +476,21 @@ export const OPENAI_REASONING_EFFORT_MODELS = [
476 'gpt-5.2',476 'gpt-5.2',
477 'gpt-5.2-2025-12-11',477 'gpt-5.2-2025-12-11',
478 'gpt-5.2-chat-latest',478 'gpt-5.2-chat-latest',
479 'gpt-5.3-chat-latest',
479];480];
480481
481export const OPENAI_REASONING_EFFORT_MAP = {482export const OPENAI_REASONING_EFFORT_MAP = {
482 min: 'minimal',483 min: 'minimal',
483};484};
484485
486/**
487 * Models that only accept a single fixed reasoning effort value.
488 * @type {Record<string, string>}
489 */
490export const OPENAI_FIXED_REASONING_EFFORT = {
491 'gpt-5.3-chat-latest': 'medium',
492};
493
485export const NANOGPT_REASONING_EFFORT_MAP = {494export const NANOGPT_REASONING_EFFORT_MAP = {
486 min: 'none',495 min: 'none',
487 low: 'minimal',496 low: 'minimal',
src/endpoints/backends/chat-completions.js+3 -2
@@ -11,6 +11,7 @@ import {
11 CHAT_COMPLETION_SOURCES,11 CHAT_COMPLETION_SOURCES,
12 GEMINI_SAFETY,12 GEMINI_SAFETY,
13 NANOGPT_REASONING_EFFORT_MAP,13 NANOGPT_REASONING_EFFORT_MAP,
14 OPENAI_FIXED_REASONING_EFFORT,
14 OPENAI_REASONING_EFFORT_MAP,15 OPENAI_REASONING_EFFORT_MAP,
15 OPENAI_REASONING_EFFORT_MODELS,16 OPENAI_REASONING_EFFORT_MODELS,
16 OPENAI_VERBOSITY_MODELS,17 OPENAI_VERBOSITY_MODELS,
@@ -1597,7 +1598,7 @@ async function sendAzureOpenAIRequest(request, response) {
15971598
1598 // Do not send reasoning effort to models which do not support it1599 // Do not send reasoning effort to models which do not support it
1599 apiRequestBody['reasoning_effort'] = OPENAI_REASONING_EFFORT_MODELS.includes(request.body.model)1600 apiRequestBody['reasoning_effort'] = OPENAI_REASONING_EFFORT_MODELS.includes(request.body.model)
1600 ? OPENAI_REASONING_EFFORT_MAP[request.body.reasoning_effort] ?? request.body.reasoning_effort1601 ? OPENAI_FIXED_REASONING_EFFORT[request.body.model] ?? OPENAI_REASONING_EFFORT_MAP[request.body.reasoning_effort] ?? request.body.reasoning_effort
1601 : undefined;1602 : undefined;
16021603
1603 const controller = new AbortController();1604 const controller = new AbortController();
@@ -2326,7 +2327,7 @@ router.post('/generate', async function (request, response) {
2326 // A few of OpenAIs reasoning models support reasoning effort2327 // A few of OpenAIs reasoning models support reasoning effort
2327 if (request.body.reasoning_effort && [CHAT_COMPLETION_SOURCES.CUSTOM, CHAT_COMPLETION_SOURCES.OPENAI].includes(request.body.chat_completion_source)) {2328 if (request.body.reasoning_effort && [CHAT_COMPLETION_SOURCES.CUSTOM, CHAT_COMPLETION_SOURCES.OPENAI].includes(request.body.chat_completion_source)) {
2328 if (OPENAI_REASONING_EFFORT_MODELS.includes(request.body.model)) {2329 if (OPENAI_REASONING_EFFORT_MODELS.includes(request.body.model)) {
2329 bodyParams['reasoning_effort'] = OPENAI_REASONING_EFFORT_MAP[request.body.reasoning_effort] ?? request.body.reasoning_effort;2330 bodyParams['reasoning_effort'] = OPENAI_FIXED_REASONING_EFFORT[request.body.model] ?? OPENAI_REASONING_EFFORT_MAP[request.body.reasoning_effort] ?? request.body.reasoning_effort;
2330 }2331 }
2331 }2332 }
23322333