insoulforge
Health Pass
- License — License: AGPL-3.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 29 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
基于 C++23 与 Agent 架构的 OneBot 智能聊天机器人,支持群聊与私聊、长期记忆、工具扩展及 Web 管理后台
InSoulForge
一个基于 Agent 架构的智能 QQ 群聊机器人后端。
QQ 交流群:1097487360
本项目采用 OneBot 协议标准,不包含任何聊天平台协议的具体实现,也不提供任何连接聊天平台的方法。使用本项目时,您仅可使用合法合规的 OneBot 实现。使用本项目即表示您已阅读、理解并同意:由此产生的一切后果及风险均由您自行承担,本项目不承担任何责任。
✨ 特性
- Web 管理后台 - 可视化查看与配置
- 智能对话 - Jev 可选地优先判断群聊是否回复,低置信度时由 Router LLM 兜底,再由 Executor 生成回复
- 好感度 - 可以根据对话自动调整对某人的好感度
- 图片识别 - 可单独配置视觉模型识别图片与 GIF 动图,媒体哈希缓存避免重复请求
- 自定义角色 - 可设置 Bot 的提示词来定制人设和性格
- 稳定上下文快照 - 每条消息在完成媒体识别与记忆召回后生成冻结快照,保证 Router 和 Agent 使用一致的上下文
- 智能记忆 - 记忆自动提炼,记住群友的喜好、习惯、重要事件
- 长期记忆召回 - 长期记忆本地向量化(SQLite 存储 + 余弦相似度检索),自动召回相关记忆注入回复上下文,也可主动查询,可选配
Embedding 模型 - 适配 QQ 功能 - Bot 可自行收藏发送表情包、引用、@ 群友、撤回消息、拍一拍、禁言,并按规则将用户加入全局黑名单
- 多条回复与深度思考 - 一次对话可连续发送多条消息,耗时操作前可先发过程消息,复杂问题按需调用深度思考模型
- 自定义工具 - 支持 Lua 模组、Python 脚本和 HTTP 接口,可视化配置与脚本导入导出
- 定时任务 - 提供低耦合的定时任务功能,可定时发送消息以及与自定义工具组合使用
🚀 快速开始
全新 Ubuntu 系统可参考完整 Docker 部署教程,包含 Docker 安装、NapCat 登录、OneBot 配置、备份和更新步骤。
前置要求
本机器人需配合 OneBot 协议实现使用。可使用 NapCat 等 OneBot 实现(本项目仅将其作为示例,不对其合法性、合规性作任何保证;如您认为其不合法合规,请自行更换其他合法合规的实现)。
请确保所选 OneBot 实现合法合规,并启用 HTTP 或正向 WebSocket 服务之一。
InSoulForge 的 HTTP 服务端口为 7778,用于访问管理后台;使用 OneBot HTTP 模式时,也通过该端口接收消息上报。使用正向 WebSocket 模式时,InSoulForge 主动连接 OneBot 的 WebSocket 服务,无需配置 HTTP 上报地址。
方式一:Docker 部署(推荐)
镜像已发布至 Docker Hub 和 GitHub Container Registry,支持 amd64 / arm64 架构:
Docker Hub (推荐,可配置国内镜像加速)
docker pull dreamdonghao/insoulforge:latest
GitHub Container Registry (备用)
docker pull ghcr.io/dreamdonghao/insoulforge:latest
创建宿主机数据目录并启动容器:
sudo mkdir -p /opt/insoulforge/data
docker run -d --name insoulforge \
-p 7778:7778 \
-v /opt/insoulforge/data:/app/data \
dreamdonghao/insoulforge:latest
配置文件、数据库等数据保存在宿主机的
/opt/insoulforge/data目录中,不受执行命令所在目录影响。
首次启动会自动创建/opt/insoulforge/data/config.json,对应容器内的/app/data/config.json。
删除容器不会删除宿主机数据目录。更新前建议备份该目录,不要删除其中的数据。
更新镜像时,停止并删除旧容器,再挂载同一个宿主机数据目录创建新容器:
docker pull dreamdonghao/insoulforge:latest
docker stop insoulforge
docker rm insoulforge
docker run -d --name insoulforge \
-p 7778:7778 \
-v /opt/insoulforge/data:/app/data \
dreamdonghao/insoulforge:latest
如果旧容器使用了自定义网络、端口或其他启动参数,重建时也要保留这些参数。
已部署的用户,更新时应继续使用原来的数据挂载路径;不要直接改为上述示例路径,否则程序可能读取到一份空数据。
如果 napcat 也运行在 Docker 中,注意容器内的
127.0.0.1指向容器自身。启动后让两个容器加入同一个 docker
网络,然后用容器名互访(无需重建容器,connect 直接生效):docker network create bot-net docker network connect bot-net napcat # napcat 换成你的 napcat 容器名 docker network connect bot-net insoulforge使用 HTTP 时,在管理后台将 OneBot 的 HTTP 服务地址填为
http://napcat:3000(容器名 + napcat HTTP 端口),
并将 napcat 的上报地址填为http://insoulforge:7778/。使用正向 WebSocket 时,将 WebSocket 地址填为ws://napcat:3001;此方式不需要配置 HTTP 上报地址。
服务启动日志会输出本机可用地址的自动登录链接,例如:
管理后台自动登录链接(重启后失效): http://127.0.0.1:7778/index.html#token=<token>
直接打开链接即可登录;令牌位于 URL 片段中,不会发送到服务端,验证后会自动从地址栏清除。令牌仅保存在运行中的进程内,不会写入配置文件或数据库;每次重启服务都会生成新的令牌并使已有登录会话失效。在
Docker 默认桥接网络中,容器无法枚举宿主机局域网地址;可将链接中的主机替换为宿主机 LAN IP 后访问。
首次配置
在管理后台完成以下配置:
OneBot 配置 - 填写连接参数
- Access Token
- Bot QQ 号
- HTTP 或 WebSocket 传输方式及其服务地址
- Bot 名称
LLM 配置 - 配置模型 API
- Router、Executor、Executor 思考和 Image 使用兼容 OpenAI 的聊天接口;Embedding 使用向量接口
- 可选配置 Jev 决策接口,用于群聊优先路由
启用群聊 - 添加要启用的 QQ 群或用户
📖 使用指南
推荐使用web页面进行配置
群聊命令
在群中 @机器人 发送命令(私聊无需 @,直接发送即可):
| 命令 | 说明 | 权限 |
|---|---|---|
/help |
显示帮助 | 所有人 |
/status |
查看当前会话状态 | 所有人 |
/admins |
查看管理员列表 | 所有人 |
/about |
关于本项目 | 所有人 |
/enable [会话ID] |
启用会话(群聊传群号,私聊可不带参数) | 管理员 |
/disable [会话ID] |
禁用会话(私聊可不带参数) | 管理员 |
/groups |
查看已启用的会话列表 | 管理员 |
/addadmin <QQ号> |
添加管理员 | 管理员 |
/deladmin <QQ号> |
移除管理员 | 管理员 |
/blacklist |
查看全局 QQ 黑名单 | 管理员 |
/addblacklist <QQ号> |
将用户加入全局 QQ 黑名单 | 管理员 |
/delblacklist <QQ号> |
将用户移出全局 QQ 黑名单 | 管理员 |
/listemoji |
查看QQ收藏表情列表 | 管理员 |
/delemoji <名称> |
从QQ收藏表情中删除 | 管理员 |
/clearimagecache |
清除图片和 GIF 描述缓存 | 管理员 |
命令支持中文别名,如 /帮助、/状态、/启用。
除管理员命令和后台管理外,Executor 也能调用 add_to_blacklist:按工具提示先提醒用户;若其之后仍继续同类恶意行为,
再将其加入全局黑名单并告知结果。该提醒顺序目前由模型依据聊天记录判断,后端会校验目标是否出现在当前会话记录中,
并拒绝拉黑管理员和机器人自身。黑名单对所有会话生效。
⚙️ 配置说明
OneBot 配置
| 参数 | 说明 |
|---|---|
| Access Token | OneBot API 访问令牌 |
| Bot QQ 号 | 机器人自身的 QQ 号 |
| 传输方式 | HTTP 或正向 WebSocket,两者互斥 |
| HTTP 服务地址 | HTTP 模式下的 OneBot HTTP 服务地址 |
| WebSocket 服务地址 | WebSocket 模式下的 OneBot 正向连接地址 |
| Bot 名称 | 机器人在群聊中的名称 |
LLM 配置
各模型可分别配置:
| 模型 | 用途 | 建议配置 |
|---|---|---|
| Router | Jev 不可用或判定不确定时的回复决策 | 轻量聊天模型,低温度 |
| Jev | 群聊消息的优先回复决策(可选) | Decisions API |
| Executor | 生成回复 | 主力聊天模型 |
| Executor思考 | deep_think 工具使用的深度思考模型(可选) |
推理模型,如 DeepSeek |
| Image | 图片内容识别 | 多模态聊天模型 |
| Memory | 记忆提取、整理与好感度评分 | 聊天模型 |
| Embedding | 长期记忆向量化与检索(可选) | 向量模型 |
Jev 路由:在「LLM 配置 → Jev」填写 API Key、Base URL、Path 和 Model 后启用;默认地址为https://openrouter.ai/api/alpha、路径为 /decisions、模型为 ~typesafe/jev-latest。Jev 使用
Decisions API,并非 OpenAI 兼容的聊天接口。默认 API Key 为空,因此不启用 Jev,原有 Router 行为不变。
Jev 只处理通过硬规则的群聊消息;私聊、@机器人和系统任务沿用原有处理。Jev 返回的answers.action.confidence 低于「最低置信度」(默认 0.60)、缺失或无效,或判断结果为 unclear、请求失败时,
再调用 Router LLM。这里比较的是 confidence,不是 probabilities.reply;保存阈值后立即生效。
全局运行配置保存在 data/config.json,包括 LLM、OneBot、记忆与执行参数。文件不存在时程序会写入默认内容;缺失或类型错误的字段会在启动时自动修复。配置文件已被
Git 忽略,Docker 部署时通过 /opt/insoulforge/data:/app/data 挂载宿主机数据目录即可持久化。
config.json不保存管理后台访问令牌。请通过服务启动日志获取当前令牌,不要将其提交到仓库或发送给无关人员。
深度思考:Executor思考 不是全局思考模式开关,而是 deep_think 工具使用的模型配置。Executor
只有在遇到数学计算、多步推理、技术分析等复杂问题时才会按需调用,日常闲聊不会固定走推理模型。
执行参数
管理后台的“执行配置”页统一管理回复执行流程参数。目前提供“最大迭代轮数”,默认 8,范围为 1~100 的整数,
对应配置文件的 execution.maxToolRounds。每轮包含一次 Executor 模型请求及其工具调用处理,同轮多个工具只计一轮;
最终生成回复也占一轮。达到上限仍未产生回复时,记录错误并结束本次回复流程。
每轮模型请求末尾附带当前轮次和本轮之后的剩余轮数,帮助模型安排查询和收尾;该状态不写入聊天记录。
最后一轮只开放 reply、reply_with_quote、no_reply 回复工具,非回复工具即使被模型返回也不会执行。
上限设为 1 时,首轮就只允许回复工具。
助手上下文还保留按顺序排列的工具名、参数和处理状态。no_reply 也会保存一条内部执行记录,
不会发送到 QQ 或触发新回复;执行、发送失败会单独标记。工具历史供后续 Executor 参考,不保存完整工具结果。reply、reply_with_quote 不重复写入工具历史,已发送正文及引用目标仍保留在助手消息中。
保存后无需重启,对后续启动的回复流程生效;正在运行的流程继续使用启动时的上限。旧配置文件启动时自动补默认值,
手动写入的小数或越界值会恢复为 8 并写回文件。
记忆与上下文参数
- 近期上下文上限 - Router 与 Agent 实际可见的最近完整消息数,默认 100
- 总结触发条数 - 完整消息列表达到该数量时创建一批会话派生状态维护任务,默认 100
- 每批总结条数 - 本批真正参与记忆提取、并在记忆任务成功后删除的最旧消息数,默认 50,不能超过触发条数
- 总结补充上下文条数 - 紧随总结批次的只读消息数,仅帮助模型理解语境,不参与提取或删除,默认 10
- Memory 模型 maxTokens - 在「LLM 配置 → Memory」设置记忆提取与整理的输出 token 上限,默认 4000;旧配置会自动迁移
- Router 窗口触发/保留条数 - Router 使用的子窗口滑动参数,默认 20/10,用于平衡路由 prompt 长度与缓存命中
- 短期记忆上限 - 每次归类整理后保留的短期记忆条数上限,默认 15
- 长期记忆召回阈值 - 新记忆与已有长期记忆合并去重时的相似度阈值,默认 0.65
- 长期记忆注入阈值 - 消息预处理时被动召回并注入当前消息的相似度阈值,默认 0.45
记忆总结与好感度更新会作为独立的持久化任务异步执行。只有记忆任务成功后,对应的旧消息才会从完整消息列表移除;任务可在程序重启后恢复。
另有会话级后台耗时任务框架,目前仅提供用于明确测试的 demo_async_task,尚未接入生图。它与上述维护任务不同:同一会话一次只执行一个,完成后主动向原会话发送结果,重启后不会恢复。
提示词定制
在管理后台可修改 Router 与 Executor 的系统提示词,支持 {botName} 占位符自动替换。
🔧 高级功能
自定义工具
支持通过 Lua 脚本、Python 脚本或 HTTP 接口扩展机器人能力:
- 进入管理后台 → 自定义工具
- 点击"添加工具"或"导入"
- 填写工具名称、描述、参数定义和执行方式(Lua / Python / HTTP)
- 保存并启用
工具支持:
- 参数定义 - JSON Schema 格式,LLM 自动理解
- Python 脚本 - 通过
sys.argv[1]接收参数 JSON 文件路径,可自定义 Python 解释器路径 - Lua 脚本 - 在进程内运行,可调用受控的消息发送与会话后台任务接口,不必重新编译主程序
- HTTP 接口 - 配置请求地址、方法、参数模板
- 说明文档 - Markdown 格式,记录作者、用法、联系方式
- 导入导出 - JSON 文件格式,方便分享
内置工具配置文件
项目提供了一些常用工具配置,位于 agentTools/ 目录:
| 文件 | 功能 | 额外依赖 |
|---|---|---|
random.json |
随机数生成 | 无 |
get_time.json |
获取时间 | 无 |
get_weather.json |
天气查询 | 无 |
fetch_webpage.json |
读取动态网页 | PageWeave 服务 |
search_web.json |
读取 Bing 搜索结果页 | PageWeave 服务 |
导入方法:
- 管理后台 → 自定义工具 → 导入
- 上传 JSON 文件
网页读取和搜索工具仅使用 Python 标准库,默认连接 http://172.31.100.240:7779/extract;
可通过机器人进程的 PAGEWEAVE_URL 环境变量或脚本中的默认地址调整。缺少协议的网址自动补全 https://,
其他协议会被拒绝。Docker 运行镜像包含 python3,默认解释器配置即可使用;本地运行时需自行安装 Python 3。
已有同名工具需编辑更新或删除后重新导入,仓库文件不会自动覆盖数据库里的脚本。参数和运行说明见工具文档。
配置 Embedding(可选)
- 准备 OpenAI 兼容的 Embedding 服务(如硅基流动、OpenAI)
- 管理后台 → LLM配置 → Embedding,填写 API 配置
配置后,短期记忆迁移到长期记忆时自动向量化入库;每条消息入库时后台召回相关长期记忆并注入回复上下文,也可通过recall_memory 工具按余弦相似度主动查询。未配置时长期记忆自动停用,仅保留短期记忆。
图片与动图识别
图片识别会先下载媒体并按 SHA-256、视觉模型和提示词版本查询缓存。静态图片以 Base64 Data URL 提交视觉模型;GIF 会按播放时间抽取最多
16 帧并一次性提交,超过 16 帧时保留首尾帧并均匀取样。消息和 Agent 上下文只保留识别结果,不会包含图片 URL 或 Base64 内容;管理员可用/clearimagecache 清除描述缓存。
🛠️ 开发者指南
本项目使用 C++ 实现,Web 页面使用 Vue 3。
本地构建、架构和调试见 开发文档;提交 Issue 或 Pull Request
前请阅读 参与贡献指南。
贡献者
项目由 DreamDonghao 发起,感谢所有参与开发和改进的贡献者。
📄 许可证
本项目采用标准 GNU Affero General Public License v3.0(AGPL-3.0-only)开源。
详见 LICENSE。
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found