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

991e10c75f7bc0a548fc148b4d42a6d4e07d3705

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

2 files changed, +25 -3Ignore whitespace
src/endpoints/backends/chat-completions.js+3 -2
@@ -101,8 +101,9 @@ async function sendClaudeRequest(request, response) {
101101 controller.abort();
102102 });
103103 const additionalHeaders = {};
104+ const useTools = request.body.model.startsWith('claude-3') && Array.isArray(request.body.tools) && request.body.tools.length > 0;
104105 const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt;
105106 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);
106107 // Add custom stop sequences
107108 const stopSequences = [];
108109 if (Array.isArray(request.body.stop)) {
@@ -129,7 +130,7 @@ async function sendClaudeRequest(request, response) {
129130 } else {
130131 delete requestBody.system;
131132 }
132- if (Array.isArray(request.body.tools) && request.body.tools.length > 0) {
133+ if (useTools) {
133134 // Claude doesn't do prefills on function calls, and doesn't allow empty messages
134135 if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') {
135136 convertedPrompt.messages.push({ role: 'user', content: '.' });
src/prompt-converters.js+22 -1
@@ -91,11 +91,12 @@ function convertClaudePrompt(messages, addAssistantPostfix, addAssistantPrefill,
9191 * @param {object[]} messages Array of messages
9292 * @param {string} prefillString User determined prefill string
9393 * @param {boolean} useSysPrompt See if we want to use a system prompt
94+ * @param {boolean} useTools See if we want to use tools
9495 * @param {string} humanMsgFix Add Human message between system prompt and assistant.
9596 * @param {string} charName Character name
9697 * @param {string} userName User name
9798 */
9899function convertClaudeMessages(messages, prefillString, useSysPrompt, useTools, humanMsgFix, charName = '', userName = '') {
99100 let systemPrompt = [];
100101 if (useSysPrompt) {
101102 // 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
248249 }
249250 });
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+
251272 return { messages: mergedMessages, systemPrompt: systemPrompt };
252273}
253274