Claude: remove tools from prompt if tools not supported or not provided
| @@ -101,8 +101,9 @@ async function sendClaudeRequest(request, response) { | ||
| 101 | 101 | controller.abort(); |
| 102 | 102 | }); |
| 103 | 103 | const additionalHeaders = {}; |
| 104 | + const useTools = request.body.model.startsWith('claude-3') && Array.isArray(request.body.tools) && request.body.tools.length > 0; | |
| 104 | 105 | const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt; |
| 105 | 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 | 107 | // Add custom stop sequences |
| 107 | 108 | const stopSequences = []; |
| 108 | 109 | if (Array.isArray(request.body.stop)) { |
| @@ -129,7 +130,7 @@ async function sendClaudeRequest(request, response) { | ||
| 129 | 130 | } else { |
| 130 | 131 | delete requestBody.system; |
| 131 | 132 | } |
| 132 | - if (Array.isArray(request.body.tools) && request.body.tools.length > 0) { | |
| 133 | + if (useTools) { | |
| 133 | 134 | // Claude doesn't do prefills on function calls, and doesn't allow empty messages |
| 134 | 135 | if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') { |
| 135 | 136 | convertedPrompt.messages.push({ role: 'user', content: '.' }); |
| @@ -91,11 +91,12 @@ function convertClaudePrompt(messages, addAssistantPostfix, addAssistantPrefill, | ||
| 91 | 91 | * @param {object[]} messages Array of messages |
| 92 | 92 | * @param {string} prefillString User determined prefill string |
| 93 | 93 | * @param {boolean} useSysPrompt See if we want to use a system prompt |
| 94 | + * @param {boolean} useTools See if we want to use tools | |
| 94 | 95 | * @param {string} humanMsgFix Add Human message between system prompt and assistant. |
| 95 | 96 | * @param {string} charName Character name |
| 96 | 97 | * @param {string} userName User name |
| 97 | 98 | */ |
| 98 | 99 | function convertClaudeMessages(messages, prefillString, useSysPrompt, useTools, humanMsgFix, charName = '', userName = '') { |
| 99 | 100 | let systemPrompt = []; |
| 100 | 101 | if (useSysPrompt) { |
| 101 | 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 | }); |
| 250 | 251 | |
| 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 | 272 | return { messages: mergedMessages, systemPrompt: systemPrompt }; |
| 252 | 273 | } |
| 253 | 274 | |