add claude-opus-4-7 (#5465)

d1e719eb48c5b88162e1cfc3e8d7278db9373372

ashishch432 <55024632+ashishch432@users.noreply.github.com>

Signed
4 files changed, +19 -6Ignore whitespace
public/index.html+1 -0
@@ -3144,6 +3144,7 @@
3144 <h4 data-i18n="Claude Model">Claude Model</h4>3144 <h4 data-i18n="Claude Model">Claude Model</h4>
3145 <select id="model_claude_select">3145 <select id="model_claude_select">
3146 <optgroup label="Versions">3146 <optgroup label="Versions">
3147 <option value="claude-opus-4-7">claude-opus-4-7</option>
3147 <option value="claude-opus-4-6">claude-opus-4-6</option>3148 <option value="claude-opus-4-6">claude-opus-4-6</option>
3148 <option value="claude-opus-4-5">claude-opus-4-5</option>3149 <option value="claude-opus-4-5">claude-opus-4-5</option>
3149 <option value="claude-opus-4-5-20251101">claude-opus-4-5-20251101</option>3150 <option value="claude-opus-4-5-20251101">claude-opus-4-5-20251101</option>
public/scripts/extensions/caption/settings.html+1 -0
@@ -89,6 +89,7 @@
89 <option data-type="openai" value="o4-mini-2025-04-16">o4-mini-2025-04-16</option>89 <option data-type="openai" value="o4-mini-2025-04-16">o4-mini-2025-04-16</option>
90 <option data-type="openai" value="gpt-4.5-preview">gpt-4.5-preview</option>90 <option data-type="openai" value="gpt-4.5-preview">gpt-4.5-preview</option>
91 <option data-type="openai" value="gpt-4.5-preview-2025-02-27">gpt-4.5-preview-2025-02-27</option>91 <option data-type="openai" value="gpt-4.5-preview-2025-02-27">gpt-4.5-preview-2025-02-27</option>
92 <option data-type="anthropic" value="claude-opus-4-7">claude-opus-4-7</option>
92 <option data-type="anthropic" value="claude-opus-4-6">claude-opus-4-6</option>93 <option data-type="anthropic" value="claude-opus-4-6">claude-opus-4-6</option>
93 <option data-type="anthropic" value="claude-opus-4-5">claude-opus-4-5</option>94 <option data-type="anthropic" value="claude-opus-4-5">claude-opus-4-5</option>
94 <option data-type="anthropic" value="claude-opus-4-5-20251101">claude-opus-4-5-20251101</option>95 <option data-type="anthropic" value="claude-opus-4-5-20251101">claude-opus-4-5-20251101</option>
public/scripts/openai.js+1 -1
@@ -5435,7 +5435,7 @@ async function onModelChange() {
5435 if (oai_settings.chat_completion_source == chat_completion_sources.CLAUDE) {5435 if (oai_settings.chat_completion_source == chat_completion_sources.CLAUDE) {
5436 if (oai_settings.max_context_unlocked) {5436 if (oai_settings.max_context_unlocked) {
5437 $('#openai_max_context').attr('max', unlocked_max);5437 $('#openai_max_context').attr('max', unlocked_max);
5438 } else if (/^claude-(sonnet-4-5|sonnet-4-6|opus-4-6)/.test(value)) {5438 } else if (/^claude-(sonnet-4-5|sonnet-4-6|opus-4-6|opus-4-7)/.test(value)) {
5439 $('#openai_max_context').attr('max', max_1mil);5439 $('#openai_max_context').attr('max', max_1mil);
5440 } else if (/^claude-(3|opus|haiku|sonnet)/.test(value)) {5440 } else if (/^claude-(3|opus|haiku|sonnet)/.test(value)) {
5441 $('#openai_max_context').attr('max', max_200k);5441 $('#openai_max_context').attr('max', max_200k);
src/endpoints/backends/chat-completions.js+16 -5
@@ -228,12 +228,13 @@ async function sendClaudeRequest(request, response) {
228 const useTools = Array.isArray(request.body.tools) && request.body.tools.length > 0;228 const useTools = Array.isArray(request.body.tools) && request.body.tools.length > 0;
229 const useSystemPrompt = Boolean(request.body.use_sysprompt);229 const useSystemPrompt = Boolean(request.body.use_sysprompt);
230 const convertedPrompt = convertClaudeMessages(request.body.messages, request.body.assistant_prefill, useSystemPrompt, useTools, getPromptNames(request));230 const convertedPrompt = convertClaudeMessages(request.body.messages, request.body.assistant_prefill, useSystemPrompt, useTools, getPromptNames(request));
231 const useThinking = /^claude-(3-7|opus-4|sonnet-4|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6)/.test(request.body.model);231 const useThinking = /^claude-(3-7|opus-4|sonnet-4|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6|opus-4-7)/.test(request.body.model);
232 const useWebSearch = /^claude-(3-5|3-7|opus-4|sonnet-4|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6)/.test(request.body.model) && Boolean(request.body.enable_web_search);232 const useWebSearch = /^claude-(3-5|3-7|opus-4|sonnet-4|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6|opus-4-7)/.test(request.body.model) && Boolean(request.body.enable_web_search);
233 const isLimitedSampling = /^claude-(opus-4-1|sonnet-4-5|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6)/.test(request.body.model);233 const isLimitedSampling = /^claude-(opus-4-1|sonnet-4-5|haiku-4-5|opus-4-5|opus-4-6|sonnet-4-6)/.test(request.body.model);
234 const useVerbosity = /^claude-(opus-4-5|opus-4-6|sonnet-4-6)/.test(request.body.model);234 const useVerbosity = /^claude-(opus-4-5|opus-4-6|sonnet-4-6|opus-4-7)/.test(request.body.model);
235 const noPrefillModel = /^claude-(opus-4-6|sonnet-4-6)/.test(request.body.model);235 const noPrefillModel = /^claude-(opus-4-6|sonnet-4-6|opus-4-7)/.test(request.body.model);
236 const isAdaptiveModel = enableAdaptiveThinking && /^claude-(opus-4-6|sonnet-4-6)/.test(request.body.model);236 const isAdaptiveModel = /^claude-(opus-4-7)/.test(request.body.model) || (enableAdaptiveThinking && /^claude-(opus-4-6|sonnet-4-6)/.test(request.body.model));
237 const noSamplingModel = /^claude-(opus-4-7)/.test(request.body.model);
237 let fixThinkingPrefill = false;238 let fixThinkingPrefill = false;
238 // Add custom stop sequences239 // Add custom stop sequences
239 const stopSequences = [];240 const stopSequences = [];
@@ -310,6 +311,12 @@ async function sendClaudeRequest(request, response) {
310 }311 }
311 }312 }
312313
314 if (noSamplingModel) {
315 delete requestBody.temperature;
316 delete requestBody.top_p;
317 delete requestBody.top_k;
318 }
319
313 const reasoningEffort = request.body.reasoning_effort;320 const reasoningEffort = request.body.reasoning_effort;
314 const budgetTokens = calculateClaudeBudgetTokens(requestBody.max_tokens, reasoningEffort, requestBody.stream, isAdaptiveModel);321 const budgetTokens = calculateClaudeBudgetTokens(requestBody.max_tokens, reasoningEffort, requestBody.stream, isAdaptiveModel);
315322
@@ -317,6 +324,10 @@ async function sendClaudeRequest(request, response) {
317 if (useThinking && typeof budgetTokens === 'string') {324 if (useThinking && typeof budgetTokens === 'string') {
318 fixThinkingPrefill = true;325 fixThinkingPrefill = true;
319 requestBody.thinking = { type: 'adaptive' };326 requestBody.thinking = { type: 'adaptive' };
327 const includeReasoning = Boolean(request.body.include_reasoning);
328 if (noSamplingModel && includeReasoning) {
329 requestBody.thinking.display = 'summarized';
330 }
320 requestBody.output_config ??= {};331 requestBody.output_config ??= {};
321 requestBody.output_config.effort = budgetTokens;332 requestBody.output_config.effort = budgetTokens;
322 // top_k is not allowed in adaptive mode333 // top_k is not allowed in adaptive mode