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) {
23852385 delete generate_data.top_logprobs;
23862386 delete generate_data.logprobs;
23872387 delete generate_data.logit_bias;
2388- delete generate_data.tools;
2389- delete generate_data.tool_choice;
23902388 }
23912389 }
23922390
src/endpoints/backends/chat-completions.js+4 -3
@@ -34,6 +34,7 @@ import {
3434 calculateGoogleBudgetTokens,
3535 postProcessPrompt,
3636 PROMPT_PROCESSING_TYPE,
37+ addAssistantPrefix,
3738} from '../../prompt-converters.js';
3839
3940import { readSecret, SECRET_KEYS } from '../secrets.js';
@@ -869,9 +870,9 @@ async function sendDeepSeekRequest(request, response) {
869870 }
870871
871872 const postProcessType = String(request.body.model).endsWith('-reasoner')
872873 ? PROMPT_PROCESSING_TYPE.DEEPSEEK_REASONERSTRICT_TOOLS
873874 : PROMPT_PROCESSING_TYPE.DEEPSEEKSEMI_TOOLS;
874875 const processedMessages = addAssistantPrefix(postProcessPrompt(request.body.messages, postProcessType, getPromptNames(request)), bodyParams.tools);
875876
876877 const requestBody = {
877878 'messages': processedMessages,
src/prompt-converters.js+4 -9
@@ -23,8 +23,6 @@ export const PROMPT_PROCESSING_TYPE = {
2323 STRICT: 'strict',
2424 STRICT_TOOLS: 'strict_tools',
2525 SINGLE: 'single',
26- DEEPSEEK: 'deepseek',
27- DEEPSEEK_REASONER: 'deepseek-reasoner',
2826};
2927
3028/**
@@ -54,14 +52,15 @@ export function getPromptNames(request) {
5452/**
5553 * Adds an assistant prefix to the last message.
5654 * @param {any[]} prompt Prompt messages array
55+ * @param {any[]} tools Array of tool definitions
5756 * @returns {any[]} Transformed messages array
5857 */
5958export function addAssistantPrefix(prompt, tools) {
6059 if (!prompt.length) {
6160 return prompt;
6261 }
6362 const hasAnyToolMessageshasAnyTools = (Array.isArray(tools) && tools.length > 0) || prompt.some(x => x.role === 'tool');
6463 if (!hasAnyToolMessageshasAnyTools && prompt[prompt.length - 1].role === 'assistant') {
6564 prompt[prompt.length - 1].prefix = true;
6665 }
6766 return prompt;
@@ -89,10 +88,6 @@ export function postProcessPrompt(messages, type, names) {
8988 return mergeMessages(messages, names, { strict: true, placeholders: true, single: false, tools: false });
9089 case PROMPT_PROCESSING_TYPE.STRICT_TOOLS:
9190 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 }));
9691 case PROMPT_PROCESSING_TYPE.SINGLE:
9792 return mergeMessages(messages, names, { strict: true, placeholders: false, single: true, tools: false });
9893 default: