diff --git a/public/index.html b/public/index.html index b7b007843..26d73b649 100644 --- a/public/index.html +++ b/public/index.html @@ -2897,7 +2897,7 @@ gpt-4.1-nano gpt-4.1-nano-2025-04-14 - + o1 o1-2024-12-17 o1-mini @@ -2906,9 +2906,15 @@ o1-preview-2024-09-12 + o3 + o3-2025-04-16 o3-mini o3-mini-2025-01-31 + + o4-mini + o4-mini-2025-04-16 + gpt-4.5-preview gpt-4.5-preview-2025-02-27 diff --git a/public/scripts/extensions/caption/settings.html b/public/scripts/extensions/caption/settings.html index a34b25a37..a78d33505 100644 --- a/public/scripts/extensions/caption/settings.html +++ b/public/scripts/extensions/caption/settings.html @@ -60,6 +60,10 @@ chatgpt-4o-latest o1 o1-2024-12-17 + o3 + o3-2025-04-16 + o4-mini + o4-mini-2025-04-16 gpt-4.5-preview gpt-4.5-preview-2025-02-27 claude-3-7-sonnet-latest diff --git a/public/scripts/openai.js b/public/scripts/openai.js index a2f8eec42..392b7b682 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -2180,25 +2180,27 @@ async function sendOpenAIRequest(type, messages, signal) { generate_data['seed'] = oai_settings.seed; } - if (isOAI && (oai_settings.openai_model.startsWith('o1') || oai_settings.openai_model.startsWith('o3'))) { - generate_data.messages.forEach((msg) => { - if (msg.role === 'system') { - msg.role = 'user'; - } - }); + if (isOAI && /^(o1|o3|o4)/.test(oai_settings.openai_model)) { generate_data.max_completion_tokens = generate_data.max_tokens; delete generate_data.max_tokens; delete generate_data.logprobs; delete generate_data.top_logprobs; - delete generate_data.n; + delete generate_data.stop; + delete generate_data.logit_bias; delete generate_data.temperature; delete generate_data.top_p; delete generate_data.frequency_penalty; delete generate_data.presence_penalty; - delete generate_data.tools; - delete generate_data.tool_choice; - delete generate_data.stop; - delete generate_data.logit_bias; + if (oai_settings.openai_model.startsWith('o1')) { + generate_data.messages.forEach((msg) => { + if (msg.role === 'system') { + msg.role = 'user'; + } + }); + delete generate_data.n; + delete generate_data.tools; + delete generate_data.tool_choice; + } } await eventSource.emit(event_types.CHAT_COMPLETION_SETTINGS_READY, generate_data); @@ -4129,9 +4131,12 @@ function getMaxContextOpenAI(value) { else if (value.includes('gpt-4.1')) { return max_1mil; } - else if (value.startsWith('o1') || value.startsWith('o3')) { + else if (value.startsWith('o1')) { return max_128k; } + else if (value.startsWith('o4') || value.startsWith('o3')) { + return max_200k; + } 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')) { return max_128k; } @@ -5150,11 +5155,15 @@ export function isImageInliningSupported() { 'grok-2-vision', 'grok-vision', 'gpt-4.1', + 'o3', + 'o3-2025-04-16', + 'o4-mini', + 'o4-mini-2025-04-16', ]; switch (oai_settings.chat_completion_source) { case chat_completion_sources.OPENAI: - return visionSupportedModels.some(model => oai_settings.openai_model.includes(model) && !oai_settings.openai_model.includes('gpt-4-turbo-preview')); + return visionSupportedModels.some(model => oai_settings.openai_model.includes(model) && !oai_settings.openai_model.includes('gpt-4-turbo-preview') && !oai_settings.openai_model.includes('o3-mini')); case chat_completion_sources.MAKERSUITE: return visionSupportedModels.some(model => oai_settings.google_model.includes(model)); case chat_completion_sources.CLAUDE: diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index 796ff79be..dc0fd0f64 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -1258,7 +1258,7 @@ router.post('/generate', function (request, response) { // A few of OpenAIs reasoning models support reasoning effort if ([CHAT_COMPLETION_SOURCES.CUSTOM, CHAT_COMPLETION_SOURCES.OPENAI].includes(request.body.chat_completion_source)) { - if (['o1', 'o3-mini', 'o3-mini-2025-01-31'].includes(request.body.model)) { + if (['o1', 'o3-mini', 'o3-mini-2025-01-31', 'o4-mini', 'o4-mini-2025-04-16', 'o3', 'o3-2025-04-16'].includes(request.body.model)) { bodyParams['reasoning_effort'] = request.body.reasoning_effort; } } diff --git a/src/endpoints/tokenizers.js b/src/endpoints/tokenizers.js index c8ecb434c..deb6a6482 100644 --- a/src/endpoints/tokenizers.js +++ b/src/endpoints/tokenizers.js @@ -407,6 +407,10 @@ export function getTokenizerModel(requestModel) { return 'o1'; } + if (requestModel.includes('o3') || requestModel.includes('o4-mini')) { + return 'o1'; + } + if (requestModel.includes('gpt-4o') || requestModel.includes('chatgpt-4o-latest')) { return 'gpt-4o'; }