一个支持 Telegram 和 QQ 的高扩展性 AI 机器人,集成 MCP 工具调用能力和智能对话历史管理。
- 多平台支持:同时支持 Telegram 和 QQ(群聊 @Bot、私聊)
- AI 对话:支持与大模型对话(兼容 OpenAI 接口,如通义千问、GPT 等)
- MCP 工具集成:支持 MCP 协议,可调用搜索、新闻等外部工具
- 对话历史管理:基于 SQLite 的持久化对话历史,支持用户隔离
- 上下文窗口配置:可调整对话上下文大小(1-100 条消息)
- 个性化配置:用户可自定义 API Key、模型、提示词和上下文窗口
- 女朋友模式:为特定用户配置定制化的温柔提示词 💕
- 插件化设计:轻松扩展新功能
- 本地持久化:用户设置和对话历史保存在本地
cp config.yaml.example config.yaml编辑 config.yaml:
bot:
token: "你的_TELEGRAM_BOT_TOKEN"
qq_app_id: "QQ机器人AppID"
qq_secret: "QQ机器人Secret"
log_level: "info"
ai:
provider: "qwen"
base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
api_key: "你的API_KEY"
model: "qwen-plus"
default_prompt: "你是一个得力的助手。"
context_window: 10 # 对话上下文窗口大小,默认 10 条历史消息
# 访问控制
allowed_telegram:
- "123456789"
allowed_qq:
- "用户OpenID"
# 代理配置
proxy:
url: "http://127.0.0.1:7890"
telegram_use_proxy: true
qq_use_proxy: false
# MCP 工具配置
mcpServers:
hotnews:
type: "sse"
url: "https://dashscope.aliyuncs.com/api/v1/mcps/hotnews/sse"
use_proxy: false
headers:
Authorization: "Bearer ${DASHSCOPE_API_KEY}"
search:
type: "stdio"
command: "npx"
args: ["-y", "@modelcontextprotocol/server-brave-search"]
use_proxy: true
env:
BRAVE_API_KEY: "你的Brave搜索API_KEY"
# 平台特定提示词(用于格式化输出)
platform_prompts:
telegram: "请用 Markdown 格式回复,支持 **加粗**、*斜体*、`代码`。"
qq: "请用纯文本回复,不要包含 URL 链接。"
# 女朋友定制配置
girlfriend:
"QQ:她的OpenID":
name: "宝贝"
prompt: |
你是一个温柔体贴的男朋友助手。
对话时要温暖、关心、体贴,用简短温柔的语气回复。go build -o ggbot./ggbot| 指令 | 说明 | 示例 |
|---|---|---|
/start |
启动机器人 | /start |
/ping |
状态检查 | /ping |
/info |
查看个人信息(含 UserID/OpenID) | /info |
/help |
显示帮助信息 | /help |
| 指令 | 说明 | 示例 |
|---|---|---|
/set_ai |
配置个人 AI 设置 | /set_ai key=sk-xxx model=gpt-4 context=20 |
/reset_ai |
重置为默认配置 | /reset_ai |
/context_window [size] |
查看/设置上下文窗口大小 (1-100) | /context_window 15 |
/set_ai 参数说明:
key=<API_KEY>- 设置 API 密钥model=<模型名>- 设置模型(如 gpt-4, qwen-plus)url=<API地址>- 设置 API 地址provider=<服务商>- 设置服务商context=<数字>- 设置上下文窗口大小(1-100)
| 指令 | 说明 | 示例 |
|---|---|---|
/history_list [limit] [offset] |
列出聊天历史(默认15条,内容截断) | /history_list 20 0 |
/history_get <ID> |
查看完整消息内容 | /history_get 42 |
/history_clear |
清除自己的所有聊天历史 | /history_clear |
| 指令 | 说明 | 示例 |
|---|---|---|
/news |
获取今日新闻摘要(需 MCP) | /news |
/s <关键词> |
搜索并回答问题(需 MCP) | /s 今天天气怎么样 |
| 直接聊天 | 发送任何文字,AI 自动回复(带上下文) | 你好 |
| 指令 | 说明 | 示例 |
|---|---|---|
/history_delete <ID> |
删除指定消息 | /history_delete 42 |
/history_stats |
查看所有用户的消息统计 | /history_stats |
注:管理员功能需要在 Config 中实现
IsAdmin()方法后启用
- ✅ SQLite 持久化:所有对话保存在
data/conversations.db - ✅ 用户隔离:每个用户只能查看自己的历史
- ✅ 自动上下文加载:AI 对话时自动加载历史消息作为上下文
- ✅ 可配置窗口:支持 1-100 条消息的上下文窗口
- ✅ 完整记录:记录用户消息、AI回复、工具调用
- ✅ 高性能查询:使用索引优化,支持分页
CREATE TABLE messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, -- 用户数字ID
username TEXT NOT NULL, -- 用户名/显示名
role TEXT NOT NULL, -- 'user', 'assistant', 'tool'
content TEXT NOT NULL, -- 消息内容
tool_calls TEXT, -- 工具调用(JSON)
tool_call_id TEXT, -- 工具响应ID
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);# 查看最近的聊天记录
/history_list
# 查看更多记录(30条,从第10条开始)
/history_list 30 10
# 查看完整消息(如果列表中内容被截断)
/history_get 42
# 清除所有历史(谨慎使用)
/history_clear
# 设置上下文窗口为 20 条消息
/context_window 20上下文窗口决定了 AI 对话时会加载多少条历史消息作为上下文。更大的窗口可以让 AI 记住更长的对话内容,但会消耗更多的 tokens。
| 场景 | 推荐窗口大小 | 说明 |
|---|---|---|
| 简单问答 | 5-10 条 | 节省成本,适合独立问题 |
| 日常聊天 | 10-20 条 | 平衡记忆和成本 |
| 深度对话 | 30-50 条 | 保持长对话的连贯性 |
| 项目协作 | 50-100 条 | 最大化上下文理解 |
全局配置(在 config.yaml 中):
ai:
context_window: 10用户个性化配置:
/context_window 20
# 或
/set_ai context=20├── adapter/ # 平台适配器
│ ├── telegram/ # Telegram 适配
│ └── qq/ # QQ 适配
├── botgo/ # QQ Bot SDK (本地)
├── config/ # 配置管理
├── core/ # 核心接口定义
├── plugins/ # 插件
│ ├── ai/ # AI 对话插件
│ │ ├── plugin.go # 主插件逻辑
│ │ ├── llm.go # LLM API 调用
│ │ ├── mcp_manager.go # MCP 管理器
│ │ ├── tool_executor.go # 工具执行器
│ │ └── history.go # 对话历史管理
│ └── system/ # 系统指令插件
├── storage/ # 本地存储(用户设置)
├── data/ # 数据目录
│ └── conversations.db # 对话历史数据库
├── go-sdk/ # MCP SDK (本地)
├── config.yaml # 配置文件
└── main.go # 入口
在 plugins/ 目录下实现 Plugin 接口:
type Plugin interface {
Name() string
Init(ctx *Context) error
}在 adapter/ 目录下实现 core.Platform 接口:
type Platform interface {
Name() string
Start() error
Stop() error
RegisterCommand(cmd string, handler Handler)
RegisterText(handler Handler)
}在 config.yaml 中添加 MCP 服务器配置:
mcpServers:
your-tool:
type: "stdio" # 或 "sse", "streamable_http"
command: "your-mcp-server"
args: ["arg1", "arg2"]
use_proxy: false
env:
API_KEY: "your-key"- QQ 群消息:机器人只能被动回复(用户 @Bot 后),不支持主动推送
- QQ URL 过滤:QQ 平台会自动过滤消息中的 URL,建议配置
platform_prompts提示 AI 不要包含链接 - Telegram Markdown:支持 Markdown 格式,可配置提示词让 AI 输出格式化文本
- Telegram:建议使用代理(
telegram_use_proxy: true) - QQ:强制直连(
qq_use_proxy: false) - MCP 工具:每个 MCP 服务器可单独配置是否使用代理
- 上下文窗口:根据实际需求调整,避免不必要的 token 消耗
- 数据库清理:定期使用
/history_clear清理无用的历史记录 - 日志级别:生产环境建议设置为
info或warn
- API 密钥:不要将 API 密钥提交到代码仓库
- 数据库备份:定期备份
data/conversations.db - 访问控制:使用
allowed_telegram和allowed_qq限制用户访问 - 管理员权限:实现
IsAdmin()方法控制敏感操作
- 检查 MCP 服务器配置是否正确
- 检查代理设置(
use_proxy字段) - 查看日志输出中的错误信息
- 确认环境变量是否正确设置
- 确认
data/目录存在且有写权限 - 检查 SQLite 依赖是否正确安装
- 查看日志中的数据库错误信息
- 检查
context_window配置是否正确 - 使用
/history_list确认历史已保存 - 检查日志中的历史加载信息
- ✨ 新增对话历史管理系统(SQLite)
- ✨ 新增可配置的上下文窗口大小
- ✨ 新增对话历史查看、删除、统计功能
- 🐛 修复 MCP 工具 schema 兼容性问题
- 🎨 优化代码质量(替换
interface{}为any) - 📚 完善文档和帮助信息
- ✨ 多平台支持(Telegram + QQ)
- ✨ MCP 工具集成
- ✨ 个性化配置
- ✨ 女朋友模式
MIT
欢迎提交 Issue 和 Pull Request!
Made with ❤️ by GGBot Team