Merge pull request #3424 from SillyTavern/oai-reasoning-effort OpenAI "Reasoning Effort" for o1/o3-mini + oai models restructured

c9144cd82448ae651e8b792d609f591b5af680d3

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

Signed
4 files changed, +83 -46Ignore whitespace
public/index.html+50 -46
@@ -1957,14 +1957,16 @@
19571957 <span data-i18n="image_inlining_hint_3">menu to attach an image file to the chat.</span>
19581958 </div>
19591959 <div class="flex-container flexFlowColumn wide100p textAlignCenter marginTop10" data-source="openai,custom">
1960- <label for="openai_inline_image_quality" data-i18n="Inline Image Quality">
1960+ <div class="flex-container oneline-dropdown">
1961- Inline Image Quality
1961+ <label for="openai_inline_image_quality" data-i18n="Inline Image Quality">
1962- </label>
1962+ Inline Image Quality
1963- <select id="openai_inline_image_quality">
1963+ </label>
1964- <option data-i18n="openai_inline_image_quality_auto" value="auto">Auto</option>
1964+ <select id="openai_inline_image_quality">
19651965 <option data-i18n="openai_inline_image_quality_lowopenai_inline_image_quality_auto" value="lowauto">LowAuto</option>
19661966 <option data-i18n="openai_inline_image_quality_highopenai_inline_image_quality_low" value="highlow">HighLow</option>
1967- </select>
1967+ <option data-i18n="openai_inline_image_quality_high" value="high">High</option>
1968+ </select>
1969+ </div>
19681970 </div>
19691971 </div>
19701972 <div class="range-block" data-source="makersuite">
@@ -1995,6 +1997,18 @@
19951997 </span>
19961998 </div>
19971999 </div>
2000+ <div class="flex-container flexFlowColumn wide100p textAlignCenter marginTop10" data-source="openai,custom">
2001+ <div class="flex-container oneline-dropdown" title="Constrains effort on reasoning for reasoning models.&#10;Currently supported values are low, medium, and high.&#10;Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response.">
2002+ <label for="openai_reasoning_effort" data-i18n="Reasoning Effort">
2003+ Reasoning Effort
2004+ </label>
2005+ <select id="openai_reasoning_effort">
2006+ <option data-i18n="openai_reasoning_effort_low" value="low">Low</option>
2007+ <option data-i18n="openai_reasoning_effort_medium" value="medium">Medium</option>
2008+ <option data-i18n="openai_reasoning_effort_high" value="high">High</option>
2009+ </select>
2010+ </div>
2011+ </div>
19982012 <div class="range-block" data-source="claude">
19992013 <div class="wide100p">
20002014 <div class="flex-container alignItemsCenter">
@@ -2809,27 +2823,6 @@
28092823 <div>
28102824 <h4 data-i18n="OpenAI Model">OpenAI Model</h4>
28112825 <select id="model_openai_select">
2812- <optgroup label="GPT-3.5 Turbo">
2813- <option value="gpt-3.5-turbo">gpt-3.5-turbo</option>
2814- <option value="gpt-3.5-turbo-0125">gpt-3.5-turbo-0125 (2024)</option>
2815- <option value="gpt-3.5-turbo-1106">gpt-3.5-turbo-1106 (2023)</option>
2816- <option value="gpt-3.5-turbo-0613">gpt-3.5-turbo-0613 (2023)</option>
2817- <option value="gpt-3.5-turbo-0301">gpt-3.5-turbo-0301 (2023)</option>
2818- <option value="gpt-3.5-turbo-16k">gpt-3.5-turbo-16k</option>
2819- <option value="gpt-3.5-turbo-16k-0613">gpt-3.5-turbo-16k-0613 (2023)</option>
2820- </optgroup>
2821- <optgroup label="GPT-3.5 Turbo Instruct">
2822- <option value="gpt-3.5-turbo-instruct">gpt-3.5-turbo-instruct</option>
2823- <option value="gpt-3.5-turbo-instruct-0914">gpt-3.5-turbo-instruct-0914</option>
2824- </optgroup>
2825- <optgroup label="GPT-4">
2826- <option value="gpt-4">gpt-4</option>
2827- <option value="gpt-4-0613">gpt-4-0613 (2023)</option>
2828- <option value="gpt-4-0314">gpt-4-0314 (2023)</option>
2829- <option value="gpt-4-32k">gpt-4-32k</option>
2830- <option value="gpt-4-32k-0613">gpt-4-32k-0613 (2023)</option>
2831- <option value="gpt-4-32k-0314">gpt-4-32k-0314 (2023)</option>
2832- </optgroup>
28332826 <optgroup label="GPT-4o">
28342827 <option value="gpt-4o">gpt-4o</option>
28352828 <option value="gpt-4o-2024-11-20">gpt-4o-2024-11-20</option>
@@ -2837,33 +2830,44 @@
28372830 <option value="gpt-4o-2024-05-13">gpt-4o-2024-05-13</option>
28382831 <option value="chatgpt-4o-latest">chatgpt-4o-latest</option>
28392832 </optgroup>
28402833 <optgroup label="gptGPT-4o- mini">
28412834 <option value="gpt-4o-mini">gpt-4o-mini</option>
28422835 <option value="gpt-4o-mini-2024-0711-1820">gpt-4o-mini-2024-0711-1820</option>
2836+ <option value="gpt-4o-2024-08-06">gpt-4o-2024-08-06</option>
2837+ <option value="gpt-4o-2024-05-13">gpt-4o-2024-05-13</option>
2838+ <option value="chatgpt-4o-latest">chatgpt-4o-latest</option>
2839+ </optgroup>
2840+ <optgroup label="o1 and o1-mini">
2841+ <option value="o1">o1</option>
2842+ <option value="o1-2024-12-17">o1-2024-12-17</option>
2843+ <option value="o1-mini">o1-mini</option>
2844+ <option value="o1-mini-2024-09-12">o1-mini-2024-09-12</option>
2845+ <option value="o1-preview">o1-preview</option>
2846+ <option value="o1-preview-2024-09-12">o1-preview-2024-09-12</option>
28432847 </optgroup>
28442848 <optgroup label="GPT-4 Turboo3">
2849+ <option value="o3-mini">o3-mini</option>
2850+ <option value="o3-mini-2025-01-31">o3-mini-2025-01-31</option>
2851+ </optgroup>
2852+ <optgroup label="GPT-4 Turbo and GPT-4">
28452853 <option value="gpt-4-turbo">gpt-4-turbo</option>
28462854 <option value="gpt-4-turbo-2024-04-09">gpt-4-turbo-2024-04-09</option>
28472855 <option value="gpt-4-turbo-preview">gpt-4-turbo-preview</option>
2848- <option value="gpt-4-vision-preview">gpt-4-vision-preview</option>
28492856 <option value="gpt-4-0125-preview">gpt-4-0125-preview (2024)</option>
28502857 <option value="gpt-4-1106-preview">gpt-4-1106-preview (2023)</option>
2858+ <option value="gpt-4">gpt-4</option>
2859+ <option value="gpt-4-0613">gpt-4-0613 (2023)</option>
2860+ <option value="gpt-4-0314">gpt-4-0314 (2023)</option>
28512861 </optgroup>
28522862 <optgroup label="o1GPT-3.5 Turbo">
28532863 <option value="o1gpt-preview3.5-turbo">o1gpt-preview3.5-turbo</option>
28542864 <option value="o1gpt-mini3.5-turbo-0125">o1gpt-mini3.5-turbo-0125 (2024)</option>
2855- </optgroup>
2865+ <option value="gpt-3.5-turbo-1106">gpt-3.5-turbo-1106 (2023)</option>
2856- <optgroup label="o3">
2866+ <option value="gpt-3.5-turbo-instruct">gpt-3.5-turbo-instruct</option>
2857- <option value="o3-mini">o3-mini</option>
2858- <option value="o3-mini-2025-01-31">o3-mini-2025-01-31</option>
28592867 </optgroup>
28602868 <optgroup label="Other">
28612869 <option value="text-davincibabbage-003002">text-davincibabbage-003002</option>
28622870 <option value="text-davinci-002">text-davinci-002</option>
2863- <option value="text-curie-001">text-curie-001</option>
2864- <option value="text-babbage-001">text-babbage-001</option>
2865- <option value="text-ada-001">text-ada-001</option>
2866- <option value="code-davinci-002">code-davinci-002</option>
28672871 </optgroup>
28682872 <optgroup id="openai_external_category" label="External">
28692873 </optgroup>
public/scripts/openai.js+14 -0
@@ -299,6 +299,7 @@ const default_settings = {
299299 continue_postfix: continue_postfix_types.SPACE,
300300 custom_prompt_post_processing: custom_prompt_post_processing_types.NONE,
301301 show_thoughts: true,
302+ reasoning_effort: 'medium',
302303 seed: -1,
303304 n: 1,
304305};
@@ -378,6 +379,7 @@ const oai_settings = {
378379 continue_postfix: continue_postfix_types.SPACE,
379380 custom_prompt_post_processing: custom_prompt_post_processing_types.NONE,
380381 show_thoughts: true,
382+ reasoning_effort: 'medium',
381383 seed: -1,
382384 n: 1,
383385};
@@ -1912,6 +1914,7 @@ async function sendOpenAIRequest(type, messages, signal) {
19121914 'char_name': name2,
19131915 'group_names': getGroupNames(),
19141916 'include_reasoning': Boolean(oai_settings.show_thoughts),
1917+ 'reasoning_effort': String(oai_settings.reasoning_effort),
19151918 };
19161919
19171920 // Empty array will produce a validation error
@@ -3122,6 +3125,7 @@ function loadOpenAISettings(data, settings) {
31223125 oai_settings.inline_image_quality = settings.inline_image_quality ?? default_settings.inline_image_quality;
31233126 oai_settings.bypass_status_check = settings.bypass_status_check ?? default_settings.bypass_status_check;
31243127 oai_settings.show_thoughts = settings.show_thoughts ?? default_settings.show_thoughts;
3128+ oai_settings.reasoning_effort = settings.reasoning_effort ?? default_settings.reasoning_effort;
31253129 oai_settings.seed = settings.seed ?? default_settings.seed;
31263130 oai_settings.n = settings.n ?? default_settings.n;
31273131
@@ -3251,6 +3255,9 @@ function loadOpenAISettings(data, settings) {
32513255 $('#n_openai').val(oai_settings.n);
32523256 $('#openai_show_thoughts').prop('checked', oai_settings.show_thoughts);
32533257
3258+ $('#openai_reasoning_effort').val(oai_settings.reasoning_effort);
3259+ $(`#openai_reasoning_effort option[value="${oai_settings.reasoning_effort}"]`).prop('selected', true);
3260+
32543261 if (settings.reverse_proxy !== undefined) oai_settings.reverse_proxy = settings.reverse_proxy;
32553262 $('#openai_reverse_proxy').val(oai_settings.reverse_proxy);
32563263
@@ -3511,6 +3518,7 @@ async function saveOpenAIPreset(name, settings, triggerUi = true) {
35113518 continue_postfix: settings.continue_postfix,
35123519 function_calling: settings.function_calling,
35133520 show_thoughts: settings.show_thoughts,
3521+ reasoning_effort: settings.reasoning_effort,
35143522 seed: settings.seed,
35153523 n: settings.n,
35163524 };
@@ -3969,6 +3977,7 @@ function onSettingsPresetChange() {
39693977 continue_postfix: ['#continue_postfix', 'continue_postfix', false],
39703978 function_calling: ['#openai_function_calling', 'function_calling', true],
39713979 show_thoughts: ['#openai_show_thoughts', 'show_thoughts', true],
3980+ reasoning_effort: ['#openai_reasoning_effort', 'reasoning_effort', false],
39723981 seed: ['#seed_openai', 'seed', false],
39733982 n: ['#n_openai', 'n', false],
39743983 };
@@ -5510,6 +5519,11 @@ export function initOpenAI() {
55105519 saveSettingsDebounced();
55115520 });
55125521
5522+ $('#openai_reasoning_effort').on('input', function () {
5523+ oai_settings.reasoning_effort = String($(this).val());
5524+ saveSettingsDebounced();
5525+ });
5526+
55135527 if (!CSS.supports('field-sizing', 'content')) {
55145528 $(document).on('input', '#openai_settings .autoSetHeight', function () {
55155529 resetScrollHeight($(this));
public/style.css+12 -0
@@ -5914,3 +5914,15 @@ body:not(.movingUI) .drawer-content.maximized {
59145914.mes_text div[data-type="assistant_note"]:has(.assistant_note_export)>div:not(.assistant_note_export) {
59155915 flex: 1;
59165916}
5917+
5918+.oneline-dropdown label {
5919+ margin-top: 3px;
5920+ margin-bottom: 5px;
5921+ flex-grow: 1;
5922+ text-align: left;
5923+}
5924+
5925+.oneline-dropdown select {
5926+ min-width: fit-content;
5927+ width: 40%;
5928+}
src/endpoints/backends/chat-completions.js+7 -0
@@ -1063,6 +1063,13 @@ router.post('/generate', jsonParser, function (request, response) {
10631063 return response.status(400).send({ error: true });
10641064 }
10651065
1066+ // A few of OpenAIs reasoning models support reasoning effort
1067+ if ([CHAT_COMPLETION_SOURCES.CUSTOM, CHAT_COMPLETION_SOURCES.OPENAI].includes(request.body.chat_completion_source)) {
1068+ if (['o1', 'o3-mini', 'o3-mini-2025-01-31'].includes(request.body.model)) {
1069+ bodyParams['reasoning_effort'] = request.body.reasoning_effort;
1070+ }
1071+ }
1072+
10661073 if (!apiKey && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {
10671074 console.warn('OpenAI API key is missing.');
10681075 return response.status(400).send({ error: true });