以迷迭香(Rosmontis)为核心设定的 QQ 群聊机器人,基于 NoneBot2 框架和 OneBotv11 协议开发,支持 AI 对话、B站直播推送、互动游戏等多种功能
- 支持 Function Calling,可调用自定义函数
- 群组独立的对话历史管理
- 艾特机器人或戳一戳触发对话
- 主动清除历史记录功能
- 订阅指定 UP 主的直播状态
- 开播自动推送封面、标题和直播间链接
- 支持多群订阅和多 UP 主监控
- 俄罗斯轮盘小游戏
- 惩罚机制为禁言
- 可配置哑火概率
等...
- Python >= 3.9, < 4.0
- OneBot V11 协议端(如 NapCat 等)
1.克隆项目
git clone https://github.com/paoka1/rmts_bot
cd rmts_bot2.安装依赖
该命令只安装运行时依赖,开发环境依赖安装命令见下文
pip install -e .3.配置环境变量
详见.env文件,根据实际情况修改配置,主要配置项:
AI 对话相关
BASE_URL=https://api.deepseek.com # OpenAI API 兼容端点
MODEL_NAME=deepseek-chat # 模型名称
API_KEY=sk-xxx # API 密钥
MAX_HISTORY_LENGTH=80 # 最大历史消息长度功能开关与群组配置
# 问候功能可用群组,多个用逗号分隔
GREET_AVAILABLE_GROUPS=123456,789012
# 清除历史功能可用群组
CLEAR_HISTORY_AVAILABLE_GROUPS=123456,789012
# 轮盘游戏可用群组
ROULETTE_AVAILABLE_GROUPS=123456,789012
# B站直播订阅配置,JSON 格式:{"群号": ["UP主UID"]}
LIVE_SUBSCRIPTIONS={"123456": ["123456789","987654321"]}OneBot 连接配置
在 .env 中配置 OneBot 连接信息:
HOST=127.0.0.1 # 按实际填写
PORT=8080 # 按实际填写
ONEBOT_ACCESS_TOKEN= # 与协议端保持一致4.运行机器人
进入 Bot 项目目录,运行:
nb runrmts/
├── plugins/ # 插件目录
│ ├── bilibili/ # B站直播推送
│ ├── chat/ # AI 对话
│ ├── greet/ # 问候功能
│ ├── roulette/ # 轮盘游戏
│ └── weishu/ # 卫戍协议
├── resources/ # 资源文件
│ └── images/ # 图片资源
└── utils/ # 通用工具
├── action.py # 消息发送等操作
├── config.py # 配置工具
├── info.py # 信息获取
└── rule.py # 自定义规则
1.在 rmts/plugins/ 下创建新目录
mkdir rmts/plugins/your_plugin2.创建 __init__.py 并编写插件逻辑
from nonebot import on_message
from nonebot.adapters.onebot.v11 import MessageEvent
# 创建消息监听器,监听所有消息
hello_matcher = on_message()
@hello_matcher.handle()
async def handle_hello(event: MessageEvent):
"""
收到消息后判断内容是否包含 'hello',如果是就回复 'world'
"""
text = event.get_plaintext().lower()
if "hello" in text:
await hello_matcher.finish("world")3.NoneBot2 会自动加载 rmts/plugins/ 下的所有插件
Function Calling 允许 AI 调用预定义的函数来执行特定操作
1.在 rmts/plugins/chat/functions/action/、info/ 等目录下编写辅助模块,编写的模块在 __init__.py 中调用,如果实现的功能较为简单,可以直接在 __init__.py 编写逻辑
其中 Bot 和外界的动作交互应在 action 中编写,获取信息应在 info 中编写,以此类推,如果需要实现不同于两者的功能,可以创建独立的文件夹,如 rmts/plugins/chat/functions/xxx/
2.在选择的目录下注册函数
from rmts.plugins.chat.function_calling import FunctionDescription, function_container
# 创建函数描述
func_desc = FunctionDescription(name="function_name", description="函数功能描述")
# 添加参数(AI 提供)
func_desc.add_param(name="param1", description="参数描述", param_type="string", required=True)
func_desc.add_enum_param(name="param2", description="选择参数", enum_values=["选项1", "选项2"], required=True)
func_desc.add_list_param(name="param3", description="列表参数", item_type="integer", required=False)
func_desc.add_dict_param(name="param4", description="字典参数", value_type="string", required=False)
# 添加注入参数(系统自动提供,AI 无需传递)
func_desc.add_injection_param(name="group_id", description="群组ID")
# 使用装饰器注册函数
@function_container.function_calling(func_desc)
async def function_name(param1: str, param2: str, param3: list, param4: dict, group_id: int) -> str:
# 函数实现
return "执行结果"可用的参数添加方法:
add_param: 基本类型参数(string、number、integer、boolean)add_enum_param: 枚举参数(从预定义选项中选择)add_list_param: 列表参数(可指定元素类型)add_dict_param: 字典参数(可指定值类型)add_injection_param: 注入参数(系统自动提供,如group_id、user_id)
Function Calling 函数应拥有一个 str 类型的返回值,对参数的数量没有要求
3.系统会自动扫描并注册,AI 即可调用该函数
- 找到对应插件目录,如
rmts/plugins/bilibili/ - 修改相关代码文件
- 如需新增配置项,在插件的
config.py中添加字段 - 在
.env文件中添加对应的环境变量
项目配置了代码检查工具:
# 安装开发依赖
pip install -e ".[dev]"
# 使用 ruff 格式化代码
ruff format .
# 使用 pyright 检查类型
pyright如果你没有配置 NapCat 等协议端,可以使用 matcha 模拟 QQ 进行测试,或者使用 Console 适配器
1.Fork 本仓库
2.创建特性分支
git checkout -b feature/your-feature3.提交更改
git add .
git commit -m "描述你的更改"4.推送到你的仓库
git push origin feature/your-feature5.在 GitHub 上创建 Pull Request,描述你的更改内容
本项目采用 LICENSE 文件中指定的许可证