koishi-plugin-chatluna 1.2.0-alpha.2 → 1.2.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/lib/index.cjs +165 -36
  2. package/lib/index.mjs +158 -31
  3. package/lib/llm-core/agent/index.cjs +176 -115
  4. package/lib/llm-core/agent/index.mjs +176 -115
  5. package/lib/llm-core/agent/react/index.d.ts +5 -1
  6. package/lib/llm-core/agent/react/output_parser.d.ts +38 -18
  7. package/lib/llm-core/agent/react/prompt.d.ts +1 -1
  8. package/lib/llm-core/chain/chat_chain.d.ts +5 -2
  9. package/lib/llm-core/chain/plugin_chat_chain.d.ts +4 -1
  10. package/lib/llm-core/chain/prompt.cjs +9 -4
  11. package/lib/llm-core/chain/prompt.d.ts +3 -0
  12. package/lib/llm-core/chain/prompt.mjs +9 -8
  13. package/lib/llm-core/prompt/index.cjs +162 -202
  14. package/lib/llm-core/prompt/index.mjs +162 -208
  15. package/lib/llm-core/prompt/preset_prompt_parse.d.ts +1 -1
  16. package/lib/llm-core/prompt/tokenize.d.ts +7 -0
  17. package/lib/renders/pure-text.d.ts +9 -0
  18. package/lib/services/chat.cjs +390 -27
  19. package/lib/services/chat.d.ts +6 -1
  20. package/lib/services/chat.mjs +397 -25
  21. package/lib/services/variable.d.ts +26 -0
  22. package/lib/utils/remove-markdown.d.ts +12 -0
  23. package/lib/utils/string.cjs +14 -0
  24. package/lib/utils/string.d.ts +1 -0
  25. package/lib/utils/string.mjs +13 -0
  26. package/package.json +1 -1
  27. package/lib/llm-core/agent/react/util.d.ts +0 -0
  28. package/lib/llm-core/prompt/format.d.ts +0 -5
  29. package/lib/middlewares/add_memory.d.ts +0 -12
  30. package/lib/middlewares/clear_memory.d.ts +0 -9
  31. package/lib/middlewares/delete_memory.d.ts +0 -12
  32. package/lib/middlewares/edit_memory.d.ts +0 -13
  33. package/lib/middlewares/search_memory.d.ts +0 -13
package/lib/index.cjs CHANGED
@@ -47,14 +47,14 @@ var require_en_US_schema = __commonJS({
47
47
  // src/locales/zh-CN.yml
48
48
  var require_zh_CN = __commonJS({
49
49
  "src/locales/zh-CN.yml"(exports2, module2) {
50
- module2.exports = { commands: { chatluna: { description: "ChatLuna 相关指令。", room: { description: "ChatLuna 房间管理。", create: { description: "创建一个新房间。", options: { name: "房间名字。", preset: "房间预设。", model: "房间模型。", chatMode: "房间聊天模式。", password: "房间密码。", visibility: "房间可见性。" }, messages: { confirm_create: "你目前已提供基础参数,是否直接创建房间?如需直接创建房间请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消创建房间。", cancelled: "你已取消创建房间。", enter_name: "请输入你需要使用的房间名,如:我的房间,回复 Q 退出创建。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。回复 Q 退出创建。", enter_model: "请输入你需要使用的模型,如:openai/gpt-3.5-turbo,回复 Q 退出创建。", model_not_found: "无法找到模型:{0},请重新输入。", enter_preset: "请输入你需要使用的预设,如:chatgpt。如果不输入预设请回复 N(则使用默认 chatgpt 预设)。否则回复你需要使用的预设。回复 Q 退出创建。", preset_not_found: "无法找到预设:{0},请重新输入。", enter_visibility: "请输入你需要使用的可见性,如:private。如果不输入可见性请回复 N(则使用默认 private 可见性)。否则回复需要使用的可见性。(目支持 public, private),回复 Q 退出创建。", visibility_not_recognized: "无法识别可见性:{0},请重新输入。", enter_chat_mode: "请输入你需要使用的聊天模式,如:chat。如果不输入聊天模式请回复 N(则使用默认 chat 聊天模式)。否则回复你需要使用的聊天模式。回复 Q 退出创建。", enter_password: "请输入你需要使用的密码,如:123456。如果不输入密码请回复 N(则不设置密码)。否则回复你需要使用的密码。回复 Q 退出设置。", template_room_created: "模板房间创建成功。", room_created: "房间创建成功,房间号为:{0},房间名为:{1}。", invalid_chat_mode: "无法识别聊天模式:{0},目前可用的聊天模式有:{1}。请重新输入。回复 Q 退出创建。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "房间名", model: "模型", preset: "预设", visibility: "可见性", chat_mode: "聊天模式", password: "密码" } } }, delete: { description: "删除一个房间。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法删除房间。", confirm_delete: "你确定要删除房间 {0} 吗?这将会删除房间内的所有消息。并且成员也会被移除。如果你确定要删除,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已删除房间 {0}。" } }, "auto-update": { description: "设置模版克隆房间的自动更新属性。", options: { room: "指定房间。" }, messages: { room_not_found: "未找到指定的房间。", not_template_clone: "该房间不是模板克隆房间,无法设置自动更新属性。", not_admin: "你不是房间的房主,无法设置自动更新房间。", success: "已设置房间 {0} 的自动更新属性为 {1}。", "invalid-status": "您输入的参数不合法,参数只能为 true 或者 false。" } }, kick: { description: "踢出某个人员在你当前的房间。", messages: { no_room_specified: "你没有在当前环境里指定房间。请使用 chatluna.room.switch 命令来切换房间", not_admin: "你不是房间 {0} 的管理员,无法踢出用户。", success: "已将以下用户踢出房间 {0}:{1}" } }, invite: { description: "邀请进入房间。", messages: { no_room_specified: "你没有在当前环境里指定房间。请使用 chatluna.room.switch 命令来切换房间", not_admin: "你不是房间 {0} 的管理员,无法邀请用户加入。", success: "已邀请用户 {0} 加入房间 {1}。" } }, join: { description: "加入某个房间。", arguments: { id: "房间 ID 或名称。" }, messages: { room_not_found: "未找到指定的房间。", not_in_group: "该房间不在当前群聊中。", private_no_password: "该房间为私密房间。房主未设置密码加入,只能由房主邀请进入,无法加入。", private_group_join: "该房间为私密房间。由于需要输入密码,你无法在群聊中加入。", enter_password: "请输入密码来加入房间 {0}。", timeout: "操作超时未确认,已自动取消。", wrong_password: "密码错误,已为你取消操作。", success: "已加入房间 {0}" } }, leave: { description: "离开当前房间。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", confirm_delete: "检测到你为房主,当你退出房间时,房间将会被删除。如果你确定要删除,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已退出房间 {0}。您可能需要重新加入或者切换房间。" } }, clear: { description: "清除指定房间的聊天记录。", arguments: { room: "目标房间。" }, messages: { success: "已清除房间 {0} 的聊天记录。", "no-room": "未找到指定的房间。" } }, set: { description: "设置房间的属性。", options: { name: "房间名字。", preset: "房间预设。", model: "房间模型。", chatMode: "房间聊天模式。", password: "房间密码。", visibility: "房间可见性。" }, messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法设置房间的属性。", confirm_update: "你目前已设置参数,是否直接更新房间属性?如需直接更新请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消设置房间属性。", cancelled: "你已取消设置房间属性。", no_password_in_public: "你无法在非私有房间或群聊中设置密码。", change_or_keep: "你已经选择了{0}:{1},是否需要更换?如无须更改请回复 N,否则回复更换后的{0}。回复 Q 退出设置。", model_not_found: "无法找到模型:{0},请重新输入。回复 Q 退出设置。", preset_not_found: "无法找到预设:{0},请重新输入。回复 Q 退出设置。", invalid_visibility: "无法识别可见性:{0},请重新输入。回复 Q 退出设置。", enter_password: "请输入你需要使用的密码,如:123456。如果不输入密码请回复 N(则不设置密码)。否则回复你需要使用的密码。回复 Q 退出设置。", success_with_clear: "房间 {0} 已更新,聊天记录已被清空。", invalid_chat_mode: "无法识别聊天模式:{0},目前可用的聊天模式有:{1}。请重新输入。", failed: "房间 {0} 更新失败。请检查你的设置并重新尝试。", success: "房间 {0} 已更新。", field: { name: "房间名", model: "模型", preset: "预设", visibility: "可见性", chat_mode: "聊天模式", password: "密码" } } }, list: { description: "列出所有你加入的房间。", options: { page: "页码。", limit: "每页数量。" }, messages: { header: "以下是查询到你加入的房间列表:", footer: "你可以使用 chatluna.room.switch <name/id> 来切换当前环境里你的默认房间。", pages: "当前为第 [page] / [total] 页", room_name: "房间名: {0}", room_id: "房间ID: {0}", room_preset: "房间预设: {0}", room_model: "房间模型: {0}", room_visibility: "房间可见性: {0}", room_chat_mode: "房间聊天模式: {0}", room_master_id: "房间创建者ID: {0}", room_availability: "房间可用性:{0}" } }, transfer: { description: "转移房间的房主。", messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法转移房间给他人。", confirm_transfer: "你确定要把房间 {0} 转移给用户 {1} 吗?转移后ta将成为房间的房主,你将失去房主权限。如果你确定要转移,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已将房间 {0} 转移给用户 {1}。" } }, info: { description: "查看当前房间的信息。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", header: "以下是你目前所在的房间信息", room_name: "房间名: {0}", room_id: "房间ID: {0}", room_preset: "房间预设: {0}", room_model: "房间模型: {0}", room_visibility: "房间可见性: {0}", room_chat_mode: "房间聊天模式: {0}", room_master_id: "房间创建者ID: {0}" } }, switch: { description: "切换到你已经加入了的房间。", arguments: { name: "房间名称或 ID。" }, messages: { success: "已切换到房间 {0}。", room_not_found: "未找到指定的房间。" } }, permission: { description: "修改房间里某人的权限。", options: { room: "指定房间。", user: "目标用户。" }, messages: { room_not_found: "未找到指定的房间。", not_admin: "你不是房间的房主,无法为用户设置权限。", confirm_set: "你确定要为用户 {0} 设置房间 {1} 的权限吗?目前可以设置的权限为 member 和 admin。如果你确定要设置,请输入设置权限的值或首字母大写,其他输入均视为取消。", timeout: "操作超时未确认,已自动取消。", invalid_permission: "你输入的权限值不正确,已自动取消。", success: "已为用户 {0} 设置房间 {1} 的权限为 {2}" } }, mute: { description: "禁言某个用户,不让其发言。", options: { room: "指定房间。" }, messages: { room_not_found: "未找到指定的房间。", not_admin: "你不是房间 {0} 的管理员,无法禁言用户。", success: "已将用户 {0} 在房间 {1} 禁言或解除禁言。" } } }, chat: { description: "ChatLuna 对话相关指令。", text: { description: "与大语言模型进行文本对话。", options: { room: "指定对话的目标房间。", type: "设置消息的渲染类型。" }, examples: ["chatluna chat text -t text 你好,世界!", "chatluna chat text -t voice 你好,世界!", "chatluna chat text -r 原神 -t text 你好,世界!"], arguments: { message: "要发送的消息内容。" }, messages: { "invalid-render-type": "渲染类型无效。请使用有效的渲染类型,目前支持的类有 `text` 和 `voice`。" } }, rollback: { description: "重新生成上一次的对话内容。", options: { room: "指定要操作的房间。" }, arguments: { message: "新的消息内容。" }, messages: { room_not_found: "未找到指定的房间。", conversation_not_exist: "房间不存在。", no_chat_history: "找不到对话记录。", invalid_chat_history: "错误的聊天记录,请尝试清空聊天记录后重试。", rollback_success: "已成功回滚到 {0} 轮前的对话,请等待模型回复。" } }, stop: { description: "立即停止当前正在进行的对话。", options: { room: "指定要停止对话的房间。" }, messages: { room_not_found: "未找到指定的房间。", no_active_chat: "当前未在房间中对话。", stop_failed: "停止对话失败。", success: "已成功停止当前对话。" } }, voice: { description: "与模型进行对话并将回复转换为语音输出。", options: { room: "指定对话的目标房间。", speaker: "设置语音服务使用目标角色 ID。" }, arguments: { message: "要发送的消息内容。" } } }, wipe: { description: "清空 ChatLuna 的所有使用数据(请谨慎使用)。", messages: { confirm_wipe: "您接下来将要操作的是清除 ChatLuna 的全部相关数据!这些数据包括:\n1. 所有会话数据\n2. 其他缓存在数据库的数据\n3. 本地向量数据库的相关数据\n\n请输入下列算式的结果以确认删除:{0}。\n", timeout: "删除超时,已取消删除", incorrect_input: "你的输入不正确,已取消删除。", success: "已删除相关数据,即将重启完成更改。" } }, restart: { description: "重启 ChatLuna 服务。", messages: { success: "已成功重启 ChatLuna。" } }, auth: { description: "ChatLuna 鉴权相关指令。", list: { description: "列出授权组。", options: { page: "页码。", limit: "每页显示的数量。", platform: "指定平台。" }, messages: { header: "以下是查询到目前可用的配额组列表:", footer: "你可以使用 chatluna.auth.add <name/id> 来加入某个配额组。", pages: "当前为第 [page] / [total] 页", name: "名称:{0}", platform: "适用模型平台:{0}", cost: "计费:{0} / 1000 token", priority: "优先级: {0}", support_models: "限制模型:{0}", limit_per_min: "并发限制每 {0} 条消息/分", limit_per_day: "并发限制每 {0} 条消息/天", general: "通用" } }, add: { description: "将用户加入到指定配额组。", usage: "使用方法:chatluna auth add <组名> -u @用户", options: { user: "目标用户。" }, messages: { permission_denied: "你的权限不足以执行此操作。", success: "已将用户 {0} 添加到配额组 {1}。" } }, kick: { description: "将用户从指定配额组中移除。", usage: "使用方法:chatluna auth kick <组名> -u @用户", options: { user: "目标用户。" }, messages: { permission_denied: "你的权限不足以执行此操作。", success: "已将用户 {0} 踢出配额组 {1}" } }, create: { description: "创建一个新的授权组。", options: { name: "授权组名称。", preMin: "每分钟请求限额。", preDay: "每日请求限额。", platform: "指定平台。", supportModels: "支持的模型列表。", priority: "优先级。", cost: "token 费用。" }, messages: { enter_name: "请输入你需要使用的配额组名,如:OpenAI配额组", name_exists: "你输入的配额组名已存在,请重新输入。", enter_limit_per_min: "请输入配额组每分钟的限额条数,要求为数字并且大于 0。", enter_limit_per_day: "请输入配额组每天的限额条数,要求为数字并且大于每分钟的限额次数。", enter_platform: "请输入对该配额组的模型平台标识符,如: openai。表示优先在使用该平台模型时使用该配额组,如不输入回复 N", enter_priority: "请输入配额组的优先级(数字,越大越优先)(这很重要,会决定配额组的使用顺序)。", enter_cost: "请输入配额组的 token 费用(数字,按一千 token 计费,实际扣除用户余额)。", enter_models: "请输入该配额组可使用的模型列表(白名单机制),用英文逗号分割,如(openai/gpt-3.5-turbo, openai/gpt-4)。如果不输入回复 N(则不设置型列表)。", invalid_input: "你输入的{0}有误,请重新输入。", confirm_create: "你目前已提供基础参数,是否直接创建配额组?如需直接创建配额组请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消创建配额组。", cancelled: "你已取消创建配额组。", success: "配额组创建成功,配额组名为:{0}。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。", invalid_models: "模型组里有不支持的模型,请重新输入。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "配额组名", limit_per_min: "每分钟限额条数", limit_per_day: "每天限额条数", platform: "平台标识符", priority: "优先级", cost: "费用", models: "模型列表" } } }, set: { description: "修改现有授权组的参数。", options: { name: "授权组名称。", preMin: "每分钟请求限额。", preDay: "每日请求限额。", platform: "指定平台。", supportModels: "支持的模型列表。", priority: "优先级。", cost: "token 费用。" }, messages: { confirm_set: "你目前已提供基础参数,是否直接修改配额组?如需直接修改配额组请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消修改配额组。", cancelled: "你已取消修改配额组。", enter_name: "请输入你需要使用的配额组名,如:OpenAI配额组。回复 Q 退出修改。", name_exists: "你输入的配额组名已存在,请重新输入。", enter_limit_per_min: "请输入配额组每分钟的限额条数,要求为数字并且大于 0。回复 Q 退出修改。", enter_limit_per_day: "请输入配额组每天的限额条数,要求为数字并且大于每分钟的限额次数。回复 Q 退出修改。", enter_platform: "请输入对该配额组的模型平台标识符,如: openai。表示会优先在使用该平台模型时使用该配额组,如不输入回复 N。回复 Q 退出修改。", enter_priority: "请输入配额组的优先级(数字,越大越优先)(这很重要,会决定配额组的使用顺序)。回复 Q 退出修改。", enter_cost: "请输入配额组的 token 费用(数字,按一千 token 计费,实际扣除用户余额)。回复 Q 退出修改。", enter_models: "请输入该配额组可使用的模型列表(白名单机制),用英文逗号分割,如(openai/gpt-3.5-turbo, openai/gpt-4)。如果不输入回复 N(则不设置模型列表)。回复 Q 退出修改。", invalid_input: "你输入的{0}有误,请重新输入。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。回复 Q 退出修改。", invalid_models: "模型组里有不支持的模型,请重新输入。", success: "配额组修改成功,新配额组名为:{0}。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "配额组名", limit_per_min: "每分钟限额条数", limit_per_day: "每天限额条数", platform: "平台标识符", priority: "优先级", cost: "费用", models: "模型列表" } } } }, balance: { description: "ChatLuna 余额相关指令。", clear: { description: "清除指定用户的余额。将用户的余额重置为0。", arguments: { user: "目标用户。" }, examples: ["chatluna balance clear --user @用户名"], messages: { success: "已将用户 {0} 账户余额修改为 {1}" } }, set: { description: "设置指定用户的余额。可以增加或减少用户的余额。", arguments: { user: "目标用户。", amount: "要设置的余额数量。" }, examples: ["chatluna balance set --user @用户名 --amount 1000"], messages: { success: "已将用户 {0} 账户余额修改为 {1}" } }, query: { description: "查询用户的当前余额。如果不指定用户,则查询自己的余额。", arguments: { user: "目标用户。如果不指定,则查询当前用户。" }, examples: ["chatluna balance query", "chatluna balance query --user @用户名"], messages: { success: "用户 {0} 当前的账户余额为 {1}" } } }, model: { description: "ChatLuna 模型相关指令。", list: { description: "列出所有可用的模型。", usage: "chatluna model list --page 1 --limit 10", options: { page: "页码。", limit: "每页显示的数量。" }, messages: { header: "以下是目前可用的模型列表:", footer: "你可以使用 chatluna.room.set -m <model> 来设置默认使用的模型", pages: "当前为第 [page] / [total] 页" } }, search: { description: "搜索可用的模型。", arguments: { query: "搜索关键词。" }, usage: "chatluna model search openai --page 1 --limit 10", options: { page: "页码。", limit: "每页显示的数量。" }, messages: { header: "以下是目前搜索到的模型列表:", footer: "你可以使用 chatluna.room.set -m <model> 来设置默认使用的模型", pages: "当前为第 [page] / [total] 页" } } }, memory: { description: "ChatLuna 记忆相关指令。", search: { description: "搜索记忆。", arguments: { query: "搜索关键词。" }, usage: 'chatluna memory search --query "你好" --page 1 --limit 10', options: { page: "页码。", limit: "每页显示的数量。", type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { header: "以下是使用 {0} 关键词在 {1} 预设下搜索出的记忆列表:", footer: "", document_content: "记忆内容: {0}", document_id: "记忆 ID: {0}", document_type: "记忆所属的类型: {0}", document_expire: "记忆过期时间: {0}", document_level: "记忆的重要性: {0}", pages: "当前为第 [page] / [total] 页", search_failed: "搜索记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, delete: { description: "删除记忆。", arguments: { ids: "记忆 ID 列表。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { delete_success: "已删除记忆。", delete_failed: "删除记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, clear: { description: "清空记忆。", options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { clear_success: "已清空记忆。", clear_failed: "清空记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, add: { description: "添加记忆。", arguments: { content: "记忆内容。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { add_success: "已添加记忆。", add_failed: "添加记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, edit: { description: "编辑记忆。", arguments: { id: "记忆 ID。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { edit_success: "已编辑记忆。", edit_failed: "编辑记忆失败。", edit_memory_start: "请发送你的新记忆内容。", invalid_view: "无效的记忆层级。目前可用:{0}" } } }, preset: { description: "ChatLuna 预设相关指令。", list: { description: "列出当前支持的所有预设。", options: { page: "指定页码", limit: "设置每页显示数量" }, messages: { header: "以下是目前可用的预设列表:", footer: "你可以使用 chatluna.room.set -p <preset> 来设置默认使用的预设", pages: "当前为第 [page] / [total] 页", preset_keyword: "预设关键词: {0}", preset_content: "预设内容: {0}" } }, add: { description: "添加新预设。", arguments: { preset: "预设名称" }, messages: { conflict: "该预设关键词已经和其他预设关键词冲突,请更换其他关键词重试哦", prompt: "请发送你的预设内容。", timeout: "添加预设超时,已取消添加预设: {0}", success: "预设添加成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, clone: { description: "复制现有预设。", arguments: { originPreset: "源预设名称", newPresetName: "新预设名称" }, messages: { conflict: "该预设关键词已经和其他预设关键词冲突,请更换其他关键词重试哦。", confirm: "你确定要克隆预设 {0} 吗?如果你确定要克隆,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "预设克隆成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, set: { description: "修改现有预设。", arguments: { preset: "预设名称" }, messages: { not_found: "找不到指定的预设。", not_support: "不支持修改 {0} 预设!该预设自定义了多条消息,属于复杂预设,无法使用此命令修改,请自行前往控制面板里的资源管理器编辑此预设。`", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", enter_content: "请发送你的新预设内容。", success: "预设修改成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, delete: { description: "删除指定预设。", arguments: { preset: "预设名称" }, messages: { only_one_preset: "现在只有一个预设了,删除后将无法使用预设功能,所以不允许删除。", not_found: "找不到该预设!请检查你是否输入了正确的预设?", confirm_delete: "是否要删除 {0} 预设?输入大写 Y 来确认删除,输入其他字符来取消删除。提示:删除后使用了该预设的会话将会自动删除无法使用。", timeout: "删除预设超时,已取消删除预设: {0}。", cancelled: "已取消删除预设: {0}", success: "已删除预设: {0},即将自动重启完成更改。" } } }, embeddings: { description: "ChatLuna 嵌入模型管理。", list: { description: "查看支持的嵌入模型列表。", options: { page: "指定页码。", limit: "设置每页显示数量。" }, messages: { header: "以下是目前可用的嵌入模型列表:", footer: "你可以使用 chatluna.embeddings.set <model> 来设置默认使用的嵌入模型", pages: "当前为第 [page] / [total] 页" } }, set: { description: "设置默认嵌入模型。", arguments: { embeddings: "嵌入模型名称。" }, messages: { usage_hint: "你可以使用 chatluna.embeddings.set <model> 来设置默认使用的嵌入模型", multiple_models_found: { header: "基于你的输入,找到了以下嵌入模型:", footer: "请输入更精确的嵌入模型名称以避免歧义", example: "例如:chatluna.embeddings.set {0}" }, model_not_found: "找不到对应的嵌入模型,请检查输入是否正确", success: "已将默认嵌入模型设置为 {0} (将自动重启插件应用更改)" } } }, vectorstore: { description: "ChatLuna 向量数据库管理。", list: { description: "查看支持的向量数据库列表。", options: { page: "指定页码。", limit: "设置每页显示数量。" }, messages: { header: "以下是目前可用的向量数据库列表:", footer: "你可以使用 chatluna.vectorstore.set <model> 来设置默认使用的向量数据库(如果没有任何向量数据库,会使用存储在内存里的向量数据库(临时的))", pages: "当前为第 [page] / [total] 页" } }, set: { description: "设置默认向量数据库。", arguments: { vectorStore: "向量数据库名称。" }, messages: { usage_hint: "你可以使用 chatluna.vectorstore.set <model> 来设置默认使用的向量数据库", multiple_stores_found: { header: "基于你的输入,找到了以下向量数据库:", footer: "请输入更精确的向量数据库名称以避免歧义", example: "例如:chatluna.vectorstore.set {0}" }, store_not_found: "找不到对应的向量数据库,请检查名称是否正确", success: "已将默认向量数据库设置为 {0},(将自动重启插件应用更改)" } } } } }, chatluna: { aborted: "已成功停止当前对话的生成。", thinking_message: "我还在思考中,前面还有 {0} 条消息等着我回复呢,稍等一下~", block_message: "哎呀(キ`゚Д゚´)!!,你怎么被拉入黑名单了呢?要不你去问问我的主人吧。", error_message: "使用 ChatLuna 时出现错误,错误码为 %s。请联系开发者以解决此问题。", middleware_error: "执行 {0} 时出现错误: {1}", chat_limit_exceeded: "你的聊天次数已经用完了喵,还需要等待 {0} 分钟才能继续聊天喵 >_<", room: { random_switch: "检测到你没有指定房间,已为你随机切换到房间 {0}。", not_joined: "你还没有加入任何房间,请先加入房间。", not_in_room: "你没有加入此房间,请先加入房间 {0}。", muted: "你已被禁言,无法在房间 {0} 发言。", unavailable: "检测到当前房间不可用,正在为您自动修复。", auto_switch: "已为用户 {0} 自动切换到房间 {1}。", auto_create: "已为用户 {0} 自动创建房间 {1}。", auto_create_template: "已为用户 {0} 自动创建模版克隆房间 {1}。", room_name: "{0} 的房间", template_clone_room_name: "{0} 的模版克隆房间", config_changed: "检测到模版房间 {0} 的配置变更,已更新到数据库。" }, cooldown_wait_message: "不要发这么快喵,等 {0}s 后我们再聊天喵。" } };
50
+ module2.exports = { commands: { chatluna: { description: "ChatLuna 相关指令。", room: { description: "ChatLuna 房间管理。", create: { description: "创建一个新房间。", options: { name: "房间名字。", preset: "房间预设。", model: "房间模型。", chatMode: "房间聊天模式。", password: "房间密码。", visibility: "房间可见性。" }, messages: { confirm_create: "你目前已提供基础参数,是否直接创建房间?如需直接创建房间请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消创建房间。", cancelled: "你已取消创建房间。", enter_name: "请输入你需要使用的房间名,如:我的房间,回复 Q 退出创建。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。回复 Q 退出创建。", enter_model: "请输入你需要使用的模型,如:openai/gpt-3.5-turbo,回复 Q 退出创建。", model_not_found: "无法找到模型:{0},请重新输入。", enter_preset: "请输入你需要使用的预设,如:chatgpt。如果不输入预设请回复 N(则使用默认 chatgpt 预设)。否则回复你需要使用的预设。回复 Q 退出创建。", preset_not_found: "无法找到预设:{0},请重新输入。", enter_visibility: "请输入你需要使用的可见性,如:private。如果不输入可见性请回复 N(则使用默认 private 可见性)。否则回复需要使用的可见性。(目支持 public, private),回复 Q 退出创建。", visibility_not_recognized: "无法识别可见性:{0},请重新输入。", enter_chat_mode: "请输入你需要使用的聊天模式,如:chat。如果不输入聊天模式请回复 N(则使用默认 chat 聊天模式)。否则回复你需要使用的聊天模式。回复 Q 退出创建。", enter_password: "请输入你需要使用的密码,如:123456。如果不输入密码请回复 N(则不设置密码)。否则回复你需要使用的密码。回复 Q 退出设置。", template_room_created: "模板房间创建成功。", room_created: "房间创建成功,房间号为:{0},房间名为:{1}。", invalid_chat_mode: "无法识别聊天模式:{0},目前可用的聊天模式有:{1}。请重新输入。回复 Q 退出创建。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "房间名", model: "模型", preset: "预设", visibility: "可见性", chat_mode: "聊天模式", password: "密码" } } }, delete: { description: "删除一个房间。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法删除房间。", confirm_delete: "你确定要删除房间 {0} 吗?这将会删除房间内的所有消息。并且成员也会被移除。如果你确定要删除,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已删除房间 {0}。" } }, "auto-update": { description: "设置模版克隆房间的自动更新属性。", options: { room: "指定房间。" }, messages: { room_not_found: "未找到指定的房间。", not_template_clone: "该房间不是模板克隆房间,无法设置自动更新属性。", not_admin: "你不是房间的房主,无法设置自动更新房间。", success: "已设置房间 {0} 的自动更新属性为 {1}。", "invalid-status": "您输入的参数不合法,参数只能为 true 或者 false。" } }, kick: { description: "踢出某个人员在你当前的房间。", messages: { no_room_specified: "你没有在当前环境里指定房间。请使用 chatluna.room.switch 命令来切换房间", not_admin: "你不是房间 {0} 的管理员,无法踢出用户。", success: "已将以下用户踢出房间 {0}:{1}" } }, invite: { description: "邀请进入房间。", messages: { no_room_specified: "你没有在当前环境里指定房间。请使用 chatluna.room.switch 命令来切换房间", not_admin: "你不是房间 {0} 的管理员,无法邀请用户加入。", success: "已邀请用户 {0} 加入房间 {1}。" } }, join: { description: "加入某个房间。", arguments: { id: "房间 ID 或名称。" }, messages: { room_not_found: "未找到指定的房间。", not_in_group: "该房间不在当前群聊中。", private_no_password: "该房间为私密房间。房主未设置密码加入,只能由房主邀请进入,无法加入。", private_group_join: "该房间为私密房间。由于需要输入密码,你无法在群聊中加入。", enter_password: "请输入密码来加入房间 {0}。", timeout: "操作超时未确认,已自动取消。", wrong_password: "密码错误,已为你取消操作。", success: "已加入房间 {0}" } }, leave: { description: "离开当前房间。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", confirm_delete: "检测到你为房主,当你退出房间时,房间将会被删除。如果你确定要删除,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已退出房间 {0}。您可能需要重新加入或者切换房间。" } }, clear: { description: "清除指定房间的聊天记录。", arguments: { room: "目标房间。" }, messages: { success: "已清除房间 {0} 的聊天记录。", "no-room": "未找到指定的房间。" } }, set: { description: "设置房间的属性。", options: { name: "房间名字。", preset: "房间预设。", model: "房间模型。", chatMode: "房间聊天模式。", password: "房间密码。", visibility: "房间可见性。" }, messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法设置房间的属性。", confirm_update: "你目前已设置参数,是否直接更新房间属性?如需直接更新请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消设置房间属性。", cancelled: "你已取消设置房间属性。", no_password_in_public: "你无法在非私有房间或群聊中设置密码。", change_or_keep: "你已经选择了{0}:{1},是否需要更换?如无须更改请回复 N,否则回复更换后的{0}。回复 Q 退出设置。", model_not_found: "无法找到模型:{0},请重新输入。回复 Q 退出设置。", preset_not_found: "无法找到预设:{0},请重新输入。回复 Q 退出设置。", invalid_visibility: "无法识别可见性:{0},请重新输入。回复 Q 退出设置。", enter_password: "请输入你需要使用的密码,如:123456。如果不输入密码请回复 N(则不设置密码)。否则回复你需要使用的密码。回复 Q 退出设置。", success_with_clear: "房间 {0} 已更新,聊天记录已被清空。", invalid_chat_mode: "无法识别聊天模式:{0},目前可用的聊天模式有:{1}。请重新输入。", failed: "房间 {0} 更新失败。请检查你的设置并重新尝试。", success: "房间 {0} 已更新。", field: { name: "房间名", model: "模型", preset: "预设", visibility: "可见性", chat_mode: "聊天模式", password: "密码" } } }, list: { description: "列出所有你加入的房间。", options: { page: "页码。", limit: "每页数量。" }, messages: { header: "以下是查询到你加入的房间列表:", footer: "你可以使用 chatluna.room.switch [name/id] 来切换当前环境里你的默认房间。", pages: "当前为第 [page] / [total] 页", room_name: "房间名: {0}", room_id: "房间ID: {0}", room_preset: "房间预设: {0}", room_model: "房间模型: {0}", room_visibility: "房间可见性: {0}", room_chat_mode: "房间聊天模式: {0}", room_master_id: "房间创建者ID: {0}", room_availability: "房间可用性:{0}" } }, transfer: { description: "转移房间的房主。", messages: { room_not_found: "未找到指定的房间。", not_room_master: "你不是房间的房主,无法转移房间给他人。", confirm_transfer: "你确定要把房间 {0} 转移给用户 {1} 吗?转移后ta将成为房间的房主,你将失去房主权限。如果你确定要转移,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "已将房间 {0} 转移给用户 {1}。" } }, info: { description: "查看当前房间的信息。", arguments: { room: "目标房间。" }, messages: { room_not_found: "未找到指定的房间。", header: "以下是你目前所在的房间信息", room_name: "房间名: {0}", room_id: "房间ID: {0}", room_preset: "房间预设: {0}", room_model: "房间模型: {0}", room_visibility: "房间可见性: {0}", room_chat_mode: "房间聊天模式: {0}", room_master_id: "房间创建者ID: {0}" } }, switch: { description: "切换到你已经加入了的房间。", arguments: { name: "房间名称或 ID。" }, messages: { success: "已切换到房间 {0}。", room_not_found: "未找到指定的房间。" } }, permission: { description: "修改房间里某人的权限。", options: { room: "指定房间。", user: "目标用户。" }, messages: { room_not_found: "未找到指定的房间。", not_admin: "你不是房间的房主,无法为用户设置权限。", confirm_set: "你确定要为用户 {0} 设置房间 {1} 的权限吗?目前可以设置的权限为 member 和 admin。如果你确定要设置,请输入设置权限的值或首字母大写,其他输入均视为取消。", timeout: "操作超时未确认,已自动取消。", invalid_permission: "你输入的权限值不正确,已自动取消。", success: "已为用户 {0} 设置房间 {1} 的权限为 {2}" } }, mute: { description: "禁言某个用户,不让其发言。", options: { room: "指定房间。" }, messages: { room_not_found: "未找到指定的房间。", not_admin: "你不是房间 {0} 的管理员,无法禁言用户。", success: "已将用户 {0} 在房间 {1} 禁言或解除禁言。" } } }, chat: { description: "ChatLuna 对话相关指令。", text: { description: "与大语言模型进行文本对话。", options: { room: "指定对话的目标房间。", type: "设置消息的渲染类型。" }, examples: ["chatluna chat text -t text 你好,世界!", "chatluna chat text -t voice 你好,世界!", "chatluna chat text -r 原神 -t text 你好,世界!"], arguments: { message: "要发送的消息内容。" }, messages: { "invalid-render-type": "渲染类型无效。请使用有效的渲染类型,目前支持的类有 `text` 和 `voice`。" } }, rollback: { description: "重新生成上一次的对话内容。", options: { room: "指定要操作的房间。" }, arguments: { message: "新的消息内容。" }, messages: { room_not_found: "未找到指定的房间。", conversation_not_exist: "房间不存在。", no_chat_history: "找不到对话记录。", invalid_chat_history: "错误的聊天记录,请尝试清空聊天记录后重试。", rollback_success: "已成功回滚到 {0} 轮前的对话,请等待模型回复。" } }, stop: { description: "立即停止当前正在进行的对话。", options: { room: "指定要停止对话的房间。" }, messages: { room_not_found: "未找到指定的房间。", no_active_chat: "当前未在房间中对话。", stop_failed: "停止对话失败。", success: "已成功停止当前对话。" } }, voice: { description: "与模型进行对话并将回复转换为语音输出。", options: { room: "指定对话的目标房间。", speaker: "设置语音服务使用目标角色 ID。" }, arguments: { message: "要发送的消息内容。" } } }, wipe: { description: "清空 ChatLuna 的所有使用数据(请谨慎使用)。", messages: { confirm_wipe: "您接下来将要操作的是清除 ChatLuna 的全部相关数据!这些数据包括:\n1. 所有会话数据\n2. 其他缓存在数据库的数据\n3. 本地向量数据库的相关数据\n\n请输入下列算式的结果以确认删除:{0}。\n", timeout: "删除超时,已取消删除", incorrect_input: "你的输入不正确,已取消删除。", success: "已删除相关数据,即将重启完成更改。" } }, restart: { description: "重启 ChatLuna 服务。", messages: { success: "已成功重启 ChatLuna。" } }, auth: { description: "ChatLuna 鉴权相关指令。", list: { description: "列出授权组。", options: { page: "页码。", limit: "每页显示的数量。", platform: "指定平台。" }, messages: { header: "以下是查询到目前可用的配额组列表:", footer: "你可以使用 chatluna.auth.add [name/id] 来加入某个配额组。", pages: "当前为第 [page] / [total] 页", name: "名称:{0}", platform: "适用模型平台:{0}", cost: "计费:{0} / 1000 token", priority: "优先级: {0}", support_models: "限制模型:{0}", limit_per_min: "并发限制每 {0} 条消息/分", limit_per_day: "并发限制每 {0} 条消息/天", general: "通用" } }, add: { description: "将用户加入到指定配额组。", usage: "使用方法:chatluna auth add [组名] -u @用户", options: { user: "目标用户。" }, messages: { permission_denied: "你的权限不足以执行此操作。", success: "已将用户 {0} 添加到配额组 {1}。" } }, kick: { description: "将用户从指定配额组中移除。", usage: "使用方法:chatluna auth kick [组名] -u @用户", options: { user: "目标用户。" }, messages: { permission_denied: "你的权限不足以执行此操作。", success: "已将用户 {0} 踢出配额组 {1}" } }, create: { description: "创建一个新的授权组。", options: { name: "授权组名称。", preMin: "每分钟请求限额。", preDay: "每日请求限额。", platform: "指定平台。", supportModels: "支持的模型列表。", priority: "优先级。", cost: "token 费用。" }, messages: { enter_name: "请输入你需要使用的配额组名,如:OpenAI配额组", name_exists: "你输入的配额组名已存在,请重新输入。", enter_limit_per_min: "请输入配额组每分钟的限额条数,要求为数字并且大于 0。", enter_limit_per_day: "请输入配额组每天的限额条数,要求为数字并且大于每分钟的限额次数。", enter_platform: "请输入对该配额组的模型平台标识符,如: openai。表示优先在使用该平台模型时使用该配额组,如不输入回复 N", enter_priority: "请输入配额组的优先级(数字,越大越优先)(这很重要,会决定配额组的使用顺序)。", enter_cost: "请输入配额组的 token 费用(数字,按一千 token 计费,实际扣除用户余额)。", enter_models: "请输入该配额组可使用的模型列表(白名单机制),用英文逗号分割,如(openai/gpt-3.5-turbo, openai/gpt-4)。如果不输入回复 N(则不设置型列表)。", invalid_input: "你输入的{0}有误,请重新输入。", confirm_create: "你目前已提供基础参数,是否直接创建配额组?如需直接创建配额组请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消创建配额组。", cancelled: "你已取消创建配额组。", success: "配额组创建成功,配额组名为:{0}。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。", invalid_models: "模型组里有不支持的模型,请重新输入。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "配额组名", limit_per_min: "每分钟限额条数", limit_per_day: "每天限额条数", platform: "平台标识符", priority: "优先级", cost: "费用", models: "模型列表" } } }, set: { description: "修改现有授权组的参数。", options: { name: "授权组名称。", preMin: "每分钟请求限额。", preDay: "每日请求限额。", platform: "指定平台。", supportModels: "支持的模型列表。", priority: "优先级。", cost: "token 费用。" }, messages: { confirm_set: "你目前已提供基础参数,是否直接修改配额组?如需直接修改配额组请回复 Y,如需进入交互式创建请回复 N,其他回复将视为取消。", timeout: "你超时未回复,已取消修改配额组。", cancelled: "你已取消修改配额组。", enter_name: "请输入你需要使用的配额组名,如:OpenAI配额组。回复 Q 退出修改。", name_exists: "你输入的配额组名已存在,请重新输入。", enter_limit_per_min: "请输入配额组每分钟的限额条数,要求为数字并且大于 0。回复 Q 退出修改。", enter_limit_per_day: "请输入配额组每天的限额条数,要求为数字并且大于每分钟的限额次数。回复 Q 退出修改。", enter_platform: "请输入对该配额组的模型平台标识符,如: openai。表示会优先在使用该平台模型时使用该配额组,如不输入回复 N。回复 Q 退出修改。", enter_priority: "请输入配额组的优先级(数字,越大越优先)(这很重要,会决定配额组的使用顺序)。回复 Q 退出修改。", enter_cost: "请输入配额组的 token 费用(数字,按一千 token 计费,实际扣除用户余额)。回复 Q 退出修改。", enter_models: "请输入该配额组可使用的模型列表(白名单机制),用英文逗号分割,如(openai/gpt-3.5-turbo, openai/gpt-4)。如果不输入回复 N(则不设置模型列表)。回复 Q 退出修改。", invalid_input: "你输入的{0}有误,请重新输入。", change_or_keep: "你已经{0}{1}:{2},是否需要更换?如需更换请回复更换后的{1},否则回复 N。回复 Q 退出修改。", invalid_models: "模型组里有不支持的模型,请重新输入。", success: "配额组修改成功,新配额组名为:{0}。", action: { input: "输入", set: "设置", select: "选择" }, field: { name: "配额组名", limit_per_min: "每分钟限额条数", limit_per_day: "每天限额条数", platform: "平台标识符", priority: "优先级", cost: "费用", models: "模型列表" } } } }, balance: { description: "ChatLuna 余额相关指令。", clear: { description: "清除指定用户的余额。将用户的余额重置为0。", arguments: { user: "目标用户。" }, examples: ["chatluna balance clear --user @用户名"], messages: { success: "已将用户 {0} 账户余额修改为 {1}" } }, set: { description: "设置指定用户的余额。可以增加或减少用户的余额。", arguments: { user: "目标用户。", amount: "要设置的余额数量。" }, examples: ["chatluna balance set --user @用户名 --amount 1000"], messages: { success: "已将用户 {0} 账户余额修改为 {1}" } }, query: { description: "查询用户的当前余额。如果不指定用户,则查询自己的余额。", arguments: { user: "目标用户。如果不指定,则查询当前用户。" }, examples: ["chatluna balance query", "chatluna balance query --user @用户名"], messages: { success: "用户 {0} 当前的账户余额为 {1}" } } }, model: { description: "ChatLuna 模型相关指令。", list: { description: "列出所有可用的模型。", usage: "chatluna model list --page 1 --limit 10", options: { page: "页码。", limit: "每页显示的数量。" }, messages: { header: "以下是目前可用的模型列表:", footer: "你可以使用 chatluna.room.set -m [model] 来设置默认使用的模型", pages: "当前为第 [page] / [total] 页" } }, search: { description: "搜索可用的模型。", arguments: { query: "搜索关键词。" }, usage: "chatluna model search openai --page 1 --limit 10", options: { page: "页码。", limit: "每页显示的数量。" }, messages: { header: "以下是目前搜索到的模型列表:", footer: "你可以使用 chatluna.room.set -m [model] 来设置默认使用的模型", pages: "当前为第 [page] / [total] 页" } } }, memory: { description: "ChatLuna 记忆相关指令。", search: { description: "搜索记忆。", arguments: { query: "搜索关键词。" }, usage: 'chatluna memory search --query "你好" --page 1 --limit 10', options: { page: "页码。", limit: "每页显示的数量。", type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { header: "以下是使用 {0} 关键词在 {1} 预设下搜索出的记忆列表:", footer: "", document_content: "记忆内容: {0}", document_id: "记忆 ID: {0}", document_type: "记忆所属的类型: {0}", document_expire: "记忆过期时间: {0}", document_level: "记忆的重要性: {0}", pages: "当前为第 [page] / [total] 页", search_failed: "搜索记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, delete: { description: "删除记忆。", arguments: { ids: "记忆 ID 列表。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { delete_success: "已删除记忆。", delete_failed: "删除记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, clear: { description: "清空记忆。", options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { clear_success: "已清空记忆。", clear_failed: "清空记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, add: { description: "添加记忆。", arguments: { content: "记忆内容。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { add_success: "已添加记忆。", add_failed: "添加记忆失败。", invalid_view: "无效的记忆层级。目前可用:{0}" } }, edit: { description: "编辑记忆。", arguments: { id: "记忆 ID。" }, options: { type: "记忆所属的预设。", view: "记忆所属的层级。" }, messages: { edit_success: "已编辑记忆。", edit_failed: "编辑记忆失败。", edit_memory_start: "请发送你的新记忆内容。", invalid_view: "无效的记忆层级。目前可用:{0}" } } }, preset: { description: "ChatLuna 预设相关指令。", list: { description: "列出当前支持的所有预设。", options: { page: "指定页码", limit: "设置每页显示数量" }, messages: { header: "以下是目前可用的预设列表:", footer: "你可以使用 chatluna.room.set -p [preset] 来设置默认使用的预设", pages: "当前为第 [page] / [total] 页", preset_keyword: "预设关键词: {0}", preset_content: "预设内容: {0}" } }, add: { description: "添加新预设。", arguments: { preset: "预设名称" }, messages: { conflict: "该预设关键词已经和其他预设关键词冲突,请更换其他关键词重试哦", prompt: "请发送你的预设内容。", timeout: "添加预设超时,已取消添加预设: {0}", success: "预设添加成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, clone: { description: "复制现有预设。", arguments: { originPreset: "源预设名称", newPresetName: "新预设名称" }, messages: { conflict: "该预设关键词已经和其他预设关键词冲突,请更换其他关键词重试哦。", confirm: "你确定要克隆预设 {0} 吗?如果你确定要克隆,请输入 Y 来确认。", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", success: "预设克隆成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, set: { description: "修改现有预设。", arguments: { preset: "预设名称" }, messages: { not_found: "找不到指定的预设。", not_support: "不支持修改 {0} 预设!该预设自定义了多条消息,属于复杂预设,无法使用此命令修改,请自行前往控制面板里的资源管理器编辑此预设。`", timeout: "操作超时未确认,已自动取消。", cancelled: "已为你取消操作。", enter_content: "请发送你的新预设内容。", success: "预设修改成功,预设名称为: {0}。 请调用预设列表命令查看。" } }, delete: { description: "删除指定预设。", arguments: { preset: "预设名称" }, messages: { only_one_preset: "现在只有一个预设了,删除后将无法使用预设功能,所以不允许删除。", not_found: "找不到该预设!请检查你是否输入了正确的预设?", confirm_delete: "是否要删除 {0} 预设?输入大写 Y 来确认删除,输入其他字符来取消删除。提示:删除后使用了该预设的会话将会自动删除无法使用。", timeout: "删除预设超时,已取消删除预设: {0}。", cancelled: "已取消删除预设: {0}", success: "已删除预设: {0},即将自动重启完成更改。" } } }, embeddings: { description: "ChatLuna 嵌入模型管理。", list: { description: "查看支持的嵌入模型列表。", options: { page: "指定页码。", limit: "设置每页显示数量。" }, messages: { header: "以下是目前可用的嵌入模型列表:", footer: "你可以使用 chatluna.embeddings.set [model] 来设置默认使用的嵌入模型", pages: "当前为第 [page] / [total] 页" } }, set: { description: "设置默认嵌入模型。", arguments: { embeddings: "嵌入模型名称。" }, messages: { usage_hint: "你可以使用 chatluna.embeddings.set [model] 来设置默认使用的嵌入模型", multiple_models_found: { header: "基于你的输入,找到了以下嵌入模型:", footer: "请输入更精确的嵌入模型名称以避免歧义", example: "例如:chatluna.embeddings.set {0}" }, model_not_found: "找不到对应的嵌入模型,请检查输入是否正确", success: "已将默认嵌入模型设置为 {0} (将自动重启插件应用更改)" } } }, vectorstore: { description: "ChatLuna 向量数据库管理。", list: { description: "查看支持的向量数据库列表。", options: { page: "指定页码。", limit: "设置每页显示数量。" }, messages: { header: "以下是目前可用的向量数据库列表:", footer: "你可以使用 chatluna.vectorstore.set [model] 来设置默认使用的向量数据库(如果没有任何向量数据库,会使用存储在内存里的向量数据库(临时的))", pages: "当前为第 [page] / [total] 页" } }, set: { description: "设置默认向量数据库。", arguments: { vectorStore: "向量数据库名称。" }, messages: { usage_hint: "你可以使用 chatluna.vectorstore.set [model] 来设置默认使用的向量数据库", multiple_stores_found: { header: "基于你的输入,找到了以下向量数据库:", footer: "请输入更精确的向量数据库名称以避免歧义", example: "例如:chatluna.vectorstore.set {0}" }, store_not_found: "找不到对应的向量数据库,请检查名称是否正确", success: "已将默认向量数据库设置为 {0},(将自动重启插件应用更改)" } } } } }, chatluna: { aborted: "已成功停止当前对话的生成。", thinking_message: "我还在思考中,前面还有 {0} 条消息等着我回复呢,稍等一下~", block_message: "哎呀(キ`゚Д゚´)!!,你怎么被拉入黑名单了呢?要不你去问问我的主人吧。", error_message: "使用 ChatLuna 时出现错误,错误码为 %s。请联系开发者以解决此问题。", middleware_error: "执行 {0} 时出现错误: {1}", chat_limit_exceeded: "你的聊天次数已经用完了喵,还需要等待 {0} 分钟才能继续聊天喵 >_<", room: { random_switch: "检测到你没有指定房间,已为你随机切换到房间 {0}。", not_joined: "你还没有加入任何房间,请先加入房间。", not_in_room: "你没有加入此房间,请先加入房间 {0}。", muted: "你已被禁言,无法在房间 {0} 发言。", unavailable: "检测到当前房间不可用,正在为您自动修复。", auto_switch: "已为用户 {0} 自动切换到房间 {1}。", auto_create: "已为用户 {0} 自动创建房间 {1}。", auto_create_template: "已为用户 {0} 自动创建模版克隆房间 {1}。", room_name: "{0} 的房间", template_clone_room_name: "{0} 的模版克隆房间", config_changed: "检测到模版房间 {0} 的配置变更,已更新到数据库。" }, cooldown_wait_message: "不要发这么快喵,等 {0}s 后我们再聊天喵。" } };
51
51
  }
52
52
  });
53
53
 
54
54
  // src/locales/en-US.yml
55
55
  var require_en_US = __commonJS({
56
56
  "src/locales/en-US.yml"(exports2, module2) {
57
- module2.exports = { commands: { chatluna: { description: "ChatLuna related commands.", room: { description: "ChatLuna room management.", create: { description: "Create a new room.", options: { name: "Room name", preset: "Room preset", model: "Room model", chatMode: "Chat mode", password: "Room password", visibility: "Room visibility" }, messages: { confirm_create: "Basic parameters provided. Create room directly? Y: Create, N: Interactive creation, Any other: Cancel.", timeout: "Response timeout. Room creation cancelled.", cancelled: "Room creation cancelled.", enter_name: "Enter room name (e.g., My Room). Q to exit.", change_or_keep: "{0} {1}: {2}. Change? New {1} to change, N to keep. Q to exit.", enter_model: "Enter model (e.g., openai/gpt-3.5-turbo). Q to exit.", model_not_found: "Model not found: {0}. Please retry.", enter_preset: "Enter preset (e.g., chatgpt). N for default. Q to exit.", preset_not_found: "Preset not found: {0}. Please retry.", enter_visibility: "Enter visibility (public/private). N for default. Q to exit.", visibility_not_recognized: "Unrecognized visibility: {0}. Please retry.", enter_chat_mode: "Enter chat mode. N for default. Q to exit.", enter_password: "Enter password. N for no password. Q to exit.", invalid_chat_mode: "Unable to recognize chat mode: {0}. Available chat modes are: {1}. Please try again. Q to exit.", template_room_created: "Template room created successfully.", room_created: "Room created. ID: {0}, Name: {1}.", action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Room name", model: "Model", preset: "Preset", visibility: "Visibility", chat_mode: "Chat mode", password: "Password" } } }, delete: { description: "Delete a room.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_delete: "Confirm deletion of room {0}? All messages and members will be removed. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Room {0} deleted." } }, "auto-update": { description: "Set auto-update for template clone rooms.", options: { room: "Specify room" }, messages: { room_not_found: "Room not found.", not_template_clone: "Not a template clone room. Cannot set auto-update.", not_admin: "Insufficient permissions: Not room owner.", success: "Auto-update for room {0} set to {1}.", "invalid-status": "Invalid parameter. Use true or false." } }, kick: { description: "Kick user from current room.", messages: { no_room_specified: "No room specified. Use chatluna.room.switch to select a room.", not_admin: "Insufficient permissions: Not room admin.", success: "Users kicked from room {0}: {1}" } }, invite: { description: "Invite user to room.", messages: { no_room_specified: "No room specified. Use chatluna.room.switch to select a room.", not_admin: "Insufficient permissions: Not room admin.", success: "User {0} invited to room {1}." } }, join: { description: "Join a room.", arguments: { id: "Room ID or name" }, messages: { room_not_found: "Room not found.", not_in_group: "Room not in current group chat.", private_no_password: "Private room. Owner invitation required.", private_group_join: "Private room. Cannot join in group chat.", enter_password: "Enter password for room {0}.", timeout: "Operation timed out. Automatically cancelled.", wrong_password: "Incorrect password. Operation cancelled.", success: "Joined room {0}" } }, leave: { description: "Leave current room.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", confirm_delete: "Room owner detected. Leaving will delete the room. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Left room {0}. Rejoin or switch rooms if needed." } }, clear: { description: "Clear room chat history.", arguments: { room: "Target room" }, messages: { success: "Chat history cleared for room {0}.", "no-room": "Room not found." } }, set: { description: "Set room properties.", options: { name: "Room name", preset: "Room preset", model: "Room model", chatMode: "Chat mode", password: "Room password", visibility: "Room visibility" }, messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_update: "Update room properties? Y: Update, N: Interactive update, Any other: Cancel.", timeout: "Response timeout. Update cancelled.", cancelled: "Update cancelled.", no_password_in_public: "Cannot set password for non-private room or group chat.", change_or_keep: "{0}: {1}. Change? New value to change, N to keep. Q to exit.", model_not_found: "Model not found: {0}. Please retry.", preset_not_found: "Preset not found: {0}. Please retry.", invalid_visibility: "Invalid visibility: {0}. Please retry.", enter_password: "Enter password. N for no password. Q to exit.", success_with_clear: "Room {0} updated. Chat history cleared.", invalid_chat_mode: "Unable to recognize chat mode: {0}. Available chat modes are: {1}. Please try again.", failed: "Room {0} update failed. Please check your settings and try again.", success: "Room {0} updated.", field: { name: "Room name", model: "Model", preset: "Preset", visibility: "Visibility", chat_mode: "Chat mode", password: "Password" } } }, list: { description: "List joined rooms.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Joined rooms:", footer: "Use chatluna.room.switch <name/id> to change default room.", pages: "Page: [page] / [total]", room_name: "Name: {0}", room_id: "ID: {0}", room_preset: "Preset: {0}", room_model: "Model: {0}", room_visibility: "Visibility: {0}", room_chat_mode: "Chat mode: {0}", room_master_id: "Creator ID: {0}", room_availability: "Availability: {0}" } }, transfer: { description: "Transfer room ownership.", messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_transfer: "Transfer room {0} to user {1}? You will lose owner privileges. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Room {0} transferred to user {1}." } }, info: { description: "View current room information.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", header: "Current room information:", room_name: "Name: {0}", room_id: "ID: {0}", room_preset: "Preset: {0}", room_model: "Model: {0}", room_visibility: "Visibility: {0}", room_chat_mode: "Chat mode: {0}", room_master_id: "Creator ID: {0}" } }, switch: { description: "Switch to a joined room.", arguments: { name: "Room name or ID" }, messages: { success: "Switched to room {0}.", room_not_found: "Room not found." } }, permission: { description: "Modify user permissions in room.", options: { room: "Specify room", user: "Target user" }, messages: { room_not_found: "Room not found.", not_admin: "Insufficient permissions: Not room owner.", confirm_set: "Set permissions for user {0} in room {1}? Available: member, admin. Enter permission or first letter. Any other: Cancel.", timeout: "Operation timed out. Automatically cancelled.", invalid_permission: "Invalid permission. Operation cancelled.", success: "Permission for user {0} in room {1} set to {2}" } }, mute: { description: "Mute a user in the room.", options: { room: "Specify room" }, messages: { room_not_found: "Room not found.", not_admin: "Insufficient permissions: Not room admin.", success: "User {0} muted/unmuted in room {1}." } } }, chat: { description: "ChatLuna conversation commands.", text: { description: "Initiate a text conversation with the AI model.", options: { room: "Target conversation room.", type: "Message rendering type." }, examples: ["chatluna chat text -t text Hello, world!", "chatluna chat text -t voice Hello, world!", "chatluna chat text -r Genshin -t text Hello, world!"], arguments: { message: "Message content to send." }, messages: { "invalid-render-type": "Invalid rendering type. Supported types: `text` and `voice`." } }, rollback: { description: "Regenerate last conversation content.", options: { room: "Target room for operation." }, arguments: { message: "New message content." }, messages: { room_not_found: "Room not found.", conversation_not_exist: "Room does not exist.", no_chat_history: "Chat history not found.", invalid_chat_history: "Invalid chat history. Clear history and retry.", rollback_success_1: "Successfully rolled back to {0} rounds ago." } }, stop: { description: "Immediately terminate ongoing conversation.", options: { room: "Target room to stop conversation." }, messages: { room_not_found: "Room not found.", no_active_chat: "No active conversation in current room.", stop_failed: "Failed to stop conversation.", success: "Conversation stopped successfully." } }, voice: { description: "Converse with AI model and receive voice output.", options: { room: "Target conversation room.", speaker: "Character ID for voice service." }, arguments: { message: "Message content to send." } } }, wipe: { description: "Clear all ChatLuna usage data (use with caution).", messages: { confirm_wipe: "Warning: You are about to clear all ChatLuna data, including:\n1. All session data\n2. Cached database data\n3. Local vector database data\n\nTo confirm deletion, enter the result of: {0}.\n", timeout: "Deletion timed out. Operation cancelled.", incorrect_input: "Incorrect input. Deletion cancelled.", success: "Data deleted. Restarting to apply changes." } }, restart: { description: "Restart the ChatLuna.", messages: { success: "Successfully restarted ChatLuna." } }, auth: { description: "ChatLuna authentication commands.", list: { description: "Display authorization groups.", options: { page: "Page number", limit: "Items per page", platform: "Specify platform" }, messages: { header: "Available quota groups:", footer: "Use chatluna.auth.add <name/id> to join a quota group.", pages: "Page: [page] / [total]", name: "Name: {0}", platform: "Model platform: {0}", cost: "Cost: {0} / 1000 tokens", priority: "Priority: {0}", support_models: "Allowed models: {0}", limit_per_min: "Limit: {0} messages/minute", limit_per_day: "Limit: {0} messages/day", general: "General" } }, add: { description: "Add user to quota group.", usage: "Usage: chatluna auth add <group name> -u @user", options: { user: "Target user" }, messages: { permission_denied: "Insufficient permissions for this operation.", success: "User {0} added to quota group {1}." } }, kick: { description: "Remove user from quota group.", usage: "Usage: chatluna auth kick <group name> -u @user", options: { user: "Target user" }, messages: { permission_denied: "Insufficient permissions for this operation.", success: "User {0} removed from quota group {1}." } }, create: { description: "Create new authorization group.", options: { name: "Group name", preMin: "Per-minute limit", preDay: "Daily limit", platform: "Platform", supportModels: "Supported models", priority: "Priority", cost: "Token cost" }, messages: { enter_name: "Enter quota group name (e.g., OpenAI Quota Group):", name_exists: "Group name already exists. Please try again.", enter_limit_per_min: "Enter per-minute limit (>0):", enter_limit_per_day: "Enter daily limit (>per-minute limit):", enter_platform: "Enter model platform ID (e.g., openai) or N to skip:", enter_priority: "Enter priority (higher number = higher priority):", enter_cost: "Enter token cost (per 1000 tokens):", enter_models: "Enter allowed models (comma-separated) or N to skip:", invalid_input: "Invalid input for {0}. Please try again.", confirm_create: "Create quota group? Y: Create, N: Interactive mode, Any other: Cancel.", timeout: "Response timeout. Creation cancelled.", cancelled: "Quota group creation cancelled.", success: 'Quota group "{0}" created successfully.', change_or_keep: "{0} {1}: {2}. Change? New value or N to keep.", invalid_models: "Invalid models detected. Please try again.", action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Group name", limit_per_min: "Per-minute limit", limit_per_day: "Daily limit", platform: "Platform ID", priority: "Priority", cost: "Cost", models: "Allowed models" } } }, set: { description: "Modify existing authorization group.", options: { name: "Group name", preMin: "Per-minute limit", preDay: "Daily limit", platform: "Platform", supportModels: "Supported models", priority: "Priority", cost: "Token cost" }, messages: { confirm_set: "Modify quota group? Y: Direct modify, N: Interactive mode, Any other: Cancel.", timeout: "Response timeout. Modification cancelled.", cancelled: "Quota group modification cancelled.", enter_name: "Enter new group name (e.g., OpenAI Quota Group) or Q to exit:", name_exists: "Group name already exists. Please try again.", enter_limit_per_min: "Enter new per-minute limit (>0) or Q to exit:", enter_limit_per_day: "Enter new daily limit (>per-minute limit) or Q to exit:", enter_platform: "Enter new platform ID (e.g., openai), N to skip, or Q to exit:", enter_priority: "Enter new priority (higher = more priority) or Q to exit:", enter_cost: "Enter new token cost (per 1000 tokens) or Q to exit:", enter_models: "Enter new allowed models (comma-separated), N to skip, or Q to exit:", invalid_input: "Invalid input for {0}. Please try again.", change_or_keep: "{0} {1}: {2}. Change? New value, N to keep, or Q to exit.", invalid_models: "Invalid models detected. Please try again.", success: 'Quota group "{0}" modified successfully.', action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Group name", limit_per_min: "Per-minute limit", limit_per_day: "Daily limit", platform: "Platform ID", priority: "Priority", cost: "Cost", models: "Allowed models" } } } }, balance: { description: "ChatLuna balance management.", clear: { description: "Reset user balance.", arguments: { user: "Target user" }, examples: ["chatluna balance clear --user @username"], messages: { success: "User {0} balance reset to {1}" } }, set: { description: "Adjust user balance.", arguments: { user: "Target user", amount: "New balance" }, examples: ["chatluna balance set --user @username --amount 1000"], messages: { success: "User {0} balance updated to {1}" } }, query: { description: "Check user balance.", arguments: { user: "Target user (default: current user)" }, examples: ["chatluna balance query", "chatluna balance query --user @username"], messages: { success: "User {0} current balance: {1}" } } }, model: { description: "ChatLuna model management.", list: { description: "Display available models.", usage: "chatluna model list --page 1 --limit 10", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Available models:", footer: "Set default model: chatluna.room.set -m <model>", pages: "Page: [page] / [total]" } }, search: { description: "Search available models.", arguments: { query: "Search keyword" }, usage: "chatluna model search openai --page 1 --limit 10", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Search results:", footer: "Set default model: chatluna.room.set -m <model>", pages: "Page: [page] / [total]" } } }, memory: { description: "ChatLuna memory-related commands.", search: { description: "Search memories.", arguments: { query: "Search keyword." }, usage: 'chatluna memory search --query "Hello" --page 1 --limit 10', options: { page: "Page number.", limit: "Items per page.", type: "Memory preset.", view: "Memory layer." }, messages: { header: "Here is the list of memories found using the keyword {0} under the preset {1}:", footer: "", document_content: "Memory content: {0}", document_id: "Memory ID: {0}", document_type: "Memory type: {0}", document_expire: "Memory expire: {0}", document_level: "Memory level: {0}", pages: "Page: [page] / [total]", search_failed: "Failed to search memories.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, delete: { description: "Delete memory.", arguments: { ids: "Memory ID list." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { delete_success: "Memory deleted successfully.", delete_failed: "Failed to delete memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, clear: { description: "Clear memory.", options: { type: "Memory preset.", view: "Memory layer." }, messages: { clear_success: "Memory cleared successfully.", clear_failed: "Failed to clear memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, add: { description: "Add memory.", arguments: { content: "Memory content." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { add_success: "Memory added successfully.", add_failed: "Failed to add memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, edit: { description: "Edit memory.", arguments: { id: "Memory ID." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { edit_success: "Memory edited successfully.", edit_failed: "Failed to edit memory.", edit_memory_start: "Please send your new memory content.", invalid_view: "Invalid view type. Currently supported types are: {0}." } } }, preset: { description: "ChatLuna preset management.", list: { description: "Display available presets.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Available presets:", footer: "Set default preset: chatluna.room.set -p <preset>", pages: "Page: [page] / [total]", preset_keyword: "Keyword: {0}", preset_content: "Content: {0}" } }, add: { description: "Create new preset.", arguments: { preset: "Preset name" }, messages: { conflict: "Preset keyword conflict. Choose a different keyword.", prompt: "Enter preset content.", timeout: "Operation timed out. Cancelled adding preset: {0}", success: 'Preset "{0}" created. Use chatluna.preset.list to view.' } }, clone: { description: "Duplicate existing preset.", arguments: { originPreset: "Source preset", newPresetName: "New preset name" }, messages: { conflict: "Preset keyword conflict. Choose a different name.", confirm: "Confirm cloning preset {0}? Enter Y to proceed.", timeout: "Operation timed out. Cancelled.", cancelled: "Operation cancelled.", success: 'Preset "{0}" cloned. Use chatluna.preset.list to view.' } }, set: { description: "Update existing preset.", arguments: { preset: "Preset name" }, messages: { not_found: "Preset not found.", not_support: "Cannot modify preset {0}. This complex preset requires editing via the control panel resource manager.", timeout: "Operation timed out. Cancelled.", cancelled: "Operation cancelled.", enter_content: "Enter new preset content.", success: 'Preset "{0}" updated. Use chatluna.preset.list to view.' } }, delete: { description: "Remove specified preset.", arguments: { preset: "Preset name" }, messages: { only_one_preset: "Cannot delete the only existing preset.", not_found: "Preset not found. Check the name and try again.", confirm_delete: "Delete preset {0}? Y to confirm, any other key to cancel. Note: Associated sessions will be deleted.", timeout: "Operation timed out. Cancelled deleting preset: {0}.", cancelled: "Cancelled deleting preset: {0}", success: "Preset {0} deleted. Restarting to apply changes." } } }, embeddings: { description: "ChatLuna embedding model management.", list: { description: "View embedding models.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Supported embedding models:", footer: "Set default: chatluna.embeddings.set <model>", pages: "Page: [page] / [total]" } }, set: { description: "Set default embedding model.", arguments: { embeddings: "Model name" }, messages: { usage_hint: "Usage: chatluna.embeddings.set <model>", multiple_models_found: { header: "Multiple models found:", footer: "Please provide a more specific model name", example: "Example: chatluna.embeddings.set {0}" }, model_not_found: "Model not found. Check the name and try again.", success: "Default set to {0}. Restarting plugin to apply." } } }, vectorstore: { description: "ChatLuna vector database management.", list: { description: "View vector databases.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Supported vector databases:", footer: "Set default: chatluna.vectorstore.set <model> (uses in-memory if none set)", pages: "Page: [page] / [total]" } }, set: { description: "Set default vector database.", arguments: { vectorStore: "Database name" }, messages: { usage_hint: "Usage: chatluna.vectorstore.set <model>", multiple_stores_found: { header: "Multiple databases found:", footer: "Please provide a more specific database name", example: "Example: chatluna.vectorstore.set {0}" }, store_not_found: "Database not found. Check the name and try again.", success: "Default set to {0}. Restarting plugin to apply." } } } } }, chatluna: { aborted: "Current conversation generation stopped successfully.", thinking_message: "Processing... {0} messages in queue. Please wait.", block_message: "You have been blacklisted. Please contact the system administrator.", error_message: "ChatLuna error occurred. Error code: %s. Contact developer for assistance.", middleware_error: "Error in {0}: {1}", chat_limit_exceeded: "Daily chat limit reached. Please try again in {0} minutes.", room: { random_switch: "No room specified. Switched to room {0}.", not_joined: "No room joined. Please join a room first.", not_in_room: "Not a member of this room. Please join room {0} first.", muted: "You are muted in room {0}.", unavailable: "Current room unavailable. Automatic repair in progress.", auto_switch: "User {0} switched to room {1}.", auto_create: "Room {1} created for user {0}.", auto_create_template: "Template clone room {1} created for user {0}.", room_name: "{0} room", template_clone_room_name: "{0} template clone room", config_changed: "Configuration updated for template room {0}." }, cooldown_wait_message: "Message rate limit reached. Please wait {0}s before sending another message." } };
57
+ module2.exports = { commands: { chatluna: { description: "ChatLuna related commands.", room: { description: "ChatLuna room management.", create: { description: "Create a new room.", options: { name: "Room name", preset: "Room preset", model: "Room model", chatMode: "Chat mode", password: "Room password", visibility: "Room visibility" }, messages: { confirm_create: "Basic parameters provided. Create room directly? Y: Create, N: Interactive creation, Any other: Cancel.", timeout: "Response timeout. Room creation cancelled.", cancelled: "Room creation cancelled.", enter_name: "Enter room name (e.g., My Room). Q to exit.", change_or_keep: "{0} {1}: {2}. Change? New {1} to change, N to keep. Q to exit.", enter_model: "Enter model (e.g., openai/gpt-3.5-turbo). Q to exit.", model_not_found: "Model not found: {0}. Please retry.", enter_preset: "Enter preset (e.g., chatgpt). N for default. Q to exit.", preset_not_found: "Preset not found: {0}. Please retry.", enter_visibility: "Enter visibility (public/private). N for default. Q to exit.", visibility_not_recognized: "Unrecognized visibility: {0}. Please retry.", enter_chat_mode: "Enter chat mode. N for default. Q to exit.", enter_password: "Enter password. N for no password. Q to exit.", invalid_chat_mode: "Unable to recognize chat mode: {0}. Available chat modes are: {1}. Please try again. Q to exit.", template_room_created: "Template room created successfully.", room_created: "Room created. ID: {0}, Name: {1}.", action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Room name", model: "Model", preset: "Preset", visibility: "Visibility", chat_mode: "Chat mode", password: "Password" } } }, delete: { description: "Delete a room.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_delete: "Confirm deletion of room {0}? All messages and members will be removed. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Room {0} deleted." } }, "auto-update": { description: "Set auto-update for template clone rooms.", options: { room: "Specify room" }, messages: { room_not_found: "Room not found.", not_template_clone: "Not a template clone room. Cannot set auto-update.", not_admin: "Insufficient permissions: Not room owner.", success: "Auto-update for room {0} set to {1}.", "invalid-status": "Invalid parameter. Use true or false." } }, kick: { description: "Kick user from current room.", messages: { no_room_specified: "No room specified. Use chatluna.room.switch to select a room.", not_admin: "Insufficient permissions: Not room admin.", success: "Users kicked from room {0}: {1}" } }, invite: { description: "Invite user to room.", messages: { no_room_specified: "No room specified. Use chatluna.room.switch to select a room.", not_admin: "Insufficient permissions: Not room admin.", success: "User {0} invited to room {1}." } }, join: { description: "Join a room.", arguments: { id: "Room ID or name" }, messages: { room_not_found: "Room not found.", not_in_group: "Room not in current group chat.", private_no_password: "Private room. Owner invitation required.", private_group_join: "Private room. Cannot join in group chat.", enter_password: "Enter password for room {0}.", timeout: "Operation timed out. Automatically cancelled.", wrong_password: "Incorrect password. Operation cancelled.", success: "Joined room {0}" } }, leave: { description: "Leave current room.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", confirm_delete: "Room owner detected. Leaving will delete the room. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Left room {0}. Rejoin or switch rooms if needed." } }, clear: { description: "Clear room chat history.", arguments: { room: "Target room" }, messages: { success: "Chat history cleared for room {0}.", "no-room": "Room not found." } }, set: { description: "Set room properties.", options: { name: "Room name", preset: "Room preset", model: "Room model", chatMode: "Chat mode", password: "Room password", visibility: "Room visibility" }, messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_update: "Update room properties? Y: Update, N: Interactive update, Any other: Cancel.", timeout: "Response timeout. Update cancelled.", cancelled: "Update cancelled.", no_password_in_public: "Cannot set password for non-private room or group chat.", change_or_keep: "{0}: {1}. Change? New value to change, N to keep. Q to exit.", model_not_found: "Model not found: {0}. Please retry.", preset_not_found: "Preset not found: {0}. Please retry.", invalid_visibility: "Invalid visibility: {0}. Please retry.", enter_password: "Enter password. N for no password. Q to exit.", success_with_clear: "Room {0} updated. Chat history cleared.", invalid_chat_mode: "Unable to recognize chat mode: {0}. Available chat modes are: {1}. Please try again.", failed: "Room {0} update failed. Please check your settings and try again.", success: "Room {0} updated.", field: { name: "Room name", model: "Model", preset: "Preset", visibility: "Visibility", chat_mode: "Chat mode", password: "Password" } } }, list: { description: "List joined rooms.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Joined rooms:", footer: "Use chatluna.room.switch [name/id] to change default room.", pages: "Page: [page] / [total]", room_name: "Name: {0}", room_id: "ID: {0}", room_preset: "Preset: {0}", room_model: "Model: {0}", room_visibility: "Visibility: {0}", room_chat_mode: "Chat mode: {0}", room_master_id: "Creator ID: {0}", room_availability: "Availability: {0}" } }, transfer: { description: "Transfer room ownership.", messages: { room_not_found: "Room not found.", not_room_master: "Insufficient permissions: Not room owner.", confirm_transfer: "Transfer room {0} to user {1}? You will lose owner privileges. Y to confirm.", timeout: "Operation timed out. Automatically cancelled.", cancelled: "Operation cancelled.", success: "Room {0} transferred to user {1}." } }, info: { description: "View current room information.", arguments: { room: "Target room" }, messages: { room_not_found: "Room not found.", header: "Current room information:", room_name: "Name: {0}", room_id: "ID: {0}", room_preset: "Preset: {0}", room_model: "Model: {0}", room_visibility: "Visibility: {0}", room_chat_mode: "Chat mode: {0}", room_master_id: "Creator ID: {0}" } }, switch: { description: "Switch to a joined room.", arguments: { name: "Room name or ID" }, messages: { success: "Switched to room {0}.", room_not_found: "Room not found." } }, permission: { description: "Modify user permissions in room.", options: { room: "Specify room", user: "Target user" }, messages: { room_not_found: "Room not found.", not_admin: "Insufficient permissions: Not room owner.", confirm_set: "Set permissions for user {0} in room {1}? Available: member, admin. Enter permission or first letter. Any other: Cancel.", timeout: "Operation timed out. Automatically cancelled.", invalid_permission: "Invalid permission. Operation cancelled.", success: "Permission for user {0} in room {1} set to {2}" } }, mute: { description: "Mute a user in the room.", options: { room: "Specify room" }, messages: { room_not_found: "Room not found.", not_admin: "Insufficient permissions: Not room admin.", success: "User {0} muted/unmuted in room {1}." } } }, chat: { description: "ChatLuna conversation commands.", text: { description: "Initiate a text conversation with the AI model.", options: { room: "Target conversation room.", type: "Message rendering type." }, examples: ["chatluna chat text -t text Hello, world!", "chatluna chat text -t voice Hello, world!", "chatluna chat text -r Genshin -t text Hello, world!"], arguments: { message: "Message content to send." }, messages: { "invalid-render-type": "Invalid rendering type. Supported types: `text` and `voice`." } }, rollback: { description: "Regenerate last conversation content.", options: { room: "Target room for operation." }, arguments: { message: "New message content." }, messages: { room_not_found: "Room not found.", conversation_not_exist: "Room does not exist.", no_chat_history: "Chat history not found.", invalid_chat_history: "Invalid chat history. Clear history and retry.", rollback_success_1: "Successfully rolled back to {0} rounds ago." } }, stop: { description: "Immediately terminate ongoing conversation.", options: { room: "Target room to stop conversation." }, messages: { room_not_found: "Room not found.", no_active_chat: "No active conversation in current room.", stop_failed: "Failed to stop conversation.", success: "Conversation stopped successfully." } }, voice: { description: "Converse with AI model and receive voice output.", options: { room: "Target conversation room.", speaker: "Character ID for voice service." }, arguments: { message: "Message content to send." } } }, wipe: { description: "Clear all ChatLuna usage data (use with caution).", messages: { confirm_wipe: "Warning: You are about to clear all ChatLuna data, including:\n1. All session data\n2. Cached database data\n3. Local vector database data\n\nTo confirm deletion, enter the result of: {0}.\n", timeout: "Deletion timed out. Operation cancelled.", incorrect_input: "Incorrect input. Deletion cancelled.", success: "Data deleted. Restarting to apply changes." } }, restart: { description: "Restart the ChatLuna.", messages: { success: "Successfully restarted ChatLuna." } }, auth: { description: "ChatLuna authentication commands.", list: { description: "Display authorization groups.", options: { page: "Page number", limit: "Items per page", platform: "Specify platform" }, messages: { header: "Available quota groups:", footer: "Use chatluna.auth.add [name/id] to join a quota group.", pages: "Page: [page] / [total]", name: "Name: {0}", platform: "Model platform: {0}", cost: "Cost: {0} / 1000 tokens", priority: "Priority: {0}", support_models: "Allowed models: {0}", limit_per_min: "Limit: {0} messages/minute", limit_per_day: "Limit: {0} messages/day", general: "General" } }, add: { description: "Add user to quota group.", usage: "Usage: chatluna auth add [group] name -u @user", options: { user: "Target user" }, messages: { permission_denied: "Insufficient permissions for this operation.", success: "User {0} added to quota group {1}." } }, kick: { description: "Remove user from quota group.", usage: "Usage: chatluna auth kick [group name] -u @user", options: { user: "Target user" }, messages: { permission_denied: "Insufficient permissions for this operation.", success: "User {0} removed from quota group {1}." } }, create: { description: "Create new authorization group.", options: { name: "Group name", preMin: "Per-minute limit", preDay: "Daily limit", platform: "Platform", supportModels: "Supported models", priority: "Priority", cost: "Token cost" }, messages: { enter_name: "Enter quota group name (e.g., OpenAI Quota Group):", name_exists: "Group name already exists. Please try again.", enter_limit_per_min: "Enter per-minute limit (>0):", enter_limit_per_day: "Enter daily limit (>per-minute limit):", enter_platform: "Enter model platform ID (e.g., openai) or N to skip:", enter_priority: "Enter priority (higher number = higher priority):", enter_cost: "Enter token cost (per 1000 tokens):", enter_models: "Enter allowed models (comma-separated) or N to skip:", invalid_input: "Invalid input for {0}. Please try again.", confirm_create: "Create quota group? Y: Create, N: Interactive mode, Any other: Cancel.", timeout: "Response timeout. Creation cancelled.", cancelled: "Quota group creation cancelled.", success: 'Quota group "{0}" created successfully.', change_or_keep: "{0} {1}: {2}. Change? New value or N to keep.", invalid_models: "Invalid models detected. Please try again.", action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Group name", limit_per_min: "Per-minute limit", limit_per_day: "Daily limit", platform: "Platform ID", priority: "Priority", cost: "Cost", models: "Allowed models" } } }, set: { description: "Modify existing authorization group.", options: { name: "Group name", preMin: "Per-minute limit", preDay: "Daily limit", platform: "Platform", supportModels: "Supported models", priority: "Priority", cost: "Token cost" }, messages: { confirm_set: "Modify quota group? Y: Direct modify, N: Interactive mode, Any other: Cancel.", timeout: "Response timeout. Modification cancelled.", cancelled: "Quota group modification cancelled.", enter_name: "Enter new group name (e.g., OpenAI Quota Group) or Q to exit:", name_exists: "Group name already exists. Please try again.", enter_limit_per_min: "Enter new per-minute limit (>0) or Q to exit:", enter_limit_per_day: "Enter new daily limit (>per-minute limit) or Q to exit:", enter_platform: "Enter new platform ID (e.g., openai), N to skip, or Q to exit:", enter_priority: "Enter new priority (higher = more priority) or Q to exit:", enter_cost: "Enter new token cost (per 1000 tokens) or Q to exit:", enter_models: "Enter new allowed models (comma-separated), N to skip, or Q to exit:", invalid_input: "Invalid input for {0}. Please try again.", change_or_keep: "{0} {1}: {2}. Change? New value, N to keep, or Q to exit.", invalid_models: "Invalid models detected. Please try again.", success: 'Quota group "{0}" modified successfully.', action: { input: "Input", set: "Set", select: "Select" }, field: { name: "Group name", limit_per_min: "Per-minute limit", limit_per_day: "Daily limit", platform: "Platform ID", priority: "Priority", cost: "Cost", models: "Allowed models" } } } }, balance: { description: "ChatLuna balance management.", clear: { description: "Reset user balance.", arguments: { user: "Target user" }, examples: ["chatluna balance clear --user @username"], messages: { success: "User {0} balance reset to {1}" } }, set: { description: "Adjust user balance.", arguments: { user: "Target user", amount: "New balance" }, examples: ["chatluna balance set --user @username --amount 1000"], messages: { success: "User {0} balance updated to {1}" } }, query: { description: "Check user balance.", arguments: { user: "Target user (default: current user)" }, examples: ["chatluna balance query", "chatluna balance query --user @username"], messages: { success: "User {0} current balance: {1}" } } }, model: { description: "ChatLuna model management.", list: { description: "Display available models.", usage: "chatluna model list --page 1 --limit 10", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Available models:", footer: "Set default model: chatluna.room.set -m [model]", pages: "Page: [page] / [total]" } }, search: { description: "Search available models.", arguments: { query: "Search keyword" }, usage: "chatluna model search openai --page 1 --limit 10", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Search results:", footer: "Set default model: chatluna.room.set -m [model]", pages: "Page: [page] / [total]" } } }, memory: { description: "ChatLuna memory-related commands.", search: { description: "Search memories.", arguments: { query: "Search keyword." }, usage: 'chatluna memory search --query "Hello" --page 1 --limit 10', options: { page: "Page number.", limit: "Items per page.", type: "Memory preset.", view: "Memory layer." }, messages: { header: "Here is the list of memories found using the keyword {0} under the preset {1}:", footer: "", document_content: "Memory content: {0}", document_id: "Memory ID: {0}", document_type: "Memory type: {0}", document_expire: "Memory expire: {0}", document_level: "Memory level: {0}", pages: "Page: [page] / [total]", search_failed: "Failed to search memories.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, delete: { description: "Delete memory.", arguments: { ids: "Memory ID list." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { delete_success: "Memory deleted successfully.", delete_failed: "Failed to delete memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, clear: { description: "Clear memory.", options: { type: "Memory preset.", view: "Memory layer." }, messages: { clear_success: "Memory cleared successfully.", clear_failed: "Failed to clear memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, add: { description: "Add memory.", arguments: { content: "Memory content." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { add_success: "Memory added successfully.", add_failed: "Failed to add memory.", invalid_view: "Invalid view type. Currently supported types are: {0}." } }, edit: { description: "Edit memory.", arguments: { id: "Memory ID." }, options: { type: "Memory preset.", view: "Memory layer." }, messages: { edit_success: "Memory edited successfully.", edit_failed: "Failed to edit memory.", edit_memory_start: "Please send your new memory content.", invalid_view: "Invalid view type. Currently supported types are: {0}." } } }, preset: { description: "ChatLuna preset management.", list: { description: "Display available presets.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Available presets:", footer: "Set default preset: chatluna.room.set -p [preset]", pages: "Page: [page] / [total]", preset_keyword: "Keyword: {0}", preset_content: "Content: {0}" } }, add: { description: "Create new preset.", arguments: { preset: "Preset name" }, messages: { conflict: "Preset keyword conflict. Choose a different keyword.", prompt: "Enter preset content.", timeout: "Operation timed out. Cancelled adding preset: {0}", success: 'Preset "{0}" created. Use chatluna.preset.list to view.' } }, clone: { description: "Duplicate existing preset.", arguments: { originPreset: "Source preset", newPresetName: "New preset name" }, messages: { conflict: "Preset keyword conflict. Choose a different name.", confirm: "Confirm cloning preset {0}? Enter Y to proceed.", timeout: "Operation timed out. Cancelled.", cancelled: "Operation cancelled.", success: 'Preset "{0}" cloned. Use chatluna.preset.list to view.' } }, set: { description: "Update existing preset.", arguments: { preset: "Preset name" }, messages: { not_found: "Preset not found.", not_support: "Cannot modify preset {0}. This complex preset requires editing via the control panel resource manager.", timeout: "Operation timed out. Cancelled.", cancelled: "Operation cancelled.", enter_content: "Enter new preset content.", success: 'Preset "{0}" updated. Use chatluna.preset.list to view.' } }, delete: { description: "Remove specified preset.", arguments: { preset: "Preset name" }, messages: { only_one_preset: "Cannot delete the only existing preset.", not_found: "Preset not found. Check the name and try again.", confirm_delete: "Delete preset {0}? Y to confirm, any other key to cancel. Note: Associated sessions will be deleted.", timeout: "Operation timed out. Cancelled deleting preset: {0}.", cancelled: "Cancelled deleting preset: {0}", success: "Preset {0} deleted. Restarting to apply changes." } } }, embeddings: { description: "ChatLuna embedding model management.", list: { description: "View embedding models.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Supported embedding models:", footer: "Set default: chatluna.embeddings.set [model]", pages: "Page: [page] / [total]" } }, set: { description: "Set default embedding model.", arguments: { embeddings: "Model name" }, messages: { usage_hint: "Usage: chatluna.embeddings.set [model]", multiple_models_found: { header: "Multiple models found:", footer: "Please provide a more specific model name", example: "Example: chatluna.embeddings.set {0}" }, model_not_found: "Model not found. Check the name and try again.", success: "Default set to {0}. Restarting plugin to apply." } } }, vectorstore: { description: "ChatLuna vector database management.", list: { description: "View vector databases.", options: { page: "Page number", limit: "Items per page" }, messages: { header: "Supported vector databases:", footer: "Set default: chatluna.vectorstore.set [model] (uses in-memory if none set)", pages: "Page: [page] / [total]" } }, set: { description: "Set default vector database.", arguments: { vectorStore: "Database name" }, messages: { usage_hint: "Usage: chatluna.vectorstore.set [model]", multiple_stores_found: { header: "Multiple databases found:", footer: "Please provide a more specific database name", example: "Example: chatluna.vectorstore.set {0}" }, store_not_found: "Database not found. Check the name and try again.", success: "Default set to {0}. Restarting plugin to apply." } } } } }, chatluna: { aborted: "Current conversation generation stopped successfully.", thinking_message: "Processing... {0} messages in queue. Please wait.", block_message: "You have been blacklisted. Please contact the system administrator.", error_message: "ChatLuna error occurred. Error code: %s. Contact developer for assistance.", middleware_error: "Error in {0}: {1}", chat_limit_exceeded: "Daily chat limit reached. Please try again in {0} minutes.", room: { random_switch: "No room specified. Switched to room {0}.", not_joined: "No room joined. Please join a room first.", not_in_room: "Not a member of this room. Please join room {0} first.", muted: "You are muted in room {0}.", unavailable: "Current room unavailable. Automatic repair in progress.", auto_switch: "User {0} switched to room {1}.", auto_create: "Room {1} created for user {0}.", auto_create_template: "Template clone room {1} created for user {0}.", room_name: "{0} room", template_clone_room_name: "{0} template clone room", config_changed: "Configuration updated for template room {0}." }, cooldown_wait_message: "Message rate limit reached. Please wait {0}s before sending another message." } };
58
58
  }
59
59
  });
60
60
 
@@ -72,9 +72,9 @@ __export(index_exports, {
72
72
  usage: () => usage
73
73
  });
74
74
  module.exports = __toCommonJS(index_exports);
75
- var import_koishi20 = require("koishi");
75
+ var import_koishi21 = require("koishi");
76
76
  var import_chat2 = require("koishi-plugin-chatluna/services/chat");
77
- var import_koishi21 = require("koishi-plugin-chatluna/utils/koishi");
77
+ var import_koishi22 = require("koishi-plugin-chatluna/utils/koishi");
78
78
  var import_logger9 = require("koishi-plugin-chatluna/utils/logger");
79
79
  var request = __toESM(require("koishi-plugin-chatluna/utils/request"), 1);
80
80
 
@@ -938,28 +938,38 @@ var ChatHubChatChain = class _ChatHubChatChain extends import_base.ChatLunaLLMCh
938
938
  chain;
939
939
  historyMemory;
940
940
  preset;
941
+ variableService;
941
942
  constructor({
942
943
  botName,
943
944
  historyMemory,
944
945
  preset,
945
- chain
946
+ chain,
947
+ variableService
946
948
  }) {
947
949
  super();
948
950
  this.botName = botName;
949
951
  this.historyMemory = historyMemory;
950
952
  this.preset = preset;
953
+ this.variableService = variableService;
951
954
  this.chain = chain;
952
955
  }
953
- static fromLLM(llm, { botName, historyMemory, preset }) {
956
+ static fromLLM(llm, {
957
+ botName,
958
+ historyMemory,
959
+ preset,
960
+ variableService
961
+ }) {
954
962
  const prompt = new import_prompt.ChatLunaChatPrompt({
955
963
  preset,
956
964
  tokenCounter: /* @__PURE__ */ __name((text) => llm.getNumTokens(text), "tokenCounter"),
957
- sendTokenLimit: llm.invocationParams().maxTokenLimit ?? llm.getModelMaxContextSize()
965
+ sendTokenLimit: llm.invocationParams().maxTokenLimit ?? llm.getModelMaxContextSize(),
966
+ variableService
958
967
  });
959
968
  const chain = new import_base.ChatLunaLLMChain({ llm, prompt });
960
969
  return new _ChatHubChatChain({
961
970
  botName,
962
971
  historyMemory,
972
+ variableService,
963
973
  preset,
964
974
  chain
965
975
  });
@@ -1020,6 +1030,7 @@ var ChatLunaPluginChain = class _ChatLunaPluginChain extends import_base2.ChatLu
1020
1030
  activeTools = [];
1021
1031
  tools;
1022
1032
  baseMessages = void 0;
1033
+ variableService;
1023
1034
  prompt;
1024
1035
  preset;
1025
1036
  agentMode;
@@ -1045,11 +1056,13 @@ var ChatLunaPluginChain = class _ChatLunaPluginChain extends import_base2.ChatLu
1045
1056
  historyMemory,
1046
1057
  preset,
1047
1058
  embeddings,
1048
- agentMode
1059
+ agentMode,
1060
+ variableService
1049
1061
  }) {
1050
1062
  const prompt = new import_prompt2.ChatLunaChatPrompt({
1051
1063
  preset,
1052
1064
  tokenCounter: /* @__PURE__ */ __name((text) => llm.getNumTokens(text), "tokenCounter"),
1065
+ variableService,
1053
1066
  sendTokenLimit: llm.invocationParams().maxTokenLimit ?? llm.getModelMaxContextSize()
1054
1067
  });
1055
1068
  return new _ChatLunaPluginChain({
@@ -1059,7 +1072,8 @@ var ChatLunaPluginChain = class _ChatLunaPluginChain extends import_base2.ChatLu
1059
1072
  agentMode,
1060
1073
  embeddings,
1061
1074
  tools,
1062
- preset
1075
+ preset,
1076
+ variableService
1063
1077
  });
1064
1078
  }
1065
1079
  async _createExecutor(llm, tools) {
@@ -1267,6 +1281,7 @@ async function defaultFactory(ctx, service) {
1267
1281
  { "zh-CN": "聊天模式", "en-US": "Chat mode" },
1268
1282
  async (params) => {
1269
1283
  return ChatHubChatChain.fromLLM(params.model, {
1284
+ variableService: ctx.chatluna.variable,
1270
1285
  botName: params.botName,
1271
1286
  preset: params.preset,
1272
1287
  historyMemory: params.historyMemory
@@ -1284,6 +1299,7 @@ async function defaultFactory(ctx, service) {
1284
1299
  params.model,
1285
1300
  getTools(service, (_) => true),
1286
1301
  {
1302
+ variableService: ctx.chatluna.variable,
1287
1303
  preset: params.preset,
1288
1304
  historyMemory: params.historyMemory,
1289
1305
  embeddings: params.embeddings,
@@ -2116,11 +2132,7 @@ function apply13(ctx, config, chain) {
2116
2132
  }
2117
2133
  const botId = session.bot.userId;
2118
2134
  if (config.allowAtReply) {
2119
- let appel = session.stripped.appel;
2120
- if (appel) {
2121
- return await checkReplyPermission();
2122
- }
2123
- appel = session.elements?.some(
2135
+ const appel = session.elements?.some(
2124
2136
  (element) => element.type === "at" && element.attrs?.["id"] === botId
2125
2137
  ) ?? false;
2126
2138
  if (appel) {
@@ -3989,7 +4001,6 @@ __name(renderMessage, "renderMessage");
3989
4001
 
3990
4002
  // src/middlewares/request_model.ts
3991
4003
  var import_koishi10 = require("koishi");
3992
- var import_prompt3 = require("koishi-plugin-chatluna/llm-core/prompt");
3993
4004
  var import_count_tokens3 = require("koishi-plugin-chatluna/llm-core/utils/count_tokens");
3994
4005
  var import_error6 = require("koishi-plugin-chatluna/utils/error");
3995
4006
  var import_logger5 = require("koishi-plugin-chatluna/utils/logger");
@@ -4131,7 +4142,7 @@ function apply43(ctx, config, chain) {
4131
4142
  room.preset
4132
4143
  );
4133
4144
  if (presetTemplate.formatUserPromptString != null) {
4134
- context.message = formatUserPromptString(
4145
+ context.message = await formatUserPromptString(
4135
4146
  config,
4136
4147
  presetTemplate,
4137
4148
  session,
@@ -4371,18 +4382,21 @@ function formatToolCall(tool, arg, log) {
4371
4382
  }`;
4372
4383
  }
4373
4384
  __name(formatToolCall, "formatToolCall");
4374
- function formatUserPromptString(config, presetTemplate, session, prompt, room) {
4375
- return (0, import_prompt3.formatPresetTemplateString)(presetTemplate.formatUserPromptString, {
4376
- sender_id: session.author?.user?.id ?? session.event?.user?.id ?? "0",
4377
- sender: (0, import_string.getNotEmptyString)(
4378
- session.author?.nick,
4379
- session.author?.name,
4380
- session.event.user?.name,
4381
- session.username
4382
- ),
4383
- prompt,
4384
- ...getSystemPromptVariables(session, config, room)
4385
- });
4385
+ async function formatUserPromptString(config, presetTemplate, session, prompt, room) {
4386
+ return await session.app.chatluna.variable.formatPresetTemplateString(
4387
+ presetTemplate.formatUserPromptString,
4388
+ {
4389
+ sender_id: session.author?.user?.id ?? session.event?.user?.id ?? "0",
4390
+ sender: (0, import_string.getNotEmptyString)(
4391
+ session.author?.nick,
4392
+ session.author?.name,
4393
+ session.event.user?.name,
4394
+ session.username
4395
+ ),
4396
+ prompt,
4397
+ ...getSystemPromptVariables(session, config, room)
4398
+ }
4399
+ );
4386
4400
  }
4387
4401
  __name(formatUserPromptString, "formatUserPromptString");
4388
4402
  async function sendMessage(context, text, config) {
@@ -6011,7 +6025,7 @@ var Config2 = import_koishi13.Schema.intersect([
6011
6025
  });
6012
6026
 
6013
6027
  // src/render.ts
6014
- var import_koishi19 = require("koishi");
6028
+ var import_koishi20 = require("koishi");
6015
6029
  var import_error7 = require("koishi-plugin-chatluna/utils/error");
6016
6030
 
6017
6031
  // src/renders/default.ts
@@ -6285,6 +6299,120 @@ function renderTokens2(tokens) {
6285
6299
  }
6286
6300
  __name(renderTokens2, "renderTokens");
6287
6301
 
6302
+ // src/renders/pure-text.ts
6303
+ var import_koishi_plugin_markdown2 = require("koishi-plugin-markdown");
6304
+ var import_koishi19 = require("koishi");
6305
+
6306
+ // src/utils/remove-markdown.ts
6307
+ function removeMarkdown(md, options = {}) {
6308
+ options.listUnicodeChar = Object.prototype.hasOwnProperty.call(
6309
+ options,
6310
+ "listUnicodeChar"
6311
+ ) ? options.listUnicodeChar : false;
6312
+ options.stripListLeaders = Object.prototype.hasOwnProperty.call(
6313
+ options,
6314
+ "stripListLeaders"
6315
+ ) ? options.stripListLeaders : true;
6316
+ options.gfm = Object.prototype.hasOwnProperty.call(options, "gfm") ? options.gfm : true;
6317
+ options.useImgAltText = Object.prototype.hasOwnProperty.call(
6318
+ options,
6319
+ "useImgAltText"
6320
+ ) ? options.useImgAltText : true;
6321
+ options.abbr = Object.prototype.hasOwnProperty.call(options, "abbr") ? options.abbr : false;
6322
+ options.replaceLinksWithURL = Object.prototype.hasOwnProperty.call(
6323
+ options,
6324
+ "replaceLinksWithURL"
6325
+ ) ? options.replaceLinksWithURL : false;
6326
+ options.htmlTagsToSkip = Object.prototype.hasOwnProperty.call(
6327
+ options,
6328
+ "htmlTagsToSkip"
6329
+ ) ? options.htmlTagsToSkip : [];
6330
+ options.throwError = Object.prototype.hasOwnProperty.call(
6331
+ options,
6332
+ "throwError"
6333
+ ) ? options.throwError : false;
6334
+ let output = md || "";
6335
+ output = output.replace(
6336
+ /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/gm,
6337
+ ""
6338
+ );
6339
+ try {
6340
+ if (options.stripListLeaders) {
6341
+ if (options.listUnicodeChar)
6342
+ output = output.replace(
6343
+ /^([\s\t]*)([\*\-\+]|\d+\.)\s+/gm,
6344
+ options.listUnicodeChar + " $1"
6345
+ );
6346
+ else
6347
+ output = output.replace(/^([\s\t]*)([\*\-\+]|\d+\.)\s+/gm, "$1");
6348
+ }
6349
+ if (options.gfm) {
6350
+ output = output.replace(/\n={2,}/g, "\n").replace(/~{3}.*\n/g, "").replace(/~~/g, "").replace(/```(?:.*)\n([\s\S]*?)```/g, (_, code) => code.trim());
6351
+ }
6352
+ if (options.abbr) {
6353
+ output = output.replace(/\*\[.*\]:.*\n/, "");
6354
+ }
6355
+ let htmlReplaceRegex = /<[^>]*>/g;
6356
+ if (options.htmlTagsToSkip && options.htmlTagsToSkip.length > 0) {
6357
+ const joinedHtmlTagsToSkip = options.htmlTagsToSkip.join("|");
6358
+ htmlReplaceRegex = new RegExp(
6359
+ `<(?!/?(${joinedHtmlTagsToSkip})(?=>|s[^>]*>))[^>]*>`,
6360
+ "g"
6361
+ );
6362
+ }
6363
+ output = output.replace(htmlReplaceRegex, "").replace(/^[=\-]{2,}\s*$/g, "").replace(/\[\^.+?\](\: .*?$)?/g, "").replace(/\s{0,2}\[.*?\]: .*?$/g, "").replace(
6364
+ /\!\[(.*?)\][\[\(].*?[\]\)]/g,
6365
+ options.useImgAltText ? "$1" : ""
6366
+ ).replace(
6367
+ /\[([\s\S]*?)\]\s*[\(\[].*?[\)\]]/g,
6368
+ options.replaceLinksWithURL ? "$2" : "$1"
6369
+ ).replace(/^(\n)?\s{0,3}>\s?/gm, "$1").replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, "").replace(
6370
+ /^(\n)?\s{0,}#{1,6}\s*( (.+))? +#+$|^(\n)?\s{0,}#{1,6}\s*( (.+))?$/gm,
6371
+ "$1$3$4$6"
6372
+ ).replace(/([\*]+)(\S)(.*?\S)??\1/g, "$2$3").replace(/(^|\W)([_]+)(\S)(.*?\S)??\2($|\W)/g, "$1$3$4$5").replace(/(`{3,})(.*?)\1/gm, "$2").replace(/`(.+?)`/g, "$1").replace(/~(.*?)~/g, "$1");
6373
+ } catch (e) {
6374
+ if (options.throwError) throw e;
6375
+ console.error("remove-markdown encountered error: %s", e);
6376
+ return md;
6377
+ }
6378
+ return output;
6379
+ }
6380
+ __name(removeMarkdown, "removeMarkdown");
6381
+
6382
+ // src/renders/pure-text.ts
6383
+ var import_he3 = __toESM(require("he"), 1);
6384
+ var PureTextRenderer = class extends Renderer {
6385
+ static {
6386
+ __name(this, "PureTextRenderer");
6387
+ }
6388
+ async render(message, options) {
6389
+ let transformed = [import_koishi19.h.text(message.content)];
6390
+ if (options.split) {
6391
+ transformed = transformed.flatMap((element) => {
6392
+ const content = element.attrs["content"];
6393
+ return content.split("\n\n\n").map((paragraph) => {
6394
+ return import_koishi19.h.text(paragraph);
6395
+ });
6396
+ });
6397
+ }
6398
+ transformed = transformed.map((element) => {
6399
+ const content = element.attrs["content"];
6400
+ return import_koishi19.h.text(stripMarkdown(content));
6401
+ });
6402
+ return {
6403
+ element: transformed
6404
+ };
6405
+ }
6406
+ schema = import_koishi19.Schema.const("pure-text").i18n({
6407
+ "zh-CN": "将回复渲染为纯文本(去除 markdown 格式)",
6408
+ "en-US": "Render as pure text (remove markdown format)"
6409
+ });
6410
+ };
6411
+ function stripMarkdown(source) {
6412
+ return removeMarkdown(source);
6413
+ }
6414
+ __name(stripMarkdown, "stripMarkdown");
6415
+
6288
6416
  // src/render.ts
6289
6417
  var DefaultRenderer = class {
6290
6418
  constructor(ctx, config) {
@@ -6306,6 +6434,7 @@ var DefaultRenderer = class {
6306
6434
  "koishi-element",
6307
6435
  () => new KoishiElementRenderer(ctx2)
6308
6436
  );
6437
+ this.addRenderer("pure-text", () => new PureTextRenderer(ctx2));
6309
6438
  });
6310
6439
  }
6311
6440
  static {
@@ -6322,7 +6451,7 @@ var DefaultRenderer = class {
6322
6451
  for (const additionalMessage of message.additionalReplyMessages) {
6323
6452
  const elements = await rawRenderer.render(additionalMessage, options).then((r) => r.element);
6324
6453
  result2.push({
6325
- element: (0, import_koishi19.h)(
6454
+ element: (0, import_koishi20.h)(
6326
6455
  "message",
6327
6456
  { forward: true },
6328
6457
  Array.isArray(elements) ? elements : [elements]
@@ -6354,7 +6483,7 @@ var DefaultRenderer = class {
6354
6483
  }
6355
6484
  this.ctx.schema.set(
6356
6485
  "output-mode",
6357
- import_koishi19.Schema.union(this._getAllRendererScheme())
6486
+ import_koishi20.Schema.union(this._getAllRendererScheme())
6358
6487
  );
6359
6488
  }
6360
6489
  _getAllRendererScheme() {
@@ -6411,7 +6540,7 @@ async function setupEntryPoint(ctx, config, disposables) {
6411
6540
  });
6412
6541
  setupMiddleware(ctx2);
6413
6542
  }, "entryPointPlugin");
6414
- const entryPointDisposable = (0, import_koishi21.forkScopeToDisposable)(
6543
+ const entryPointDisposable = (0, import_koishi22.forkScopeToDisposable)(
6415
6544
  ctx.plugin(
6416
6545
  {
6417
6546
  apply: entryPointPlugin,
@@ -6458,7 +6587,7 @@ function setupMiddleware(ctx) {
6458
6587
  __name(setupMiddleware, "setupMiddleware");
6459
6588
  function setupLogger(config) {
6460
6589
  if (config.isLog) {
6461
- (0, import_logger9.setLoggerLevel)(import_koishi20.Logger.DEBUG);
6590
+ (0, import_logger9.setLoggerLevel)(import_koishi21.Logger.DEBUG);
6462
6591
  }
6463
6592
  }
6464
6593
  __name(setupLogger, "setupLogger");
@@ -6483,8 +6612,8 @@ function setupProxy(ctx, config) {
6483
6612
  __name(setupProxy, "setupProxy");
6484
6613
  async function setupServices(ctx, config, disposables) {
6485
6614
  disposables.push(
6486
- (0, import_koishi21.forkScopeToDisposable)(ctx.plugin(import_chat2.ChatLunaService, config)),
6487
- (0, import_koishi21.forkScopeToDisposable)(ctx.plugin(ChatLunaAuthService, config))
6615
+ (0, import_koishi22.forkScopeToDisposable)(ctx.plugin(import_chat2.ChatLunaService, config)),
6616
+ (0, import_koishi22.forkScopeToDisposable)(ctx.plugin(ChatLunaAuthService, config))
6488
6617
  );
6489
6618
  }
6490
6619
  __name(setupServices, "setupServices");
@@ -6544,7 +6673,7 @@ async function setupAutoDelete(ctx, config) {
6544
6673
  await execute();
6545
6674
  ctx.setInterval(async () => {
6546
6675
  await execute();
6547
- }, import_koishi20.Time.minute * 5);
6676
+ }, import_koishi21.Time.minute * 5);
6548
6677
  }
6549
6678
  __name(setupAutoDelete, "setupAutoDelete");
6550
6679
  // Annotate the CommonJS export names for ESM import in node: