Merge branch 'staging' into hidden-reasoning-tracking

d1018a824c3303a96758680459ac735b351ffca9

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

6 files changed, +30 -7Ignore whitespace
public/index.html+1 -1
@@ -1934,7 +1934,7 @@
19341934 </span>
19351935 </div>
19361936 </div>
19371937 <div class="range-block" data-source="openai,cohere,mistralai,custom,claude,openrouter,groq,deepseek">
19381938 <label for="openai_function_calling" class="checkbox_label flexWrap widthFreeExpand">
19391939 <input id="openai_function_calling" type="checkbox" />
19401940 <span data-i18n="Enable function calling">Enable function calling</span>
public/script.js+3 -2
@@ -269,7 +269,7 @@ import { initSettingsSearch } from './scripts/setting-search.js';
269269import { initBulkEdit } from './scripts/bulk-edit.js';
270270import { deriveTemplatesFromChatTemplate } from './scripts/chat-templates.js';
271271import { getContext } from './scripts/st-context.js';
272272import { extractReasoningFromData, initReasoning, PromptReasoning, ReasoningHandler, removeReasoningFromString, updateReasoningUI } from './scripts/reasoning.js';
273273
274274// API OBJECT FOR EXTERNAL WIRING
275275globalThis.SillyTavern = {
@@ -2785,7 +2785,8 @@ export async function generateQuietPrompt(quiet_prompt, quietToLoud, skipWIAN, q
27852785 TempResponseLength.save(main_api, responseLength);
27862786 eventHook = TempResponseLength.setupEventHook(main_api);
27872787 }
27882788 returnconst result = await Generate('quiet', options);
2789+ return removeReasoningFromString(result);
27892790 } finally {
27902791 if (responseLengthCustomized && TempResponseLength.isCustomized()) {
27912792 TempResponseLength.restore(main_api);
public/scripts/openai.js+6 -4
@@ -1916,6 +1916,10 @@ async function sendOpenAIRequest(type, messages, signal) {
19161916 'reasoning_effort': String(oai_settings.reasoning_effort),
19171917 };
19181918
1919+ if (!canMultiSwipe && ToolManager.canPerformToolCalls(type)) {
1920+ await ToolManager.registerFunctionToolsOpenAI(generate_data);
1921+ }
1922+
19191923 // Empty array will produce a validation error
19201924 if (!Array.isArray(generate_data.stop) || !generate_data.stop.length) {
19211925 delete generate_data.stop;
@@ -2039,6 +2043,8 @@ async function sendOpenAIRequest(type, messages, signal) {
20392043 delete generate_data.top_logprobs;
20402044 delete generate_data.logprobs;
20412045 delete generate_data.logit_bias;
2046+ delete generate_data.tools;
2047+ delete generate_data.tool_choice;
20422048 }
20432049 }
20442050
@@ -2046,10 +2052,6 @@ async function sendOpenAIRequest(type, messages, signal) {
20462052 generate_data['seed'] = oai_settings.seed;
20472053 }
20482054
2049- if (!canMultiSwipe && ToolManager.canPerformToolCalls(type)) {
2050- await ToolManager.registerFunctionToolsOpenAI(generate_data);
2051- }
2052-
20532055 if (isOAI && (oai_settings.openai_model.startsWith('o1') || oai_settings.openai_model.startsWith('o3'))) {
20542056 generate_data.messages.forEach((msg) => {
20552057 if (msg.role === 'system') {
public/scripts/reasoning.js+14 -0
@@ -768,6 +768,20 @@ function setReasoningEventHandlers() {
768768}
769769
770770/**
771+ * Removes reasoning from a string if auto-parsing is enabled.
772+ * @param {string} str Input string
773+ * @returns {string} Output string
774+ */
775+export function removeReasoningFromString(str) {
776+ if (!power_user.reasoning.auto_parse) {
777+ return str;
778+ }
779+
780+ const parsedReasoning = parseReasoningFromString(str);
781+ return parsedReasoning?.content ?? str;
782+}
783+
784+/**
771785 * Parses reasoning from a string using the power user reasoning settings.
772786 * @typedef {Object} ParsedReasoning
773787 * @property {string} reasoning Reasoning block
public/scripts/tool-calling.js+1 -0
@@ -563,6 +563,7 @@ export class ToolManager {
563563 chat_completion_sources.OPENROUTER,
564564 chat_completion_sources.GROQ,
565565 chat_completion_sources.COHERE,
566+ chat_completion_sources.DEEPSEEK,
566567 ];
567568 return supportedSources.includes(oai_settings.chat_completion_source);
568569 }
src/endpoints/backends/chat-completions.js+5 -0
@@ -672,6 +672,11 @@ async function sendDeepSeekRequest(request, response) {
672672 bodyParams['logprobs'] = true;
673673 }
674674
675+ if (Array.isArray(request.body.tools) && request.body.tools.length > 0) {
676+ bodyParams['tools'] = request.body.tools;
677+ bodyParams['tool_choice'] = request.body.tool_choice;
678+ }
679+
675680 const postProcessType = String(request.body.model).endsWith('-reasoner') ? 'deepseek-reasoner' : 'deepseek';
676681 const processedMessages = postProcessPrompt(request.body.messages, postProcessType, getPromptNames(request));
677682