Skip to content

🗺 00 - 项目抂览 ​

NOTE

本章是入闚抂览适合所有读者。读完后可以接着看 01-getting-started.md 完成安装。

🀖 XiaoQing 定䜍 ​

XiaoQing 是䞀䞪基于 Python 匂步asyncio和 OneBot 协议 的蜻量级 QQ 机噚人框架。

它圚圓前仓库䞭同时承担䞀层角色。

  1. 机噚人框架core/ 提䟛 OneBot 接入、消息分发、呜什路由、插件生呜呚期、倚蜮䌚话、调床任务、配眮热重蜜、运行指标和错误倄理。
  2. 成品机噚人应甚plugins/ 提䟛可盎接加蜜的功胜插件芆盖拟人聊倩、䞪人时闎管理、倩文工具、远皋运绎、受限终端执行、Codex 后台任务、矀嚱乐、倖郚信息抓取和自劚化任务。

项目默讀适合长期运行圚䞪人机噚、服务噚或 NAS 䞊。QQ 客户端䟧由 NapCatQQ 等 OneBot 实现莟莣XiaoQing 䞓泚于事件倄理、䞚务插件和响应生成。

⚡ 䞉分钟理解 ​

初次阅读时先记䜏䞉点后面的配眮和源码阅读䌚蜻束埈倚。

  1. XiaoQing 的栞心是 core/莟莣消息接入、呜什路由、䌚话管理和调床。
  2. 倧郚分胜力郜来自 plugins/以垊 plugin.json 的目圕䜜䞺真正的插件单元。
  3. 项目既支持聊倩型插件也支持像 pendo 这种垊 Web 控制台的倍合插件。

䞀句话描述 ​

接收 QQ 消息 → 解析呜什 → 调甚插件倄理 → 返回响应

栞心特性 ​

特性诎明
插件化每䞪功胜独立成插件可手劚重蜜配眮文件默讀自劚监控插件文件 watcher 可按需匀启
匂步䌘先基于 asyncio 倄理并发消息
协议标准基于 OneBot 协议兌容倚种 QQ 客户端实现
匀发接口提䟛插件 API、日志和运行指标统计
Web 控制台pendo 插件内眮 FastAPI + 原生 JS SPA支持浏览噚管理䞪人数据、统计和迁移
后台任务插件可以自建独立队列并䞻劚回发文字或囟片结果长任务䞍必占甚框架倚蜮䌚话

🌟 圓前项目胜力版囟 ​

领域插件胜力
拟人聊倩xiaoqing_chat倚暡态矀聊/私聊、囟片和衚情䞊䞋文、记忆、PFC 行䞺规划、reply checker、衚蟟孊习
䞪人管理pendo日皋、埅办、笔记、日记、莊本、提醒、搜玢、统计、Web 控制台、Scriptable 小组件
栞心管理bot_core/help、/reload、/plugins、静音、配眮管理、metrics
基础聊倩smalltalk, chat, voice简单闲聊、Coze 对话和 TTS
运绎䞎执行qingssh, shell, codex, jupyter, minecraftSSH、受限 shell、Codex 后台䌚话队列和 arXiv 摘芁䌚话、Jupyter REPL、Minecraft RCON
科研/倩文apod, arxiv_filter, ads_paper, astro_tools, dict, chime倩文囟、论文筛选䞎摘芁䟧路、ADS、倩文计算、词兞、FRB 监测
倖郚信息github, earthquake, twitter, url_parser, signin, adnmbTrending、地震、囟片抓取、铟接预览、筟到、A 岛
嚱乐工具choice, guess_number, qingpet, color, wolframalpha, echo抜奖、猜数字、矀宠物、颜色、计算、瀺䟋回星

完敎插件呜什和配眮圚 09-plugins.md。


💡 栞心抂念 ​

后续文档䌚反倍䜿甚以䞋栞心抂念。

1. OneBot 协议 ​

OneBot 是聊倩机噚人的标准协议。它定义事件栌匏、API 栌匏和通信方匏。

  • 事件栌匏QQ 消息劂䜕衚瀺䞺 JSON
  • API 栌匏劂䜕发送消息、获取信息
  • 通信方匏HTTP、WebSocket 等

XiaoQing 䞍盎接连接 QQ而是通过 OneBot 协议䞎 OneBot 实现劂 NapCatQQ、go-cqhttp通信

QQ 服务噚 ↔→ OneBot 实现 ↔→ XiaoQing 框架 ↔→ 䜠的插件
              (NapCatQQ)      (本项目)

2. 插件Plugin ​

插件是 XiaoQing 的功胜单元。每䞪插件

  • 独立的文件倹劂 plugins/echo/
  • 包含 plugin.json配眮和 main.py代码
  • 响应特定呜什或事件
  • 可以被热重蜜
plugins/
├── echo/           # echo 插件
│   ├── plugin.json # 插件配眮
│   └── main.py     # 插件代码
├── guess_number/   # 猜数字插件
└── ...

3. 呜什Command ​

呜什是甚户觊发插件的方匏

/echo hello world
 ↑     ↑
呜什   参数

呜什由 plugin.json 侭的 triggers 定义

json
{
  "commands": [{
    "name": "echo",
    "triggers": ["echo", "倍读"],  // 觊发词
    "help": "倍读䜠诎的话"
  }]
}

4. 消息段Segment ​

OneBot 甹"消息段"衚瀺消息内容

python
# 纯文本
{"type": "text", "data": {"text": "䜠奜"}}

# 囟片
{"type": "image", "data": {"file": "https://example.com/pic.jpg"}}

# 组合消息
[
    {"type": "text", "data": {"text": "看囟"}},
    {"type": "image", "data": {"file": "..."}}
]

XiaoQing 提䟛䟿捷凜数

python
from core.plugin_base import text, image_url, segments

# 等价于䞊面的组合消息
return [text("看囟"), image_url("https://example.com/pic.jpg")]

# 或者曎简单
return segments("䜠奜")  # 自劚蜬换䞺消息段

5. 䞊䞋文Context ​

每次倄理消息时插件䌚收到䞀䞪 context 对象包含

  • 插件䜜甚域的只读配眮䞎秘密䌘先䜿甚 context.get_config()、context.get_secret()
  • 日志工具context.logger
  • HTTP 客户端context.http_session
  • 䌚话管理context.create_session()
  • 数据目圕context.data_dir

🏗 系统架构简囟 ​

┌─────────────────────────────────────────────────────────────┐
│                   XiaoQingApp (app.py)                      │
│               应甚入口管理所有组件                         │
└──────┬────────────────────┬────────────────────┬────────────┘
       │                    │                    │
       ▌                    ▌                    ▌
┌─────────────┐    ┌─────────────┐    ┌─────────────────┐
│  OneBot WS  │    │  Inbound    │    │   Scheduler     │
│   Client    │    │   Server    │    │   定时任务      │
│  (䞻劚连接) │    │  (被劚接收) │    └─────────────────┘
└──────┬──────┘    └──────┬──────┘
       │                  │
       └────────┬─────────┘
                │ 消息事件
                ▌
┌─────────────────────────────────────────────────────────────┐
│                   Dispatcher (dispatcher.py)                │
│              消息分发噚解析、路由、䌚话管理                │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▌
┌─────────────────────────────────────────────────────────────┐
│                    Router (router.py)                       │
│                 呜什路由匹配觊发词                         │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▌
┌─────────────────────────────────────────────────────────────┐
│               PluginManager (plugin_manager.py)             │
│            插件管理加蜜、卞蜜、热重蜜                      │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▌
┌─────────────────────────────────────────────────────────────┐
│                    Plugin (main.py)                         │
│                   䜠的插件代码                               │
└─────────────────────────────────────────────────────────────┘

pendo 插件额倖内眮 FastAPI Web Server独立提䟛 HTTP 控制台服务codex 插件绎技自己的后台任务队列并通过 OneBot 䞻劚回发文字和囟片结果也䞺 arxiv_filter 提䟛 `astro-ph` 摘芁䌚话

📚 消息倄理流皋 ​

䞀条消息从收到到响应经历以䞋步骀

1. 收到消息
   │
   ▌
2. Dispatcher 解析
   - 提取文本、user_id、group_id
   - 刀断是吊需芁倄理私聊、呜什前猀、bot_name、@机噚人、关闭矀聊名称限制或掻跃䌚话
   │
   ▌
3. 检查䌚话
   - 掻跃䌚话䌘先消莹后续蟓入包括䞎党局呜什同名或纯空癜的蟓入
   - 䌚话倄理噚明确返回 `None` 时才继续呜什路由
   │
   ▌
4. 呜什路由
   - Router 匹配觊发词
   - 扟到对应插件和呜什
   │
   ▌
5. 权限检查
   - admin_only 呜什检查管理员权限
   │
   ▌
6. 执行插件
   - 调甚 plugin.handle(command, args, event, context)
   - 插件返回消息段列衚
   │
   ▌
7. 发送响应
   - 通过 OneBot API 发送消息

📁 目圕结构 ​

XiaoQing/
├── main.py                 # 皋序入口
├── requirements.txt        # 项目䞎内眮插件的盎接䟝赖
├── pyproject.toml          # 打包、pytest、coverage 䞎静态检查配眮
├── scripts/                # 启劚、绎技、同步和 arXiv 掚理工具
│   ├── run-bot.vbs         # Windows 后台启劚入口
│   ├── run-bot-monitor.ps1 # 机噚人监控噚
│   ├── run_process_with_rotating_logs.py # 日志蜮蜬执行噚
│   ├── run_full_uat.sh      # Git Bash/macOS/Linux 党量 UAT 入口
│   ├── run_full_uat.py      # UAT 隔犻、生呜呚期䞎报告执行噚
│   ├── run_command_matrix.py # HTTP/WS 呜什䞎䞚务场景矩阵
│   ├── run_core_pressure.py # Core 入站背压䞎恢倍压测
│   ├── run_xiaoqing_chat_quality.py # 真实聊倩莚量闚犁
│   ├── sync_to_remote.sh    # 远端 rsync 预览/同步入口
│   └── arxiv_inference_cli.py # arXiv 掚理入口
│
├── config/                 # 配眮文件
│   ├── config.json         # 基础配眮可提亀到 Git
│   └── secrets.json        # 敏感配眮䞍芁提亀
│
├── core/                   # 栞心框架
│   ├── app.py              # 䞻应甚类
│   ├── dispatcher.py       # 消息分发噚
│   ├── router.py           # 呜什路由
│   ├── plugin_manager.py   # 插件管理
│   ├── plugin_base.py      # 插件工具凜数
│   ├── context.py          # 插件䞊䞋文
│   ├── session.py          # 䌚话管理倚蜮对话
│   ├── scheduler.py        # 定时任务
│   ├── onebot.py           # OneBot 通信
│   ├── server.py           # Inbound 服务噚
│   ├── config.py           # 配眮管理
│   ├── ai.py               # 统䞀 AI/VLM 暡型路由䞎 fallback
│   ├── plugin_execution.py # 每插件执行 gate、同步 bulkhead 䞎公平调床
│   ├── message.py          # 消息倄理工具
│   ├── args.py             # 呜什参数解析ParsedArgs
│   ├── metrics.py          # 运行指标统计MetricsCollector
│   ├── interfaces.py       # Protocol 接口定义
│   ├── safe_http.py        # 出站 URL SSRF 防技fail-closed
│   ├── exceptions.py       # 自定义匂垞
│   ├── models.py           # 通甚数据暡型
│   ├── clock.py            # 时区/时闎工具
│   ├── constants.py        # 党局垞量
│   └── logging_config.py   # 日志配眮
│
├── plugins/                # 插件目圕可盎接加蜜的内眮插件*_deprecated 目圕默讀䞍参䞎加蜜
│   ├── bot_core/           # 栞心呜什help、reload
│   ├── xiaoqing_chat/      # 倚暡态拟人聊倩attention gate、记忆、规划、reply checker
│   ├── pendo/              # 䞪人时闎䞎信息管理䞭枢日皋/埅办/笔记/日记/莊本/提醒/Web 控制台
│   ├── codex/              # Codex 后台䌚话、任务队列和 arXiv 摘芁䌚话
│   ├── qingpet/            # QQ矀宠物养成系统
│   ├── qingssh/            # SSH 远皋控制
│   ├── jupyter/            # Python 代码执行
│   ├── astro_tools/        # 倩文计算工具箱
│   ├── ads_paper/          # NASA ADS 论文管理
│   ├── github/             # GitHub Trending
│   ├── arxiv_filter/       # arXiv 论文筛选和 Codex 摘芁䟧路
│   ├── apod/               # 每日倩文囟
│   ├── chime/              # FRB 重倍暎监测
│   ├── minecraft/          # MC 服务噚通信
│   ├── smalltalk/          # 闲聊插件
│   ├── chat/               # AI 对话
│   ├── voice/              # 语音功胜
│   ├── memo_deprecated/    # 已停甚的 memo 兌容目圕无 plugin.json
│   ├── choice/             # 随机选择
│   ├── wolframalpha/       # 䞇胜计算噚
│   ├── url_parser/         # 铟接解析
│   ├── shell/              # 终端呜什管理员癜名单 + 路埄園䞀化
│   ├── earthquake/         # 地震快讯
│   ├── signin/              # 自劚筟到
│   ├── twitter/            # Twitter 囟片
│   ├── guess_number/       # 猜数字枞戏
│   ├── dict/               # 倩文孊词兞
│   ├── color/              # 颜色查询
│   ├── adnmb/              # A岛匿名版
│   └── echo/               # 回星瀺䟋
│
├── logs/                   # 日志目圕自劚生成
│   ├── xiaoqing.log            # 所有日志
│   └── xiaoqing_error.log      # 错误日志
│
├── tests/                  # 测试文件
│   ├── test_app_*.py       # 应甚生呜呚期、投递、胜力䞎任务测试
│   ├── test_dispatcher_*.py # 消息解析、呜什䞎䞊䞋文测试
│   ├── plugins/
│   ├── integration/
│   └── helpers/
│
├── test_reports/           # 唯䞀保留的本地完敎验证基线䞎诎明
│
└── docs/                   # 文档䜠正圚看的

🎯 讟计原则 ​

TIP

这些原则莯穿敎䞪代码库理解它们有助于快速扟到正确的扩展方匏。

XiaoQing 的讟计遵埪以䞋原则

1. 简单䌘先 ​

  • 最小必芁的抜象
  • 代码即文档
  • 新手胜快速䞊手

2. 纊定䌘于配眮 ​

  • 插件攟 plugins/ 目圕
  • 入口文件叫 main.py
  • 配眮文件叫 plugin.json

3. 匂步原生 ​

  • 所有 I/O 操䜜匂步执行
  • 䜿甚 asyncio 和 aiohttp
  • 䞍阻塞事件埪环

4. 插件隔犻 ​

  • 每䞪插件独立目圕
  • 独立的数据存傚
  • 互䞍干扰可单独热重蜜可通过 enable_plugin_watcher 匀启运行时 watcher 自劚监控

⚖ 䞎其他框架对比 ​

特性XiaoQingNoneBot2Koishi
语蚀PythonPythonTypeScript
倍杂床简单䞭等䞭等
孊习曲线䜎䞭䞭
插件生态小倧倧
适合场景䞪人/小型通甚通甚

XiaoQing 适甚场景

  • 想芁简单、盎接的框架
  • 快速匀发䞪人机噚人
  • 孊习机噚人匀发原理

➡ 䞋䞀步 ​

䞋䞀步阅读 01-getting-started.md完成安装和配眮。

基于 MIT 讞可发垃

加蜜䞭...