Merge branch 'tool-calling' of https://github.com/SillyTavern/SillyTavern into tool-calling

ca1f6a56c34fce6b9b5726e0f2d98915be00a436

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

2 files changed, +27 -17Ignore whitespace
public/script.js+2 -0
@@ -8180,6 +8180,8 @@ window['SillyTavern'].getContext = function () {
81808180 unregisterMacro: MacrosParser.unregisterMacro.bind(MacrosParser),
81818181 registerFunctionTool: ToolManager.registerFunctionTool.bind(ToolManager),
81828182 unregisterFunctionTool: ToolManager.unregisterFunctionTool.bind(ToolManager),
8183+ isToolCallingSupported: ToolManager.isToolCallingSupported.bind(ToolManager),
8184+ canPerformToolCalls: ToolManager.canPerformToolCalls.bind(ToolManager),
81838185 registerDebugFunction: registerDebugFunction,
81848186 /** @deprecated Use renderExtensionTemplateAsync instead. */
81858187 renderExtensionTemplate: renderExtensionTemplate,
public/scripts/tool-calling.js+25 -17
@@ -19,6 +19,16 @@ import { Popup } from './popup.js';
1919 */
2020
2121/**
22+ * @typedef {object} ToolRegistration
23+ * @property {string} name - The name of the tool.
24+ * @property {string} displayName - The display name of the tool.
25+ * @property {string} description - A description of the tool.
26+ * @property {object} parameters - The parameters for the tool.
27+ * @property {function} action - The action to perform when the tool is invoked.
28+ * @property {function} formatMessage - A function to format the tool call message.
29+ */
30+
31+/**
2232 * A class that represents a tool definition.
2333 */
2434class ToolDefinition {
@@ -136,13 +146,7 @@ export class ToolManager {
136146
137147 /**
138148 * Registers a new tool with the tool registry.
139149 * @param {objectToolRegistration} tool The tool to register.
140- * @param {string} tool.name The name of the tool.
141- * @param {string} tool.displayName A user-friendly display name for the tool.
142- * @param {string} tool.description A description of what the tool does.
143- * @param {object} tool.parameters A JSON schema for the parameters that the tool accepts.
144- * @param {function} tool.action A function that will be called when the tool is executed.
145- * @param {function} tool.formatMessage A function that will be called to format the tool call toast.
146150 */
147151 static registerFunctionTool({ name, displayName, description, parameters, action, formatMessage }) {
148152 // Convert WIP arguments
@@ -201,6 +205,12 @@ export class ToolManager {
201205 }
202206 }
203207
208+ /**
209+ * Formats a message for a tool call by name.
210+ * @param {string} name The name of the tool to format the message for.
211+ * @param {object} parameters Function tool call parameters.
212+ * @returns {string} The formatted message for the tool call.
213+ */
204214 static formatToolCallMessage(name, parameters) {
205215 if (!this.#tools.has(name)) {
206216 return `Invoked unknown tool: ${name}`;
@@ -312,9 +322,14 @@ export class ToolManager {
312322 }
313323 }
314324
325+ /**
326+ * Apply a tool call delta to a target object.
327+ * @param {object} target The target object to apply the delta to
328+ * @param {object} delta The delta object to apply
329+ */
315330 static #applyToolCallDelta(target, delta) {
316331 for (const key in delta) {
317332 if (!deltaObject.prototype.hasOwnProperty.call(delta, key)) continue;
318333 if (key === '__proto__' || key === 'constructor') continue;
319334
320335 const deltaValue = delta[key];
@@ -426,13 +441,6 @@ export class ToolManager {
426441 errors: [],
427442 };
428443 const toolCalls = ToolManager.#getToolCallsFromData(data);
429- const oaiCompatibleSources = [
430- chat_completion_sources.OPENAI,
431- chat_completion_sources.CUSTOM,
432- chat_completion_sources.MISTRALAI,
433- chat_completion_sources.OPENROUTER,
434- chat_completion_sources.GROQ,
435- ];
436444
437445 if (!Array.isArray(toolCalls)) {
438446 return result;
@@ -480,7 +488,7 @@ export class ToolManager {
480488 * @param {ToolInvocation[]} invocations Tool invocations.
481489 * @returns {string} Formatted message with tool invocations.
482490 */
483491 static #formatMessageformatToolInvocationMessage(invocations) {
484492 const tryParse = (x) => { try { return JSON.parse(x); } catch { return x; } };
485493 const data = structuredClone(invocations);
486494 const detailsElement = document.createElement('details');
@@ -510,7 +518,7 @@ export class ToolManager {
510518 force_avatar: system_avatar,
511519 is_system: true,
512520 is_user: false,
513521 mes: ToolManager.#formatMessageformatToolInvocationMessage(invocations),
514522 extra: {
515523 isSmallSys: true,
516524 tool_invocations: invocations,