mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	Claude: remove tools from prompt if tools not supported or not provided
This commit is contained in:
		| @@ -101,8 +101,9 @@ async function sendClaudeRequest(request, response) { | |||||||
|             controller.abort(); |             controller.abort(); | ||||||
|         }); |         }); | ||||||
|         const additionalHeaders = {}; |         const additionalHeaders = {}; | ||||||
|  |         const useTools = request.body.model.startsWith('claude-3') && Array.isArray(request.body.tools) && request.body.tools.length > 0; | ||||||
|         const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt; |         const useSystemPrompt = (request.body.model.startsWith('claude-2') || request.body.model.startsWith('claude-3')) && request.body.claude_use_sysprompt; | ||||||
|         const convertedPrompt = convertClaudeMessages(request.body.messages, request.body.assistant_prefill, useSystemPrompt, request.body.human_sysprompt_message, request.body.char_name, request.body.user_name); |         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); | ||||||
|         // Add custom stop sequences |         // Add custom stop sequences | ||||||
|         const stopSequences = []; |         const stopSequences = []; | ||||||
|         if (Array.isArray(request.body.stop)) { |         if (Array.isArray(request.body.stop)) { | ||||||
| @@ -129,7 +130,7 @@ async function sendClaudeRequest(request, response) { | |||||||
|         } else { |         } else { | ||||||
|             delete requestBody.system; |             delete requestBody.system; | ||||||
|         } |         } | ||||||
|         if (Array.isArray(request.body.tools) && request.body.tools.length > 0) { |         if (useTools) { | ||||||
|             // Claude doesn't do prefills on function calls, and doesn't allow empty messages |             // Claude doesn't do prefills on function calls, and doesn't allow empty messages | ||||||
|             if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') { |             if (convertedPrompt.messages.length && convertedPrompt.messages[convertedPrompt.messages.length - 1].role === 'assistant') { | ||||||
|                 convertedPrompt.messages.push({ role: 'user', content: '.' }); |                 convertedPrompt.messages.push({ role: 'user', content: '.' }); | ||||||
|   | |||||||
| @@ -91,11 +91,12 @@ function convertClaudePrompt(messages, addAssistantPostfix, addAssistantPrefill, | |||||||
|  * @param {object[]} messages Array of messages |  * @param {object[]} messages Array of messages | ||||||
|  * @param {string}   prefillString User determined prefill string |  * @param {string}   prefillString User determined prefill string | ||||||
|  * @param {boolean}  useSysPrompt See if we want to use a system prompt |  * @param {boolean}  useSysPrompt See if we want to use a system prompt | ||||||
|  |  * @param {boolean}  useTools See if we want to use tools | ||||||
|  * @param {string}   humanMsgFix Add Human message between system prompt and assistant. |  * @param {string}   humanMsgFix Add Human message between system prompt and assistant. | ||||||
|  * @param {string}   charName Character name |  * @param {string}   charName Character name | ||||||
|  * @param {string}   userName User name |  * @param {string}   userName User name | ||||||
|  */ |  */ | ||||||
| function convertClaudeMessages(messages, prefillString, useSysPrompt, humanMsgFix, charName = '', userName = '') { | function convertClaudeMessages(messages, prefillString, useSysPrompt, useTools, humanMsgFix, charName = '', userName = '') { | ||||||
|     let systemPrompt = []; |     let systemPrompt = []; | ||||||
|     if (useSysPrompt) { |     if (useSysPrompt) { | ||||||
|         // Collect all the system messages up until the first instance of a non-system message, and then remove them from the messages array. |         // 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 | |||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     if (!useTools) { | ||||||
|  |         mergedMessages.forEach((message) => { | ||||||
|  |             message.content.forEach((content) => { | ||||||
|  |                 if (content.type === 'tool_use') { | ||||||
|  |                     content.type = 'text'; | ||||||
|  |                     content.text = JSON.stringify(content.input); | ||||||
|  |                     delete content.id; | ||||||
|  |                     delete content.name; | ||||||
|  |                     delete content.input; | ||||||
|  |                 } | ||||||
|  |                 if (content.type === 'tool_result') { | ||||||
|  |                     content.type = 'text'; | ||||||
|  |                     content.text = content.content; | ||||||
|  |                     delete content.tool_use_id; | ||||||
|  |                     delete content.content; | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return { messages: mergedMessages, systemPrompt: systemPrompt }; |     return { messages: mergedMessages, systemPrompt: systemPrompt }; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user