Claude: remove tools from prompt if tools not supported or not provided
| @@ -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 sequences | 107 | // 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 messages | 134 | // 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: '.' }); |
| @@ -91,11 +91,12 @@ function convertClaudePrompt(messages, addAssistantPostfix, addAssistantPrefill, | |||
| 91 | * @param {object[]} messages Array of messages | 91 | * @param {object[]} messages Array of messages |
| 92 | * @param {string} prefillString User determined prefill string | 92 | * @param {string} prefillString User determined prefill string |
| 93 | * @param {boolean} useSysPrompt See if we want to use a system prompt | 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 | * @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 name | 96 | * @param {string} charName Character name |
| 96 | * @param {string} userName User name | 97 | * @param {string} userName User name |
| 97 | */ | 98 | */ |
| 98 | function convertClaudeMessages(messages, prefillString, useSysPrompt, humanMsgFix, charName = '', userName = '') { | 99 | function 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 | }); |
| 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 | return { messages: mergedMessages, systemPrompt: systemPrompt }; | 272 | return { messages: mergedMessages, systemPrompt: systemPrompt }; |
| 252 | } | 273 | } |
| 253 | 274 | ||