Claude: remove tools from prompt if tools not supported or not provided

991e10c75f7bc0a548fc148b4d42a6d4e07d3705

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

2 files changed, +25 -3Showing whitespace changes
src/endpoints/backends/chat-completions.js+3 -2
@@ -101,8 +101,9 @@ async function sendClaudeRequest(request, response) {
101 controller.abort();101 controller.abort();
102 });102 });
103 const additionalHeaders = {};103 const additionalHeaders = {};
104 const useTools = request.body.model.startsWith('claude-3') && Array.isArray(request.body.tools) && request.body.tools.length > 0;
104 const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt;105 const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt;
105 const convertedPrompt = convertClaudeMessages(request.body.messages, request.body.assistant_prefill, useSystemPrompt, request.body.human_sysprompt_message, request.body.char_name, request.body.user_name);106 const convertedPrompt = convertClaudeMessages(request.body.messages, request.body.assistant_prefill, useSystemPrompt, useTools, request.body.human_sysprompt_message, request.body.char_name, request.body.user_name);
106 // Add custom stop sequences107 // Add custom stop sequences
107 const stopSequences = [];108 const stopSequences = [];
108 if (Array.isArray(request.body.stop)) {109 if (Array.isArray(request.body.stop)) {
@@ -129,7 +130,7 @@ async function sendClaudeRequest(request, response) {
129 } else {130 } else {
130 delete requestBody.system;131 delete requestBody.system;
131 }132 }
132 if (Array.isArray(request.body.tools) && request.body.tools.length > 0) {133 if (useTools) {
133 // Claude doesn't do prefills on function calls, and doesn't allow empty messages134 // Claude doesn't do prefills on function calls, and doesn't allow empty messages
134 if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') {135 if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') {
135 convertedPrompt.messages.push({ role: 'user', content: '.' });136 convertedPrompt.messages.push({ role: 'user', content: '.' });
src/prompt-converters.js+22 -1
@@ -91,11 +91,12 @@ function convertClaudePrompt(messages, addAssistantPostfix, addAssistantPrefill,
91 * @param {object[]} messages Array of messages91 * @param {object[]} messages Array of messages
92 * @param {string} prefillString User determined prefill string92 * @param {string} prefillString User determined prefill string
93 * @param {boolean} useSysPrompt See if we want to use a system prompt93 * @param {boolean} useSysPrompt See if we want to use a system prompt
94 * @param {boolean} useTools See if we want to use tools
94 * @param {string} humanMsgFix Add Human message between system prompt and assistant.95 * @param {string} humanMsgFix Add Human message between system prompt and assistant.
95 * @param {string} charName Character name96 * @param {string} charName Character name
96 * @param {string} userName User name97 * @param {string} userName User name
97 */98 */
98function convertClaudeMessages(messages, prefillString, useSysPrompt, humanMsgFix, charName = '', userName = '') {99function convertClaudeMessages(messages, prefillString, useSysPrompt, useTools, humanMsgFix, charName = '', userName = '') {
99 let systemPrompt = [];100 let systemPrompt = [];
100 if (useSysPrompt) {101 if (useSysPrompt) {
101 // Collect all the system messages up until the first instance of a non-system message, and then remove them from the messages array.102 // Collect all the system messages up until the first instance of a non-system message, and then remove them from the messages array.
@@ -248,6 +249,26 @@ function convertClaudeMessages(messages, prefillString, useSysPrompt, humanMsgFi
248 }249 }
249 });250 });
250251
252 if (!useTools) {
253 mergedMessages.forEach((message) => {
254 message.content.forEach((content) => {
255 if (content.type === 'tool_use') {
256 content.type = 'text';
257 content.text = JSON.stringify(content.input);
258 delete content.id;
259 delete content.name;
260 delete content.input;
261 }
262 if (content.type === 'tool_result') {
263 content.type = 'text';
264 content.text = content.content;
265 delete content.tool_use_id;
266 delete content.content;
267 }
268 });
269 });
270 }
271
251 return { messages: mergedMessages, systemPrompt: systemPrompt };272 return { messages: mergedMessages, systemPrompt: systemPrompt };
252}273}
253274