#
函数调用
函数调用允许通过让 LLM 使用结构化数据为您的扩展添加动态功能,然后您可以使用这些数据来触发扩展的特定功能。
#
示例用例
- 查询外部 API 以获取额外信息(新闻、天气、网络搜索等)。
- 根据用户输入执行计算或转换。
- 存储和调用重要的记忆或事实,包括 RAG 和数据库查询。
- 在对话中引入真正的随机性(掷骰子、抛硬币等)。
#
使用函数调用的官方支持的扩展
- 图像生成(内置)- 根据用户提示生成图像。
- 网络搜索 - 触发查询的网络搜索。
- RSS - 从 RSS 源获取最新新闻。
- AccuWeather - 从 AccuWeather 获取天气信息。
- D&D 骰子 - 为 D&D 游戏掷骰子。
#
先决条件和限制
- 此功能仅适用于某些聊天完成源:OpenAI、Claude、MistralAI、Groq、Cohere、OpenRouter、AI21、Google AI Studio、Google Vertex AI、DeepSeek、AI/ML API 和自定义 API 源。
- 文本完成 API 不支持函数调用,但一些本地托管的后端如 Ollama 和 TabbyAPI 可能以自定义 OpenAI 兼容模式在聊天完成下运行。
- 函数调用的支持必须首先由用户明确允许。这是通过在 AI 响应配置面板中启用"启用函数调用"选项来完成的。
- 不能保证 LLM 会执行任何函数调用。大多数它们需要通过提示进行明确的"激活"(例如,用户要求"掷骰子"、"获取天气"等)。
- 并非所有提示都可以触发工具调用。延续、模拟、背景('quiet')提示不允许触发工具调用。它们仍可以在其响应中使用过去成功的工具调用。
#
如何制作函数工具
#
检查是否支持该功能
要确定是否支持函数工具调用功能,您可以从 SillyTavern.getContext() 对象调用 isToolCallingSupported。这将检查当前 API 是否支持函数工具调用以及是否在设置中启用。以下是检查是否支持该功能的示例:
if (SillyTavern.getContext().isToolCallingSupported()) {
console.log("支持函数工具调用");
} else {
console.log("不支持函数工具调用");
}
#
注册函数
要注册函数工具,您需要从 SillyTavern.getContext() 对象调用 registerFunctionTool 函数并传递所需的参数。以下是注册函数工具的示例:
SillyTavern.getContext().registerFunctionTool({
// 函数工具的内部名称。必须唯一。
name: "myFunction",
// 函数工具的显示名称。将在 UI 中显示。(可选)
displayName: "My Function",
// 函数工具的描述。必须描述函数的功能以及何时使用它。
description: "My function description. Use when you need to do something.",
// 函数工具参数的 JSON 模式。参见:https://json-schema.org/
parameters: {
$schema: 'http://json-schema.org/draft-04/schema#',
type: 'object',
properties: {
param1: {
type: 'string',
description: 'Parameter 1 description',
},
param2: {
type: 'string',
description: 'Parameter 2 description',
},
},
required: [
'param1', 'param2',
],
},
// 工具触发时调用的函数。可以是异步的。
// 如果结果不是字符串,它将被 JSON 字符串化。
action: async ({ param1, param2 }) => {
// 您的函数代码在这里
console.log(`Function called with parameters: ${param1}, ${param2}`);
return "Function result";
},
// 可选函数,用于格式化调用函数时显示的 toast 消息。
// 如果返回空字符串,则不会显示 toast 消息。
formatMessage: ({ param1, param2 }) => {
return `Function is called with: ${param1} and ${param2}`;
},
// 可选函数,返回一个布尔值,指示是否应为当前提示注册工具。
// 如果没有提供 shouldRegister 函数,工具将为每个提示注册。
shouldRegister: () => {
return true;
},
// 可选标志。如果设置为 true,将执行函数调用,但结果不会记录到可见的聊天历史中。
stealth: false,
});
#
注销函数
要停用函数工具,您需要从 SillyTavern.getContext() 对象调用 unregisterFunctionTool 函数并传递要禁用的函数工具名称。以下是注销函数工具的示例:
SillyTavern.getContext().unregisterFunctionTool("myFunction");
#
提示和技巧
- 成功的工具调用将保存为可见历史的一部分,并将在聊天 UI 中显示,因此您可以检查实际的参数和结果。如果这是不可取的,请在注册函数工具时设置
stealth: true标志。 - 如果您不想在聊天历史中看到工具调用。如果您想使用自定义 CSS 来样式化或隐藏它们,请定位
.mes元素上的toolCall类,即.mes.toolCall { display: none; }或.mes.toolCall { color: #999; }。