关于小白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