Skip to content

Repository files navigation

Aether

基于 Matrix 协议的 AI 助手机器人,支持 OpenAI 兼容 API,具备流式输出、人设系统、权限控制和 MCP 集成。

功能特性

核心能力

  • 流式输出 — 实时打字机效果,采用混合节流策略(时间 + 字符触发)
  • 多会话管理 — 私聊按用户隔离,群聊按房间隔离
  • Vision API — 图片理解,使用 Lanczos3 算法自动缩放
  • 广泛兼容 — 支持 OpenAI、DeepSeek、通义千问等兼容 API
  • MCP 集成 — 内置工具(WebFetch)及外部 MCP 服务器支持

人设系统

  • 4 个内置人设 — 毒舌程序员、赛博禅师、维基百科娘、猫娘助手
  • 自定义人设 — 支持创建、删除和管理自定义人设
  • 房间级配置 — 每个房间可独立设置人设
  • SQLite 持久化 — 所有人设和房间绑定永久存储

命令系统

  • 模块化架构 — 基于 Trait 的命令处理器,职责清晰
  • 三级权限 — 任何人、房间管理员、Bot 所有者
  • 子命令支持 — 层级命令如 !bot info!persona set
  • 易于扩展 — 实现 CommandHandler trait 即可添加新命令

运维功能

  • 运行时管理 — 无需重启即可修改名称、头像、加入房间
  • 会话持久化 — SQLite 存储会话历史和配置
  • 代理支持 — 支持 HTTP 和 SOCKS5 代理
  • 可配置日志 — 通过环境变量调整日志级别

快速开始

安装

git clone https://github.com/your-username/aether.git
cd aether
make build

配置

复制配置模板:

cp .env.example .env

编辑 .env 文件填写配置:

# Matrix 配置(必需)MATRIX_HOMESERVER=https://matrix.example.orgMATRIX_USERNAME=your_usernameMATRIX_PASSWORD=your_password# OpenAI API 配置(必需)OPENAI_API_KEY=your_api_keyOPENAI_BASE_URL=https://api.openai.com/v1OPENAI_MODEL=gpt-4o-mini# 可选配置BOT_OWNERS=@user1:matrix.org,@user2:matrix.orgMAX_HISTORY=10STREAMING_ENABLED=trueVISION_ENABLED=trueMCP_ENABLED=trueMCP_BUILTIN_TOOLS_ENABLED=true

运行

make run

MCP 配置详解

MCP (Model Context Protocol) 集成支持内置工具和外部 MCP 服务器。配置可以通过 .env 文件或 config.toml 文件进行。

环境变量配置

# 启用 MCP 功能MCP_ENABLED=true# 启用内置工具MCP_BUILTIN_TOOLS_ENABLED=true# Web Fetch 工具配置MCP_BUILTIN_WEB_FETCH_ENABLED=trueMCP_BUILTIN_WEB_FETCH_MAX_LENGTH=10000MCP_BUILTIN_WEB_FETCH_TIMEOUT=10

TOML 配置文件

创建 config.toml 文件以配置更复杂的 MCP 设置:

[mcp]
enabled = true
[mcp.builtin_tools]
enabled = true
[mcp.builtin_tools.web_fetch]
enabled = truemax_length = 10000timeout = 10
[[mcp.external_servers]]
name = "filesystem"transport = "stdio"command = "npx"args = ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/documents"]
enabled = true
[[mcp.external_servers]]
name = "database"transport = "stdio"command = "mcp-server-sqlite"args = ["--database", "/path/to/database.db"]
enabled = true

外部 MCP 服务器支持

当前支持的传输类型:

  • stdio: 通过标准输入输出通信(推荐)
  • HTTP/SSE: 通过 HTTP API 通信(需要 rmcp 1.1+,当前版本暂不支持)

注意:HTTP/SSE 传输在当前版本中不可用,因为 rmcp 1.0.0 不支持这些功能。

MCP 使用示例

基本工具调用

当 MCP 工具可用时,AI 会自动决定是否调用工具:

用户: ! 获取 https://example.com 的内容
AI: [自动调用 web_fetch 工具获取网页内容并返回摘要]

查看可用工具

使用 !mcp list 命令查看所有可用的 MCP 工具:

!mcp list

管理 MCP 服务器

使用 !mcp servers 查看外部 MCP 服务器连接状态:

!mcp servers

只有 Bot 所有者可以重载 MCP 配置:

!mcp reload

命令参考

聊天命令

命令说明权限
!<消息>与 AI 对话任何人
!reset清除当前会话历史任何人
!help显示帮助菜单任何人

人设命令

命令说明权限
!persona list列出所有人设任何人
!persona info <id>查看人设详情任何人
!persona set <id>设置房间人设房间管理员
!persona off关闭房间人设房间管理员
!persona create <id> "<名称>" "<提示词>"创建自定义人设房间管理员
!persona delete <id>删除自定义人设房间管理员

Bot 管理命令

命令说明权限
!bot info查看 Bot 基本信息任何人
!bot ping测试响应延迟任何人
!bot name <名称>修改显示名称Bot 所有者
!bot avatar <url>修改头像 URLBot 所有者
!bot join <room_id>加入指定房间Bot 所有者
!bot rooms列出已加入房间Bot 所有者
!leave离开当前房间房间管理员

赛博木鱼命令(彩蛋)

命令说明权限
!木鱼敲击木鱼,积累功德任何人
!功德查看个人功德信息任何人
!功德榜查看房间功德排行榜任何人
!称号 [名称]查看或装备称号任何人
!背包查看物品背包任何人

MCP 命令

命令说明权限
!mcp list列出可用的 MCP 工具任何人
!mcp servers查看 MCP 服务器状态任何人
!mcp reload重载 MCP 配置Bot 所有者

内置人设

ID名称描述
sarcastic-dev毒舌程序员20 年经验老程序员,对低质量代码愤怒,先吐槽再回答
cyber-zen赛博禅师用 TCP/IP 诠释佛法,简短而深邃
wiki-chan维基百科娘知识渊博、严谨客观、标注来源
neko-chan猫娘助手语气活泼可爱,句末加「喵~」

示例:自定义人设

# 创建自定义人设!persona create rust-mentor "Rust 导师""你是一位经验丰富的 Rust 开发者,帮助他人编写安全、地道的 Rust 代码。"# 设置到当前房间!persona set rust-mentor
# 查看详情!persona info rust-mentor
# 完成后删除!persona delete rust-mentor

权限模型

级别描述适用命令
任何人任何房间成员聊天、查看人设、ping
房间管理员房间管理员(power_level >= 50)或私聊用户设置人设、离开房间
Bot 所有者Bot 所有者(通过 BOT_OWNERS 配置)修改名称/头像、加入房间、重载 MCP

注意: 私聊房间默认赋予用户房间管理员权限。

配置参考

必需配置

配置项说明
MATRIX_HOMESERVERMatrix 服务器地址
MATRIX_USERNAMEMatrix 用户名
MATRIX_PASSWORDMatrix 密码
OPENAI_API_KEYOpenAI API 密钥

可选配置

配置项说明默认值
MATRIX_DEVICE_ID持久化设备 ID(避免重复登录)自动生成
DEVICE_DISPLAY_NAME设备显示名称"AI Bot"
STORE_PATHMatrix SDK 存储路径./store
OPENAI_BASE_URLAPI 基础地址https://api.openai.com/v1
OPENAI_MODEL模型名称gpt-4o-mini
SYSTEM_PROMPT全局系统提示词
BOT_COMMAND_PREFIX命令前缀!
BOT_OWNERSBot 所有者列表(逗号分隔)
DB_PATH数据库路径./data/aether.db
MAX_HISTORY最大对话轮数10
STREAMING_ENABLED启用流式输出true
STREAMING_MIN_INTERVAL_MS流式更新最小间隔(毫秒)1000
STREAMING_MIN_CHARS流式更新最小字符数50
VISION_ENABLED启用图片理解true
VISION_MODELVision 模型名称使用 OPENAI_MODEL
VISION_MAX_IMAGE_SIZE图片最大边长(像素)1024
PROXYHTTP/SOCKS5 代理 URL
LOG_LEVEL日志级别info
MCP_ENABLED启用 MCP 集成true
MCP_BUILTIN_TOOLS_ENABLED启用内置 MCP 工具true
PROXYHTTP/SOCKS5 代理 URL
LOG_LEVEL日志级别info
MCP_ENABLED启用 MCP 集成true
MCP_BUILTIN_TOOLS_ENABLED启用内置 MCP 工具true

架构设计

模块结构

src/
├── main.rs # 入口点
├── lib.rs # 库导出
├── bot.rs # Bot 初始化
├── config.rs # 配置管理(7 个配置组)
├── traits.rs # 核心 trait(AiServiceTrait)
├── ai_service.rs # OpenAI API 封装
├── conversation.rs # 会话管理
├── event_handler.rs # Matrix 事件处理
├── media.rs # 图片处理
├── command/ # 命令系统
│ ├── gateway.rs # 命令路由
│ ├── registry.rs # CommandHandler trait
│ ├── permission.rs # 权限模型
│ ├── parser.rs # 命令解析
│ └── context.rs # 执行上下文
├── modules/ # 功能模块
│ ├── admin/ # Bot 管理
│ ├── persona/ # 人设管理
│ ├── mcp/ # MCP 命令
│ └── muyu/ # 赛博木鱼
├── mcp/ # MCP 集成
│ ├── config.rs # MCP 配置
│ ├── tool_registry.rs # 工具注册表
│ ├── server_manager.rs# 服务器管理
│ ├── builtin/ # 内置工具
│ └── transport/ # 传输层
├── store/ # 数据持久化
│ ├── database.rs # SQLite + 迁移
│ └── persona_store.rs # 人设存储
└── ui/ # UI 模板
└── templates.rs # HTML 消息模板
tests/ # 集成测试
migrations/ # 数据库迁移

命令系统

命令系统采用基于 Trait 的架构:

#[async_trait]pubtraitCommandHandler:Send + Sync{fnname(&self) -> &str;fndescription(&self) -> &str;fnusage(&self) -> &str{""}fnpermission(&self) -> Permission{Permission::Anyone}asyncfnexecute(&self,ctx:&CommandContext<'_>) -> Result<()>;}

核心组件:

  • CommandRegistry — 管理所有命令处理器
  • CommandGateway — 路由消息到处理器
  • CommandContext — 封装房间、发送者、参数等上下文
  • Permission — 三级访问控制

数据流

Matrix 消息
│
▼
EventHandler(检查:私聊 / 前缀 / @提及)
│
▼
CommandGateway(解析命令名和参数)
│
▼
CommandRegistry.get(name)
│
▼
Permission.check()
│
▼
CommandHandler.execute(ctx)
│
▼
AiService / PersonaStore / Bot API
│
▼
Room.send() — 发送响应

流式输出机制

启用流式输出(STREAMING_ENABLED=true)时:

  1. 混合节流 — 满足以下任一条件即触发更新:

    • 时间:超过 STREAMING_MIN_INTERVAL_MS(默认 1000ms)
    • 字符:累积超过 STREAMING_MIN_CHARS(默认 50 字符)
  2. 消息更新流程

    • 首个片段:发送新消息
    • 后续片段:使用 Matrix 替换 API 编辑消息
    • 流结束:发送最终版本
  3. 自动保存 — 完整响应自动保存到会话历史

Vision 处理流程

图片处理工作流:

  1. 下载 — 通过 Matrix SDK 获取图片(支持缓存)
  2. 缩放 — Lanczos3 算法,保持宽高比,最大 VISION_MAX_IMAGE_SIZE
  3. 编码 — 转换为 base64 data URL(PNG 格式)
  4. 分析 — 发送至 Vision API 进行理解

人设系统设计

  • PersonaStore — 基于 SQLite 的 CRUD,使用 UPSERT 保证初始化幂等性
  • 房间绑定room_persona 表关联房间与人设
  • 自动重命名 — 设置人设时自动更新 Bot 显示名称
  • 内置人设 — 启动时初始化,不可删除

开发

make build # 编译 release 版本
make run # 运行 Bot
make test# 运行测试
make check # 快速检查(不生成二进制)
make fmt # 格式化代码
make lint # 运行 clippy
make fix # 自动修复并格式化
make clean # 清理构建产物

运行测试

# 运行所有测试
make test# 运行指定测试
cargo test ai_service
# 显示输出
cargo test -- --nocapture

技术栈

类别技术
Matrix SDKmatrix-rust-sdk
AI 客户端async-openai
异步运行时tokio
数据库rusqlite
图片处理image
HTTP 客户端reqwest
MCP SDKrmcp
错误处理anyhow, thiserror
异步 Traitasync-trait

数据库模式

人设表

CREATETABLEpersonas (
id TEXTPRIMARY KEY,
name TEXTNOT NULL,
system_prompt TEXTNOT NULL,
avatar_emoji TEXT,
is_builtin INTEGER DEFAULT 0,
created_by TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATETABLEroom_persona (
room_id TEXTPRIMARY KEY,
persona_id TEXTREFERENCES personas(id) ON DELETE CASCADE,
enabled INTEGER DEFAULT 1,
set_by TEXT,
set_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

聊天记录表

CREATETABLEchat_history (
id INTEGERPRIMARY KEY AUTOINCREMENT,
room_id TEXTNOT NULL,
role TEXTNOT NULLCHECK(role IN ('user', 'assistant', 'system')),
content TEXTNOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

许可证

MIT

About

一个基于 Matrix 协议的 AI 助手机器人,支持 OpenAI 兼容 API、流式输出和会话管理。

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages