v1.6.6版本
仓库:
Release v1.6.6 · xxynet/KiraAI
deepwiki:
部署开始
Release NapCat v4.14.13 · NapNeko/NapCatQQ



打开url 6099 NapCat WebUI


打开url 5267 KiraAI Admin Panel

这个要填






部署完毕
记忆部分是怎么做的
KiraAI 的记忆系统由 MemoryManager 实现,分为两类记忆:
- 会话记忆(chat_memory):按会话 ID 存储对话历史,用于上下文。
- 核心记忆(core_memory):全局持久知识,注入到每次提示中。
记忆以文件形式持久化在 data/memory/ 目录,并在消息处理时被读取和更新,同时通过 WebUI 提供管理接口。
记忆类型与存储
| 类型 | 存储文件 | 结构 | 用途 |
|---|---|---|---|
| 会话记忆 | data/memory/chat_memory.json |
{session_id: [chunk1, chunk2, ...]},每个 chunk 为消息列表 |
提供对话上下文 |
| 核心记忆 | data/memory/core.txt |
纯文本行列表 | 全局知识,注入提示词 |
- 会话记忆在
MemoryManager.__init__中加载,并在每次更新后自动保存为 JSON memory_manager.py:26-28 。 - 核心记忆在
get_core_memory()中逐行读取并格式化为带行号的字符串 memory_manager.py:99-106 。
关键操作
读取与写入
fetch_memory(session):展开会话的所有 chunk 为消息列表,用于构建 LLM 上下文 memory_manager.py:60-70 。update_memory(session, new_chunk):追加新 chunk,并根据max_memory_length滑动裁剪,然后保存文件 memory_manager.py:85-91 。write_memory(session, memory):直接覆写整个会话记忆(WebUI 使用) memory_manager.py:79-83 。
长度限制
max_memory_length来自配置(默认 10),在update_memory中用于裁剪最旧的 chunk memory_manager.py:19 memory_manager.py:88-89 。
与消息处理集成
在 MessageProcessor.handle_im_message 中:
- 获取会话记忆
session_memory = self.memory_manager.fetch_memory(sid)message_manager.py:169 。 - 获取核心记忆
core_memory = self.memory_manager.get_core_memory()message_manager.py:171 。 - 将两者传入
PromptManager生成提示(如get_agent_prompt),其中{core_memory}会被替换 agent.txt:33-35 。 - LLM 响应后,将新消息(含工具调用结果)作为
new_chunk更新到会话记忆 message_manager.py:215-220 。
WebUI 管理接口
- 列出所有会话:
GET /api/sessions,从memory_manager.chat_memory读取并统计消息数 app.py:1370-1392 。 - 获取单个会话记忆:
GET /api/sessions/{session_id},调用memory_manager.read_memory返回原始 chunk 结构 app.py:1399-1420 。 - 更新会话记忆:
PUT /api/sessions/{session_id},调用memory_manager.write_memory直接覆写 app.py:1427-1436 。
记忆流程图
Notes
- 会话记忆按 chunk 组织,每个 chunk 通常对应一次处理回合(含用户消息、工具调用、助手回复)。
- 核心记忆为纯文本,可手动编辑
data/memory/core.txt,重启后生效。 - WebUI 的会话管理直接操作内存中的
chat_memory并持久化,适合调试或清理。 - 记忆文件路径可在
MemoryManager初始化时自定义,默认为data/memory/chat_memory.json与data/memory/core.txtmemory_manager.py:16-17 。
Wiki pages you might want to explore:
表情调用是怎么做的


AI 通过 StickerManager 加载的 sticker.json(id→desc+path)建立映射,PromptManager 将可用 id 与描述注入系统提示,LLM 用 <sticker>id</sticker> 调用,MessageProcessor 再根据 id 从 sticker_dict 取路径并转为 base64 发送。WebUI 提供管理接口。
关键环节
1)映射来源:sticker.json
- 位置:
data/config/sticker.json,结构为{"sticker_id": {"desc": "...", "path": "filename"}}sticker_manager.py:11-12 。 - StickerManager 在初始化时加载到
self.sticker_dictsticker_manager.py:26-49 。
2)让 AI 知道可用 sticker:提示注入
- PromptManager._load_sticker_prompt 遍历 sticker_dict,生成
[id] desc文本并注入系统提示,定义<sticker>标签用法 prompt_manager.py:73-82 。 - 在
_load_format_prompt中将 sticker_prompt 填入格式提示,供 LLM 在 XML 中调用 prompt_manager.py:91-102 。
3)LLM 调用与解析
- LLM 输出
<sticker>1</sticker>,MessageProcessor._parse_xml_msg 从 sticker_dict 取 path,转为 base64,构造 MessageType.Sticker message_manager.py:304-311 。
4)发送
- QQAdapter 将 MessageType.Sticker 作为 base64 图片发送 qq.py:436-437 。
5)管理与自动注册
- WebUI 提供增删改查接口(/api/stickers),可上传图片并指定 id 与 desc app.py:1145-1172 。
- StickerManager.scan_and_register_sticker 定期扫描 data/sticker 目录,对未注册文件调用 LLM 生成描述并自动注册到 sticker.json sticker_manager.py:147-176 。
示例
{ "1": {"desc": "开心笑", "path": "happy.png"}, "2": {"desc": "无语", "path": "speechless.webp"} }
系统提示将包含:
[1] 开心笑
[2] 无语
LLM 可用 <sticker>1</sticker>,解析时找到 happy.png 并转 base64 发送。
Notes
- sticker_id 为字符串,通常为数字自增,也支持自定义字符串(需唯一) sticker_manager.py:121-134 。
- 若解析时 sticker_id 不存在,会报错并跳过发送 message_manager.py:310-311 。
- WebUI 的 Stickers 页面仅用于管理,不影响运行时映射逻辑 app.py:1094-1137 。
Wiki pages you might want to explore: