DeepSeek: Add tool calls for reasoner model Fixes #4161

6445c8fec29159356286b5bbe413355fae82dda9

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

3 files changed, +8 -14Showing whitespace changes
public/scripts/openai.js+0 -2
@@ -2385,8 +2385,6 @@ async function sendOpenAIRequest(type, messages, signal) {
2385 delete generate_data.top_logprobs;2385 delete generate_data.top_logprobs;
2386 delete generate_data.logprobs;2386 delete generate_data.logprobs;
2387 delete generate_data.logit_bias;2387 delete generate_data.logit_bias;
2388 delete generate_data.tools;
2389 delete generate_data.tool_choice;
2390 }2388 }
2391 }2389 }
23922390
src/endpoints/backends/chat-completions.js+4 -3
@@ -34,6 +34,7 @@ import {
34 calculateGoogleBudgetTokens,34 calculateGoogleBudgetTokens,
35 postProcessPrompt,35 postProcessPrompt,
36 PROMPT_PROCESSING_TYPE,36 PROMPT_PROCESSING_TYPE,
37 addAssistantPrefix,
37} from '../../prompt-converters.js';38} from '../../prompt-converters.js';
3839
39import { readSecret, SECRET_KEYS } from '../secrets.js';40import { readSecret, SECRET_KEYS } from '../secrets.js';
@@ -869,9 +870,9 @@ async function sendDeepSeekRequest(request, response) {
869 }870 }
870871
871 const postProcessType = String(request.body.model).endsWith('-reasoner')872 const postProcessType = String(request.body.model).endsWith('-reasoner')
872 ? PROMPT_PROCESSING_TYPE.DEEPSEEK_REASONER873 ? PROMPT_PROCESSING_TYPE.STRICT_TOOLS
873 : PROMPT_PROCESSING_TYPE.DEEPSEEK;874 : PROMPT_PROCESSING_TYPE.SEMI_TOOLS;
874 const processedMessages = postProcessPrompt(request.body.messages, postProcessType, getPromptNames(request));875 const processedMessages = addAssistantPrefix(postProcessPrompt(request.body.messages, postProcessType, getPromptNames(request)), bodyParams.tools);
875876
876 const requestBody = {877 const requestBody = {
877 'messages': processedMessages,878 'messages': processedMessages,
src/prompt-converters.js+4 -9
@@ -23,8 +23,6 @@ export const PROMPT_PROCESSING_TYPE = {
23 STRICT: 'strict',23 STRICT: 'strict',
24 STRICT_TOOLS: 'strict_tools',24 STRICT_TOOLS: 'strict_tools',
25 SINGLE: 'single',25 SINGLE: 'single',
26 DEEPSEEK: 'deepseek',
27 DEEPSEEK_REASONER: 'deepseek-reasoner',
28};26};
2927
30/**28/**
@@ -54,14 +52,15 @@ export function getPromptNames(request) {
54/**52/**
55 * Adds an assistant prefix to the last message.53 * Adds an assistant prefix to the last message.
56 * @param {any[]} prompt Prompt messages array54 * @param {any[]} prompt Prompt messages array
55 * @param {any[]} tools Array of tool definitions
57 * @returns {any[]} Transformed messages array56 * @returns {any[]} Transformed messages array
58 */57 */
59function addAssistantPrefix(prompt) {58export function addAssistantPrefix(prompt, tools) {
60 if (!prompt.length) {59 if (!prompt.length) {
61 return prompt;60 return prompt;
62 }61 }
63 const hasAnyToolMessages = prompt.some(x => x.role === 'tool');62 const hasAnyTools = (Array.isArray(tools) && tools.length > 0) || prompt.some(x => x.role === 'tool');
64 if (!hasAnyToolMessages && prompt[prompt.length - 1].role === 'assistant') {63 if (!hasAnyTools && prompt[prompt.length - 1].role === 'assistant') {
65 prompt[prompt.length - 1].prefix = true;64 prompt[prompt.length - 1].prefix = true;
66 }65 }
67 return prompt;66 return prompt;
@@ -89,10 +88,6 @@ export function postProcessPrompt(messages, type, names) {
89 return mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: false });88 return mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: false });
90 case PROMPT_PROCESSING_TYPE.STRICT_TOOLS:89 case PROMPT_PROCESSING_TYPE.STRICT_TOOLS:
91 return mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: true });90 return mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: true });
92 case PROMPT_PROCESSING_TYPE.DEEPSEEK:
93 return addAssistantPrefix(mergeMessages(messages, names, { strict: true, placeholders: false, single: false, tools: true }));
94 case PROMPT_PROCESSING_TYPE.DEEPSEEK_REASONER:
95 return addAssistantPrefix(mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: true }));
96 case PROMPT_PROCESSING_TYPE.SINGLE:91 case PROMPT_PROCESSING_TYPE.SINGLE:
97 return mergeMessages(messages, names, { strict: true, placeholders: false, single: true, tools: false });92 return mergeMessages(messages, names, { strict: true, placeholders: false, single: true, tools: false });
98 default:93 default: