OpenAI: Add gpt-5.5, gpt-5.4-mini/nano, gpt-image-2 (#5529) * feat: gpt-image-2 for OpenAI image generation * gpt-5.5 Co-authored-by: Copilot <copilot@github.com> * fix: adjust reasoning effort mapping Co-authored-by: Copilot <copilot@github.com> * fix: html format --------- Co-authored-by: Copilot <copilot@github.com>

09bb7622ed5bbc063316625efb5e3c5b4d68ad33

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
5 files changed, +70 -36Ignore whitespace
public/index.html+9 -0
@@ -3046,8 +3046,17 @@
30463046 <div>
30473047 <h4 data-i18n="OpenAI Model">OpenAI Model</h4>
30483048 <select id="model_openai_select">
3049+ <optgroup label="GPT-5.5">
3050+ <option value="gpt-5.5">gpt-5.5</option>
3051+ <option value="gpt-5.5-2026-04-23">gpt-5.5-2026-04-23</option>
3052+ </optgroup>
30493053 <optgroup label="GPT-5.4">
30503054 <option value="gpt-5.4">gpt-5.4</option>
3055+ <option value="gpt-5.4-2026-03-05">gpt-5.4-2026-03-05</option>
3056+ <option value="gpt-5.4-mini">gpt-5.4-mini</option>
3057+ <option value="gpt-5.4-mini-2026-03-17">gpt-5.4-mini-2026-03-17</option>
3058+ <option value="gpt-5.4-nano">gpt-5.4-nano</option>
3059+ <option value="gpt-5.4-nano-2026-03-17">gpt-5.4-nano-2026-03-17</option>
30513060 </optgroup>
30523061 <optgroup label="GPT-5.3">
30533062 <option value="gpt-5.3-chat-latest">gpt-5.3-chat-latest</option>
public/scripts/extensions/caption/settings.html+7 -0
@@ -54,7 +54,14 @@
5454 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>
5555 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>
5656 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>
57+ <option data-type="openai" value="gpt-5.5">gpt-5.5</option>
58+ <option data-type="openai" value="gpt-5.5-2026-04-23">gpt-5.5-2026-04-23</option>
5759 <option data-type="openai" value="gpt-5.4">gpt-5.4</option>
60+ <option data-type="openai" value="gpt-5.4-2026-03-05">gpt-5.4-2026-03-05</option>
61+ <option data-type="openai" value="gpt-5.4-mini">gpt-5.4-mini</option>
62+ <option data-type="openai" value="gpt-5.4-mini-2026-03-17">gpt-5.4-mini-2026-03-17</option>
63+ <option data-type="openai" value="gpt-5.4-nano">gpt-5.4-nano</option>
64+ <option data-type="openai" value="gpt-5.4-nano-2026-03-17">gpt-5.4-nano-2026-03-17</option>
5865 <option data-type="openai" value="gpt-5.3-chat-latest">gpt-5.3-chat-latest</option>
5966 <option data-type="openai" value="gpt-5.2">gpt-5.2</option>
6067 <option data-type="openai" value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>
public/scripts/extensions/stable-diffusion/index.js+3 -1
@@ -2382,6 +2382,8 @@ async function loadDrawthingsModels() {
23822382
23832383async function loadOpenAiModels() {
23842384 return [
2385+ { value: 'gpt-image-2', text: 'gpt-image-2' },
2386+ { value: 'gpt-image-2-2026-04-21', text: 'gpt-image-2-2026-04-21' },
23852387 { value: 'gpt-image-1.5', text: 'gpt-image-1.5' },
23862388 { value: 'gpt-image-1-mini', text: 'gpt-image-1-mini' },
23872389 { value: 'gpt-image-1', text: 'gpt-image-1' },
@@ -4075,7 +4077,7 @@ async function generateOpenAiImage(prompt, signal) {
40754077
40764078 const isDalle2 = /dall-e-2/.test(extension_settings.sd.model);
40774079 const isDalle3 = /dall-e-3/.test(extension_settings.sd.model);
40784080 const isGptImg = /gpt-image-(1|2|latest)/.test(extension_settings.sd.model);
40794081 const isSora2 = /sora-2/.test(extension_settings.sd.model);
40804082
40814083 if (isDalle2 && prompt.length > dalle2PromptLimit) {
public/scripts/openai.js+44 -35
@@ -2530,9 +2530,16 @@ function getReasoningEffort(settings = null, model = null) {
25302530 return 'none';
25312531 }
25322532
25332533 returnif ([chat_completion_sources.OPENAI, chat_completion_sources.AZURE_OPENAI].includes(settings.chat_completion_source) && /^gpt-5/.test(model) {
2534- ? reasoning_effort_types.min
2534+ if (/^gpt-5\.(4|5)/.test(model)) {
2535- : reasoning_effort_types.low;
2535+ return 'none';
2536+ }
2537+ if (/^gpt-5/.test(model)) {
2538+ return reasoning_effort_types.min;
2539+ }
2540+ }
2541+
2542+ return reasoning_effort_types.low;
25362543 case reasoning_effort_types.max:
25372544 return reasoning_effort_types.high;
25382545 default:
@@ -2945,7 +2952,7 @@ export async function createGenerationParameters(settings, model, type, messages
29452952 if (/gpt-5-chat-latest/.test(model)) {
29462953 delete generate_data.tools;
29472954 delete generate_data.tool_choice;
29482955 } else if (/gpt-5\.(1|2|3|4)/.test(model) && !/chat-latest/.test(model) && !generate_data.reasoning_effort) {
29492956 delete generate_data.frequency_penalty;
29502957 delete generate_data.presence_penalty;
29512958 delete generate_data.logit_bias;
@@ -4887,41 +4894,43 @@ function onSettingsPresetChange() {
48874894 });
48884895}
48894896
4897+/**
4898+ * Get the maximum context size for the OpenAI model
4899+ * @param {string} value Model identifier
4900+ * @returns {number} Maximum context size in tokens
4901+ */
48904902function getMaxContextOpenAI(value) {
48914903 if (oai_settings.max_context_unlocked) {
48924904 return unlocked_max;
4893- } else if (value.startsWith('gpt-5.4')) {
4894- return max_1mil;
4895- } else if (value.startsWith('gpt-5')) {
4896- return max_400k;
4897- } else if (value.includes('gpt-4.1')) {
4898- return max_1mil;
4899- } else if (value.includes('gpt-audio')) {
4900- return max_128k;
4901- } else if (value.startsWith('o1')) {
4902- return max_128k;
4903- } else if (value.startsWith('o4') || value.startsWith('o3')) {
4904- return max_200k;
4905- } else if (value.includes('chatgpt-4o-latest') || value.includes('gpt-4-turbo') || value.includes('gpt-4o') || value.includes('gpt-4-1106') || value.includes('gpt-4-0125') || value.includes('gpt-4-vision')) {
4906- return max_128k;
4907- } else if (value.includes('gpt-3.5-turbo-1106')) {
4908- return max_16k;
4909- } else if (['gpt-4', 'gpt-4-0314', 'gpt-4-0613'].includes(value)) {
4910- return max_8k;
4911- } else if (['gpt-4-32k', 'gpt-4-32k-0314', 'gpt-4-32k-0613'].includes(value)) {
4912- return max_32k;
4913- } else if (value.includes('gpt-realtime')) {
4914- return max_32k;
4915- } else if (['gpt-3.5-turbo-16k', 'gpt-3.5-turbo-16k-0613'].includes(value)) {
4916- return max_16k;
4917- } else if (value == 'code-davinci-002') {
4918- return max_8k;
4919- } else if (['text-curie-001', 'text-babbage-001', 'text-ada-001'].includes(value)) {
4920- return max_2k;
4921- } else {
4922- // default to gpt-3 (4095 tokens)
4923- return max_4k;
49244905 }
4906+
4907+ /** @type {[RegExp, number][]} */
4908+ const contextMap = [
4909+ [/^gpt-5\.[45]/, max_1mil],
4910+ [/^gpt-5/, max_400k],
4911+ [/gpt-4\.1/, max_1mil],
4912+ [/gpt-audio/, max_128k],
4913+ [/^o1/, max_128k],
4914+ [/^o[34]/, max_200k],
4915+ [/chatgpt-4o-latest|gpt-4-turbo|gpt-4o|gpt-4-1106|gpt-4-0125|gpt-4-vision/, max_128k],
4916+ [/gpt-3\.5-turbo-1106/, max_16k],
4917+ [/^(gpt-4|gpt-4-0314|gpt-4-0613)$/, max_8k],
4918+ [/^(gpt-4-32k|gpt-4-32k-0314|gpt-4-32k-0613)$/, max_32k],
4919+ [/gpt-realtime/, max_32k],
4920+ [/^(gpt-3\.5-turbo-16k|gpt-3\.5-turbo-16k-0613)$/, max_16k],
4921+ [/^code-davinci-002$/, max_8k],
4922+ [/^(text-curie-001|text-babbage-001|text-ada-001)$/, max_2k],
4923+ [/gpt-3/, max_4k],
4924+ ];
4925+
4926+ for (const [regex, max] of contextMap) {
4927+ if (regex.test(value)) {
4928+ return max;
4929+ }
4930+ }
4931+
4932+ // Safe default for most modern models
4933+ return max_128k;
49254934}
49264935
49274936/**
src/constants.js+7 -0
@@ -480,6 +480,13 @@ export const OPENAI_REASONING_EFFORT_MODELS = [
480480 'gpt-5.2-chat-latest',
481481 'gpt-5.3-chat-latest',
482482 'gpt-5.4',
483+ 'gpt-5.4-2026-03-05',
484+ 'gpt-5.4-mini',
485+ 'gpt-5.4-mini-2026-03-17',
486+ 'gpt-5.4-nano',
487+ 'gpt-5.4-nano-2026-03-17',
488+ 'gpt-5.5',
489+ 'gpt-5.5-2026-04-23',
483490];
484491
485492export const OPENAI_REASONING_EFFORT_MAP = {