diff --git a/docs/script-docs.md b/docs/script-docs.md deleted file mode 100644 index cc999eb..0000000 --- a/docs/script-docs.md +++ /dev/null @@ -1,1718 +0,0 @@ -关于小白X插件核心功能: -1. 代码块渲染功能: - - SillyTavern原生只支持显示静态代码块,无法执行JavaScript或渲染HTML - - 小白X将聊天中包含HTML标签(完整的, 或单独的 - - -``` -3. 定时任务模块: - - 拓展菜单中允许设置"在对话中自动执行"的斜杠命令 - - 可以设置触发频率(每几楼层)、触发条件(AI消息后/用户消息前/每轮对话) - - 每个任务包含:名称、要执行的命令、触发间隔、触发类型 - - 注册了/xbqte命令手动触发任务: \`/xbqte 任务名称\` - - 注册了/xbset命令调整任务间隔: \`/xbset 任务名称 间隔数字\` - - 任务命令可以使用所有标准STscript斜杠命令 - -### 4. 流式静默生成 - -这是 /gen 和 /genraw 命令的流式版本,支持流式并发。SillyTavern原生不支持流式并发,插件通过会话槽位(1-10)实现通道隔离,可同时进行多个独立的流式生成任务。 - -斜杠命令 - -命令格式: -/xbgen [参数] 提示文本 // 流式版 /gen (带上下文) -/xbgenraw [参数] 提示文本 // 流式版 /genraw (纯提示) - -可用参数: -as=system|user|assistant - 消息角色,xbgen默认system,xbgenraw默认user -id=1-10 或 id=xb1-xb10 - 会话槽位,默认1号 -api=openai|claude|gemini|cohere|deepseek - 后端类型,默认跟随主API -model=模型名 - 指定模型,默认使用后端默认模型 -apiurl=URL - 自定义API地址(部分后端支持) -apipassword=密钥 - 配合apiurl使用的密码 - -返回值: 会话ID字符串 - -UI侧可用函数 - -// 获取插件对象 -const streaming = window.parent.xiaobaixStreamingGeneration; - -// 1. 获取生成文本 -streaming.getLastGeneration(sessionId) -// 参数: sessionId可选,不传则获取最后一个会话 -// 返回: 当前生成的文本字符串 - -// 2. 获取会话状态 -streaming.getStatus(sessionId) -// 参数: sessionId可选 -// 返回: {isStreaming: boolean, text: string, sessionId: string} - -// 3. 取消生成 -streaming.cancel(sessionId) -// 参数: sessionId - 要取消的会话ID - -// 4. 执行斜杠命令 -await STscript(命令字符串) -// 参数: 完整的斜杠命令 -// 返回: 会话ID - -事件监听 - -// 监听生成完成事件 -window.addEventListener('message', (e) => { - if (e.data?.type === 'xiaobaix_streaming_completed') { - const { finalText, originalPrompt, sessionId } = e.data.payload; - // finalText: 最终生成文本 - // originalPrompt: 原始提示词 - // sessionId: 会话ID - } -}); - -完整使用示例 - -单任务流程: -// 1. 开始生成 -const sessionId = await STscript('/xbgen 写一个故事'); - -// 2. 轮询显示 -const timer = setInterval(() => { - const status = streaming.getStatus(sessionId); - if (status.text) { - document.getElementById('output').textContent = status.text; - } -}, 100); - -// 3. 监听完成 -window.addEventListener('message', (e) => { - if (e.data?.type === 'xiaobaix_streaming_completed' && - e.data.payload.sessionId === sessionId) { - clearInterval(timer); - document.getElementById('output').textContent = e.data.payload.finalText; - } -}); - -// 4. 可选: 取消生成 -// streaming.cancel(sessionId); - -并发任务示例: -// 同时启动3个任务 -const task1 = await STscript('/xbgen id=1 继续剧情'); -const task2 = await STscript('/xbgenraw id=2 api=claude 总结全文'); -const task3 = await STscript('/xbgen id=3 as=user 查看其他NPC生活状态'); - -// 分别轮询显示 -const timer = setInterval(() => { - document.getElementById('story').textContent = streaming.getLastGeneration(1); - document.getElementById('trans').textContent = streaming.getLastGeneration(2); - document.getElementById('chat').textContent = streaming.getLastGeneration(3); -}, 100); - -// 监听完成 (会收到3次事件) -window.addEventListener('message', (e) => { - if (e.data?.type === 'xiaobaix_streaming_completed') { - const sessionId = e.data.payload.sessionId; - console.log(`任务${sessionId}完成:`, e.data.payload.finalText); - } -}); - -使用注意事项 - -1. 会话槽位: 不指定id默认使用1号,并发时必须指定不同id -2. 轮询频率: 建议80-200ms间隔,避免过于频繁 -3. 资源清理: 完成后记得clearInterval,长期运行可定期取消不用的会话 - -5. 以下是SillyTavern的官方STscript脚本文档,可结合小白X功能创作深度定制的SillyTavern角色卡。 ----------------------- -# STscript 语言参考 - -## 什么是STscript? - -这是一种简单但功能强大的脚本语言,可用于在不需要严肃编程的情况下扩展SillyTavern(酒馆)的功能,让您能够: - -创建迷你游戏或速通挑战 -构建AI驱动的聊天洞察 -释放您的创造力并与他人分享 -STscript基于斜杠命令引擎构建,利用命令批处理、数据管道、宏和变量。这些概念将在以下文档中详细描述。 ---- -## Hello, World! - -要运行您的第一个脚本,请打开任何SillyTavern聊天窗口,并在聊天输入栏中输入以下内容: - -``` -/pass Hello, World! | /echo -``` - -您应该会在屏幕顶部的提示框中看到消息。现在让我们逐步分析。 - -脚本是一批命令,每个命令以斜杠开头,可以带有或不带有命名和未命名参数,并以命令分隔符结束:`|`。 - -命令按顺序依次执行,并在彼此之间传输数据。 - -`/pass`命令接受"Hello, World!"作为未命名参数的常量值,并将其写入管道。 -`/echo`命令通过管道从前一个命令接收值,并将其显示为提示通知。 - -> 提示:要查看所有可用命令的列表,请在聊天中输入`/help slash`。 - -由于常量未命名参数和管道是可互换的,我们可以简单地将此脚本重写为: - -``` -/echo Hello, World! -``` - - - -## 用户输入 - -现在让我们为脚本添加一些交互性。我们将接受用户的输入值并在通知中显示它。 - -``` -/input Enter your name | -/echo Hello, my name is {{pipe}} -``` - -`/input`命令用于显示一个带有指定提示的输入框,然后将输出写入管道。 -由于`/echo`已经有一个设置输出模板的未命名参数,我们使用`{{pipe}}`宏来指定管道值将被渲染的位置。 - -### 其他输入/输出命令 - -`/popup (文本)` — 显示一个阻塞弹窗,支持简单HTML格式,例如:`/popup 我是红色的!`。 -`/setinput (文本)` — 用提供的文本替换用户输入栏的内容。 -`/speak voice="名称" (文本)` — 使用选定的TTS引擎和语音映射中的角色名称朗读文本,例如 `/speak name="唐老鸭" 嘎嘎!`。 -`/buttons labels=["a","b"] (文本)` — 显示一个带有指定文本和按钮标签的阻塞弹窗。`labels`必须是JSON序列化的字符串数组或包含此类数组的变量名。将点击的按钮标签返回到管道,如果取消则返回空字符串。文本支持简单HTML格式。 - - - -#### `/popup`和`/input`的参数 - -`/popup`和`/input`支持以下附加命名参数: - -* `large=on/off` - 增加弹窗的垂直尺寸。默认:`off`。 -* `wide=on/off` - 增加弹窗的水平尺寸。默认:`off`。 -* `okButton=字符串` - 添加自定义"确定"按钮文本的功能。默认:`Ok`。 -* `rows=数字` - (仅适用于`/input`) 增加输入控件的大小。默认:`1`。 - -示例: - -``` -/popup large=on wide=on okButton="接受" 请接受我们的条款和条件.... -``` - - - -#### /echo的参数 - -`/echo`支持以下附加`severity`参数值,用于设置显示消息的样式。 - -* `warning` -* `error` -* `info` (默认) -* `success` - -示例: - -``` -/echo severity=error 发生了非常糟糕的事情。 -``` - - - -## 变量 - -变量用于在脚本中存储和操作数据,可以使用命令或宏。变量可以是以下类型之一: - -* 本地变量 — 保存到当前聊天的元数据中,并且对其唯一。 -* 全局变量 — 保存到settings.json中,并在整个应用程序中存在。 - - - -1. `/getvar name`或`{{getvar::name}}` — 获取本地变量的值。 -2. `/setvar key=name value`或`{{setvar::name::value}}` — 设置本地变量的值。 -3. `/addvar key=name increment`或`{{addvar::name::increment}}` — 将增量添加到本地变量的值。 -4. `/incvar name`或`{{incvar::name}}` — 将本地变量的值增加1。 -5. `/decvar name`或`{{decvar::name}}` — 将本地变量的值减少1。 -6. `/getglobalvar name`或`{{getglobalvar::name}}` — 获取全局变量的值。 -7. `/setglobalvar key=name`或`{{setglobalvar::name::value}}` — 设置全局变量的值。 -8. `/addglobalvar key=name`或`{{addglobalvar::name:increment}}` — 将增量添加到全局变量的值。 -9. `/incglobalvar name`或`{{incglobalvar::name}}` — 将全局变量的值增加1。 -10. `/decglobalvar name`或`{{decglobalvar::name}}` — 将全局变量的值减少1。 -11. `/flushvar name` — 删除本地变量的值。 -12. `/flushglobalvar name` — 删除全局变量的值。 - - - -* 先前未定义变量的默认值是空字符串,或者如果首次在`/addvar`、`/incvar`、`/decvar`命令中使用,则为零。 -* `/addvar`命令中的增量执行加法或减法(如果增量和变量值都可以转换为数字),否则执行字符串连接。 -* 如果命令参数接受变量名,并且同名的本地和全局变量都存在,则本地变量优先。 -* 所有用于变量操作的斜杠命令都将结果值写入管道,供下一个命令使用。 -* 对于宏,只有"get"、"inc"和"dec"类型的宏返回值,而"add"和"set"则替换为空字符串。 - - - -现在,让我们考虑以下示例: - -``` -/input What do you want to generate? | -/setvar key=SDinput | -/echo Requesting an image of {{getvar::SDinput}} | -/getvar SDinput | -/imagine -``` - - - -1. 用户输入的值保存在名为SDinput的本地变量中。 -2. `getvar`宏用于在`/echo`命令中显示该值。 -3. `getvar`命令用于检索变量的值并通过管道传递。 -4. 该值传递给`/imagine`命令(由Image Generation插件提供)作为其输入提示。 - - - -由于变量在脚本执行之间保存且不会刷新,您可以在其他脚本和通过宏中引用该变量,它将解析为与示例脚本执行期间相同的值。为确保值被丢弃,请在脚本中添加`/flushvar`命令。 - - - -### 数组和对象 - -变量值可以包含JSON序列化的数组或键值对(对象)。 - - - -示例: - -* 数组:["apple","banana","orange"] -* 对象:{"fruits":["apple","banana","orange"]} - - - -以下修改可应用于命令以处理这些变量: - -* `/len`命令获取数组中的项目数量。 -* `index=数字/字符串`命名参数可以添加到`/getvar`或`/setvar`及其全局对应项,以通过数组的零基索引或对象的字符串键获取或设置子值。 - - * 如果在不存在的变量上使用数字索引,该变量将被创建为空数组`[]`。 - * 如果在不存在的变量上使用字符串索引,该变量将被创建为空对象`{}`。 -* `/addvar`和`/addglobalvar`命令支持将新值推送到数组类型的变量。 - - - -## 流程控制 - 条件 - -您可以使用`/if`命令创建条件表达式,根据定义的规则分支执行。 - -`/if left=valueA right=valueB rule=comparison else="(false时执行的命令)" "(true时执行的命令)"` - -让我们看一下以下示例: - -``` -/input What's your favorite drink? | -/if left={{pipe}} right="black tea" rule=eq else="/echo You shall not pass \| /abort" "/echo Welcome to the club, \{\{user\}\}" -``` - -此脚本根据用户输入与所需值进行评估,并根据输入值显示不同的消息。 - - - -### `/if`的参数 - -1. `left`是第一个操作数。我们称之为A。 -2. `right`是第二个操作数。我们称之为B。 -3. `rule`是要应用于操作数的操作。 -4. `else`是可选的子命令字符串,如果布尔比较结果为false,则执行这些子命令。 -5. 未命名参数是如果布尔比较结果为true,则执行的子命令。 - - - -操作数值按以下顺序评估: - -1. 数字字面量 -2. 本地变量名 -3. 全局变量名 -4. 字符串字面量 - - - -命名参数的字符串值可以用引号转义,以允许多词字符串。然后丢弃引号。 - - - -### 布尔操作 - -支持的布尔比较规则如下。应用于操作数的操作结果为true或false值。 - -1. `eq` (等于) => A = B -2. `neq` (不等于) => A != B -3. `lt` (小于) => A < B -4. `gt` (大于) => A > B -5. `lte` (小于或等于) => A <= B -6. `gte` (大于或等于) => A >= B -7. `not` (一元否定) => !A -8. `in` (包含子字符串) => A包含B,不区分大小写 -9. `nin` (不包含子字符串) => A不包含B,不区分大小写 - - - -### 子命令 - -子命令是包含要执行的斜杠命令列表的字符串。 - -1. 要在子命令中使用命令批处理,命令分隔符应该被转义(见下文)。 -2. 由于宏值在进入条件时执行,而不是在执行子命令时执行,因此可以额外转义宏,以延迟其评估到子命令执行时间。 -3. 子命令执行的结果通过管道传递给`/if`之后的命令。 -4. 遇到`/abort`命令时,脚本执行中断。 - - - -`/if`命令可以用作三元运算符。以下示例将在变量`a`等于5时将"true"字符串传递给下一个命令,否则传递"false"字符串。 - -``` -/if left=a right=5 rule=eq else="/pass false" "/pass true" | -/echo -``` - - - -## 转义序列 - -### 宏 - -宏的转义方式与之前相同。但是,使用闭包时,您需要比以前少得多地转义宏。可以转义两个开始的大括号,或者同时转义开始和结束的大括号对。 - -``` -/echo \{\{char}} | -/echo \{\{char\}\} -``` - -### 管道 - -闭包中的管道不需要转义(当用作命令分隔符时)。在任何您想使用字面管道字符而不是命令分隔符的地方,您都需要转义它。 - -``` -/echo title="a\|b" c\|d | -/echo title=a\|b c\|d | -``` - -使用解析器标志STRICT_ESCAPING,您不需要在引用值中转义管道。 - -``` -/parser-flag STRICT_ESCAPING | -/echo title="a|b" c\|d | -/echo title=a\|b c\|d | -``` - -### 引号 - -要在引用值内使用字面引号字符,必须转义该字符。 - -``` -/echo title="a \"b\" c" d "e" f -``` - -### 空格 - -要在命名参数的值中使用空格,您必须将值用引号括起来,或者转义空格字符。 - -``` -/echo title="a b" c d | -/echo title=a\ b c d -``` - -### 闭包分隔符 - -如果您想使用用于标记闭包开始或结束的字符组合,您必须使用单个反斜杠转义序列。 - -``` -/echo \{: | -/echo \:} -``` - -## 管道断开器 - -``` -|| -``` - -为了防止前一个命令的输出自动注入为下一个命令的未命名参数,在两个命令之间放置双管道。 - -``` -/echo we don't want to pass this on || -/world -``` - - - -## 闭包 - -``` -{: ... :} -``` - -闭包(块语句、lambda、匿名函数,无论您想叫它什么)是一系列包装在`{:`和`:}`之间的命令,只有在代码的那部分被执行时才会被评估。 - -### 子命令 - -闭包使使用子命令变得更加容易,并且不需要转义管道和宏。 - -``` -// 不使用闭包的if | -/if left=1 rule=eq right=1 - else=" - /echo not equal \| - /return 0 - " - /echo equal \| - /return \{\{pipe}} - -// 使用闭包的if | -/if left=1 rule=eq right=1 - else={: - /echo not equal | - /return 0 - :} - {: - /echo equal | - /return {{pipe}} - :} -``` - -### 作用域 - -闭包有自己的作用域并支持作用域变量。作用域变量用`/let`声明,它们的值用`/var`设置和获取。获取作用域变量的另一种方法是`{{var::}}`宏。 - -``` -/let x | -/let y 2 | -/var x 1 | -/var y | -/echo x is {{var::x}} and y is {{pipe}}. -``` - -在闭包内,您可以访问在同一闭包或其祖先之一中声明的所有变量。您无法访问在闭包的后代中声明的变量。 -如果声明的变量与闭包祖先之一中声明的变量同名,则在此闭包及其后代中无法访问祖先变量。 - -``` -/let x this is root x | -/let y this is root y | -/return {: - /echo called from level-1: x is "{{var::x}}" and y is "{{var::y}}" | - /delay 500 | - /let x this is level-1 x | - /echo called from level-1: x is "{{var::x}}" and y is "{{var::y}}" | - /delay 500 | - /return {: - /echo called from level-2: x is "{{var::x}}" and y is "{{var::y}}" | - /let x this is level-2 x | - /echo called from level-2: x is "{{var::x}}" and y is "{{var::y}}" | - /delay 500 - :}() -:}() | -/echo called from root: x is "{{var::x}}" and y is "{{var::y}}" -``` - -### 命名闭包 - -``` -/let x {: ... :} | /:x -``` - -闭包可以分配给变量(仅限作用域变量),以便稍后调用或用作子命令。 - -``` -/let myClosure {: - /echo this is my closure -:} | -/:myClosure -``` - -``` -/let myClosure {: - /echo this is my closure | - /delay 500 -:} | -/times 3 {{var::myClosure}} -``` - -`/:`也可以用于执行快速回复,因为它只是`/run`的简写。 - -``` -/:QrSetName.QrButtonLabel | -/run QrSetName.QrButtonLabel -``` - -### 闭包参数 - -命名闭包可以接受命名参数,就像斜杠命令一样。参数可以有默认值。 - -``` -/let myClosure {: a=1 b= - /echo a is {{var::a}} and b is {{var::b}} -:} | -/:myClosure b=10 -``` - -### 闭包和管道参数 - -父闭包的管道值不会自动注入到子闭包的第一个命令中。 -您仍然可以使用`{{pipe}}`显式引用父级的管道值,但如果您将闭包内第一个命令的未命名参数留空,则该值不会自动注入。 - -``` -/* 这曾经尝试将模型更改为"foo" - 因为来自循环外部/echo的值"foo" - 被注入到循环内部的/model命令中。 - 现在它将简单地回显当前模型,而不 - 尝试更改它。 -*/ -/echo foo | -/times 2 {: - /model | - /echo | -:} | -``` - -``` -/* 您仍然可以通过显式使用{{pipe}}宏 - 来重现旧行为。 -*/ -/echo foo | -/times 2 {: - /model {{pipe}} | - /echo | -:} | -``` - -### 立即执行闭包 - -``` -{: ... :}() -``` - -闭包可以立即执行,这意味着它们将被替换为其返回值。这在不存在对闭包的显式支持的地方很有用,并且可以缩短一些原本需要大量中间变量的命令。 - -``` -// 不使用闭包的两个字符串长度比较 | -/len foo | -/var lenOfFoo {{pipe}} | -/len bar | -/var lenOfBar {{pipe}} | -/if left={{var::lenOfFoo}} rule=eq right={{var:lenOfBar}} /echo yay! -``` - -``` -// 使用立即执行闭包的相同比较 | -/if left={:/len foo:}() rule=eq right={:/len bar:}() /echo yay! -``` - -除了运行保存在作用域变量中的命名闭包外,`/run`命令还可用于立即执行闭包。 - -``` -/run {: - /add 1 2 3 4 | -:} | -/echo | -``` - - - -## 注释 - -``` -// ... | /# ... -``` - -注释是脚本代码中的人类可读解释或注解。注释不会中断管道。 - -``` -// 这是一条注释 | -/echo foo | -/# 这也是一条注释 -``` - -### 块注释 - -块注释可用于快速注释掉多个命令。它们不会在管道上终止。 - -``` -/echo foo | -/* -/echo bar | -/echo foobar | -*/ -/echo foo again | -``` - - - -## 流程控制 - -### 循环:`/while`和`/times` - -如果您需要在循环中运行某个命令,直到满足特定条件,请使用`/while`命令。 - -``` -/while left=valueA right=valueB rule=operation guard=on "commands" -``` - -在循环的每一步,它比较变量A的值与变量B的值,如果条件产生true,则执行引号中包含的任何有效斜杠命令,否则退出循环。此命令不向输出管道写入任何内容。 - -#### - -`/while`的参数 - -可用的布尔比较集合、变量处理、字面值和子命令与`/if`命令相同。 - -可选的`guard`命名参数(默认为`on`)用于防止无限循环,将迭代次数限制为100。要禁用并允许无限循环,设置`guard=off`。 - -此示例将1添加到`i`的值,直到达到10,然后输出结果值(在本例中为10)。 - -``` -/setvar key=i 0 | -/while left=i right=10 rule=lt "/addvar key=i 1" | -/echo {{getvar::i}} | -/flushvar i -``` - - - -#### `/times`的参数 - -运行指定次数的子命令。 - -`/times (重复次数) "(命令)"` – 引号中包含的任何有效斜杠命令重复指定次数,例如 `/setvar key=i 1 | /times 5 "/addvar key=i 1"` 将1添加到"i"的值5次。 - -* `{{timesIndex}}`被替换为迭代次数(从零开始),例如 `/times 4 "/echo {{timesIndex}}"` 回显数字0到4。 -* 循环默认限制为100次迭代,传递`guard=off`可禁用此限制。 - - - -### 跳出循环和闭包 - -``` -/break | -``` - -`/break`命令可用于提前跳出循环(`/while`或`/times`)或闭包。`/break`的未命名参数可用于传递与当前管道不同的值。 -`/break`目前在以下命令中实现: - -* `/while` - 提前退出循环 -* `/times` - 提前退出循环 -* `/run`(使用闭包或通过变量的闭包)- 提前退出闭包 -* `/:`(使用闭包)- 提前退出闭包 - -``` -/times 10 {: - /echo {{timesIndex}} - /delay 500 | - /if left={{timesIndex}} rule=gt right=3 {: - /break - :} | -:} | -``` - -``` -/let x {: iterations=2 - /if left={{var::iterations}} rule=gt right=10 {: - /break too many iterations! | - :} | - /times {{var::iterations}} {: - /delay 500 | - /echo {{timesIndex}} | - :} | -:} | -/:x iterations=30 | -/echo the final result is: {{pipe}} -``` - -``` -/run {: - /break 1 | - /pass 2 | -:} | -/echo pipe will be one: {{pipe}} | -``` - -``` -/let x {: - /break 1 | - /pass 2 | -:} | -/:x | -/echo pipe will be one: {{pipe}} | -``` - -# - -## 数学运算 - -* 以下所有操作都接受一系列数字或变量名,并将结果输出到管道。 -* 无效操作(如除以零)以及导致NaN值或无穷大的操作返回零。 -* 乘法、加法、最小值和最大值接受无限数量的由空格分隔的参数。 -* 减法、除法、幂运算和模运算接受由空格分隔的两个参数。 -* 正弦、余弦、自然对数、平方根、绝对值和舍入接受一个参数。 - -操作列表: - -1. `/add (a b c d)` – 执行一组值的加法,例如 `/add 10 i 30 j` -2. `/mul (a b c d)` – 执行一组值的乘法,例如 `/mul 10 i 30 j` -3. `/max (a b c d)` – 返回一组值中的最大值,例如 `/max 1 0 4 k` -4. `/min (a b c d)` – 返回一组值中的最小值,例如 `/min 5 4 i 2` -5. `/sub (a b)` – 执行两个值的减法,例如 `/sub i 5` -6. `/div (a b)` – 执行两个值的除法,例如 `/div 10 i` -7. `/mod (a b)` – 执行两个值的模运算,例如 `/mod i 2` -8. `/pow (a b)` – 执行两个值的幂运算,例如 `/pow i 2` -9. `/sin (a)` – 执行一个值的正弦运算,例如 `/sin i` -10. `/cos (a)` – 执行一个值的余弦运算,例如 `/cos i` -11. `/log (a)` – 执行一个值的自然对数运算,例如 `/log i` -12. `/abs (a)` – 执行一个值的绝对值运算,例如 `/abs -10` -13. `/sqrt (a)`– 执行一个值的平方根运算,例如 `/sqrt 9` -14. `/round (a)` – 执行一个值的四舍五入到最接近整数的运算,例如 `/round 3.14` -15. `/rand (round=round|ceil|floor from=number=0 to=number=1)` – 返回一个介于from和to之间的随机数,例如 `/rand` 或 `/rand 10` 或 `/rand from=5 to=10`。范围是包含的。返回的值将包含小数部分。使用`round`命名参数获取整数值,例如 `/rand round=ceil` 向上舍入,`round=floor` 向下舍入,`round=round` 舍入到最接近的值。 - - - -### 示例1:获取半径为50的圆的面积。 - -``` -/setglobalvar key=PI 3.1415 | -/setvar key=r 50 | -/mul r r PI | -/round | -/echo Circle area: {{pipe}} -``` - -### 示例2:计算5的阶乘。 - -``` -/setvar key=input 5 | -/setvar key=i 1 | -/setvar key=product 1 | -/while left=i right=input rule=lte "/mul product i \| /setvar key=product \| /addvar key=i 1" | -/getvar product | -/echo Factorial of {{getvar::input}}: {{pipe}} | -/flushvar input | -/flushvar i | -/flushvar product -``` - - - -## 使用LLM - -脚本可以使用以下命令向您当前连接的LLM API发出请求: - -* `/gen (提示)` — 使用为所选角色提供的提示生成文本,并包含聊天消息。 -* `/genraw (提示)` — 仅使用提供的提示生成文本,忽略当前角色和聊天。 -* `/trigger` — 触发正常生成(相当于点击"发送"按钮)。如果在群聊中,您可以选择提供基于1的群组成员索引或角色名称让他们回复,否则根据群组设置触发群组回合。 - -### `/gen`和`/genraw`的参数 - -``` -/genraw lock=on/off stop=[] instruct=on/off (Prompt) -``` - - - -* `lock` — 可以是`on`或`off`。指定生成过程中是否应阻止用户输入。默认:`off`。 -* `stop` — JSON序列化的字符串数组。仅为此生成添加自定义停止字符串(如果API支持)。默认:无。 -* `instruct`(仅`/genraw`)— 可以是`on`或`off`。允许在输入提示上使用指令格式(如果启用了指令模式且API支持)。设置为`off`强制使用纯提示。默认:`on`。 -* `as`(用于文本完成API)— 可以是`system`(默认)或`char`。定义最后一行提示将如何格式化。`char`将使用角色名称,`system`将使用无名称或中性名称。 - - - -生成的文本然后通过管道传递给下一个命令,可以保存到变量或使用I/O功能显示: - -``` -/genraw Write a funny message from Cthulhu about taking over the world. Use emojis. | -/popup