This commit is contained in:
Windpicker-owo
2025-11-02 11:48:47 +08:00
4 changed files with 37 additions and 33 deletions

View File

@@ -80,9 +80,8 @@
- 🔄 **数据库切换** - 支持 SQLite 与 MySQL 自由切换,采用 SQLAlchemy 2.0 重新构建
- 🛡️ **反注入集成** - 内置一整套回复前注入过滤系统,为人格保驾护航
- 🎥 **视频分析** - 支持多种视频识别模式,拓展原版视觉
- 😴 **苏醒系统** - 能够睡觉、失眠、被吵醒,更具乐趣
- 📅 **日程系统** - 让墨狐规划每一天
- 🧠 **拓展记忆系统** - 支持瞬时记忆等多种记忆
- 📅 **日程系统** - 让MoFox规划每一天
- 🧠 **拓展记忆系统** - 支持瞬时记忆和长期记忆等多种记忆方式
- 🎪 **完善的 Event** - 支持动态事件注册和处理器订阅,并实现了聚合结果管理
- 🔍 **内嵌魔改插件** - 内置联网搜索等诸多功能,等你来探索
- 🔌 **MCP 协议支持** - 集成 Model Context Protocol支持外部工具服务器连接仅 Streamable HTTP
@@ -103,7 +102,7 @@
| 项目 | 要求 |
| ------------ | ---------------------------------------- |
| 🖥️ 操作系统 | Windows 10/11、macOS 10.14+、Linux (Ubuntu 18.04+) |
| 🐍 Python 版本 | Python 3.10 或更高版本 |
| 🐍 Python 版本 | Python 3.11 或更高版本 |
| 💾 内存 | 建议 ≥ 4GB 可用内存 |
| 💿 存储空间 | 建议 ≥ 2GB 可用空间 |

View File

@@ -240,6 +240,8 @@ class ActionModifier:
action_instance = cast(BaseAction, action_instance)
# 设置必要的属性
action_instance.log_prefix = self.log_prefix
# 强制注入 chat_content 以供 go_activate 内部的辅助函数使用
setattr(action_instance, "_activation_chat_content", chat_content)
# 调用 go_activate 方法
task = action_instance.go_activate(
llm_judge_model=self.llm_judge

View File

@@ -71,11 +71,12 @@ def init_prompt():
不要复读你前面发过的内容,意思相近也不行。
不要浮夸,不要夸张修辞,平淡且不要输出多余内容(包括前后缀冒号和引号括号表情包at或 @等 ),只输出一条回复就好。
**【重要】不要在回复中输出任何格式化标记**
- 不要输出类似 [表情包xxx]、[图片xxx]、[回复<xxx>xxx] 这样的格式
- 如果想表达笑的情绪,直接说"哈哈""笑死"等,不要说"[表情包:笑哭]"
- 如果想提到某人,直接说""、或者他的名字,不要说"[回复<某人>]"
- 说什么就直接输出什么,不要加任何格式化标记
**【!!!绝对禁止!!!】在回复中输出任何格式化标记**
- **核心原则**: 你的回复**只能**包含纯粹的口语化文本。任何看起来像程序指令、系统提示或格式标签的内容都**绝对不允许**出现在你的回复里。
- **禁止模仿系统消息**: 绝对禁止输出任何类似 `[回复<xxx>xxx]`、`[表情包xxx]`、`[图片xxx]` 的格式。这些都是系统用于展示消息的方式,不是你应该说的话。
- **禁止模仿动作指令**: 绝对禁止输出 `[戳了戳]` 或 `[poke]`。这类互动由名为 `poke_user` 的特殊动作处理,不是文本消息。
- **正确提及用户**: 如果想提到某人,直接说“你”或他/她的名字,绝对禁止使用 `[回复<某人>]` 或 `@某人` 的格式。
- **正确表达情绪**: 如果想表达笑的情绪,直接说“哈哈”、“嘻嘻”等,绝对禁止使用 `[表情包:笑哭]` 这样的文字。
*你叫{bot_name},也有人叫你{bot_nickname}*
@@ -144,11 +145,12 @@ def init_prompt():
请注意不要输出多余内容(包括前后缀冒号和引号at或 @等 )。只输出回复内容。
**【重要】不要在回复中输出任何格式化标记**
- 不要输出类似 [表情包xxx]、[图片xxx]、[回复<xxx>xxx] 这样的格式
- 如果想表达笑的情绪,直接说"哈哈""笑死"等,不要说"[表情包:笑哭]"
- 如果想提到某人,直接说"""",不要说"[回复<某人>]"
- 说什么就直接输出什么,不要加任何标记或括号
**【!!!绝对禁止!!!】在回复中输出任何格式化标记**
- **核心原则**: 你的回复**只能**包含纯粹的口语化文本。任何看起来像程序指令、系统提示或格式标签的内容都**绝对不允许**出现在你的回复里。
- **禁止模仿系统消息**: 绝对禁止输出任何类似 `[回复<xxx>xxx]`、`[表情包xxx]`、`[图片xxx]` 的格式。这些都是系统用于展示消息的方式,不是你应该说的话。
- **禁止模仿动作指令**: 绝对禁止输出 `[戳了戳]` 或 `[poke]`。这类互动由名为 `poke_user` 的特殊动作处理,不是文本消息。
- **正确提及用户**: 如果想提到某人,直接说“你”或他/她的名字,绝对禁止使用 `[回复<某人>]` 或 `@某人` 的格式。
- **正确表达情绪**: 如果想表达笑的情绪,直接说“哈哈”、“嘻嘻”等,绝对禁止使用 `[表情包:笑哭]` 这样的文字。
{moderation_prompt}
@@ -216,11 +218,12 @@ If you need to use the search tool, please directly call the function "lpmm_sear
{keywords_reaction_prompt}
请注意不要输出多余内容(包括前后缀冒号和引号at或 @等 )。只输出回复内容。
**【重要】不要在回复中输出任何格式化标记**
- 不要输出类似 [表情包xxx]、[图片xxx]、[回复<xxx>xxx] 这样的格式
- 如果想表达笑的情绪,直接说"哈哈""笑死"等,不要说"[表情包:笑哭]"
- 如果想提到某人,直接说"""",不要说"[回复<某人>]"
- 说什么就直接输出什么,不要加任何标记或括号
**【!!!绝对禁止!!!】在回复中输出任何格式化标记**
- **核心原则**: 你的回复**只能**包含纯粹的口语化文本。任何看起来像程序指令、系统提示或格式标签的内容都**绝对不允许**出现在你的回复里。
- **禁止模仿系统消息**: 绝对禁止输出任何类似 `[回复<xxx>xxx]`、`[表情包xxx]`、`[图片xxx]` 的格式。这些都是系统用于展示消息的方式,不是你应该说的话。
- **禁止模仿动作指令**: 绝对禁止输出 `[戳了戳]` 或 `[poke]`。这类互动由名为 `poke_user` 的特殊动作处理,不是文本消息。
- **正确提及用户**: 如果想提到某人,直接说“你”或他/她的名字,绝对禁止使用 `[回复<某人>]` 或 `@某人` 的格式。
- **正确表达情绪**: 如果想表达笑的情绪,直接说“哈哈”、“嘻嘻”等,绝对禁止使用 `[表情包:笑哭]` 这样的文字。
{moderation_prompt}
你的核心任务是针对 {reply_target_block} 中提到的内容,{relation_info_block}生成一段紧密相关且能推动对话的回复。你的回复应该:
@@ -1266,7 +1269,7 @@ class DefaultReplyer:
# 构建action描述 (如果启用planner)
action_descriptions = ""
if available_actions:
action_descriptions = "你有以下的动作能力,但执行这些动作不由你决定,由另外一个模型同步决定,因此你只需要知道有如下能力即可:\n"
action_descriptions = "以下是系统中可用的动作列表。**【重要】**这些动作将由一个独立的决策模型决定是否执行,**并非你的职责**。你只需要了解这些能力的存在,以便更好地理解对话情景,**严禁**在你的回复中模仿、调用或提及这些动作本身。\n"
for action_name, action_info in available_actions.items():
action_description = action_info.description
action_descriptions += f"- {action_name}: {action_description}\n"
@@ -1976,7 +1979,7 @@ class DefaultReplyer:
return f"你与{sender}是普通朋友关系。"
async def _store_chat_memory_async(self, reply_to: str, reply_message: dict[str, Any] | None = None):
async def _store_chat_memory_async(self, reply_to: str, reply_message: DatabaseMessages | dict[str, Any] | None = None):
"""
异步存储聊天记忆从build_memory_block迁移而来

View File

@@ -38,17 +38,6 @@ class PermissionCommand(PlusCommand):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
permission_nodes: ClassVar[list[PermissionNodeField]] = [
PermissionNodeField(
node_name="manage",
description="权限管理:可以授权和撤销其他用户的权限",
),
PermissionNodeField(
node_name="view",
description="权限查看:可以查看权限节点和用户权限信息",
),
]
async def execute(self, args: CommandArgs) -> tuple[bool, str | None, bool]:
"""执行权限管理命令"""
if args.is_empty:
@@ -57,7 +46,7 @@ class PermissionCommand(PlusCommand):
subcommand = args.get_first.lower()
remaining_args = args.get_args()[1:] # 获取除第一个参数外的所有参数
chat_stream = self.message.chat_stream
chat_stream = self.message.chat_info.stream_id
if subcommand in ["grant", "授权", "give"]:
await self._grant_permission(chat_stream, remaining_args)
@@ -396,3 +385,14 @@ class PermissionManagerPlugin(BasePlugin):
def get_plugin_components(self) -> list[tuple[PlusCommandInfo, type[PlusCommand]]]:
"""返回插件的PlusCommand组件"""
return [(PermissionCommand.get_plus_command_info(), PermissionCommand)]
permission_nodes: ClassVar[list[PermissionNodeField]] = [
PermissionNodeField(
node_name="manage",
description="权限管理:可以授权和撤销其他用户的权限",
),
PermissionNodeField(
node_name="view",
description="权限查看:可以查看权限节点和用户权限信息",
),
]