一个基于 OpenAI ChatGPT 的无服务器 Matrix 机器人,部署在 Cloudflare Workers 上,使用 KV 和 R2 存储。
English | 简体中文
- 🤖 AI 驱动对话:在 Matrix 房间中与 OpenAI 模型聊天
- 🔌 自定义 API 提供商:支持自定义 OpenAI 兼容 API(Azure、OpenRouter、本地模型等)
- 💾 持久化存储:对话历史存储在 Cloudflare R2 中
- ⚡ 无服务器:完全运行在 Cloudflare Workers 和 Durable Objects 上
- 🌐 全球边缘网络:通过 Cloudflare 全球网络实现低延迟响应
- 🔒 访问控制:支持管理员和白名单
- 📝 丰富命令:多个配置和管理命令
- Cloudflare Workers:无服务器计算
- Durable Objects:Matrix 同步状态管理
- KV 存储:配置和会话数据
- R2 存储:对话历史和日志
- Matrix 协议:客户端-服务器 API 集成
- OpenAI API:聊天补全(可自定义端点)
- 启用 Workers 的 Cloudflare 账户(支持免费套餐)
- Matrix 账户(任何家服务器)
- OpenAI API 密钥或兼容 API 端点
注意:此机器人可在 Cloudflare 免费套餐上运行!它使用 new_sqlite_classes 作为 Durable Objects,与免费计划兼容。
# 从 GitHub 克隆
git clone https://github.com/yourusername/matrix-chatgpt-bot.git
cd matrix-chatgpt-bot
# 安装依赖
npm install
# 运行自动化设置脚本
./setup.sh设置脚本将自动:
- 创建 KV 命名空间
- 创建 R2 存储桶
- 从模板生成
wrangler.toml - 引导您设置密钥
git clone https://github.com/yourusername/matrix-chatgpt-bot.git
cd matrix-chatgpt-bot
npm installcp wrangler.toml.example wrangler.toml登录 Cloudflare:
wrangler login创建 KV 命名空间:
wrangler kv:namespace create "KV"
wrangler kv:namespace create "KV" --preview创建 R2 存储桶:
wrangler r2 bucket create matrix-bot-storage
wrangler r2 bucket create matrix-bot-storage-preview使用您的命名空间 ID 更新 wrangler.toml。
wrangler secret put MATRIX_USER_ID
# 输入:@yourbotuser:matrix.org
wrangler secret put MATRIX_PASSWORD
# 输入:your_bot_password
wrangler secret put OPENAI_API_KEY
# 输入:sk-your-api-key
wrangler secret put OPENAI_BASE_URL
# 输入:https://api.openai.com/v1(或自定义 URL)
wrangler secret put BOT_ADMIN_USERS
# 输入:@admin1:matrix.org,@admin2:matrix.orgwrangler deploy# 登录 Matrix
curl -X POST https://your-worker.workers.dev/login
# 启动同步循环
curl https://your-worker.workers.dev/start提及机器人或使用以 ! 开头的命令:
!help- 显示可用命令!gpt <消息>- 与 GPT 聊天(任何人都可以使用,无需提及)!reset- 清除对话历史!provider- 显示当前 AI 提供商!provider list- 列出所有可用提供商!provider set <名称>- 切换到不同的提供商!model <名称>- 为当前房间设置 AI 模型
!addprovider <名称> <基础URL> <API密钥> [模型...]- 添加新的 AI 提供商!delprovider <名称>- 删除 AI 提供商!seturl <基础URL>- 设置默认 OpenAI 基础 URL!stats- 显示机器人统计信息
有三种方式与机器人交互:
!gpt 法国的首都是什么?
!gpt 给我讲个笑话
@botuser:matrix.org 法国的首都是什么?
!help
!reset
!provider list
机器人支持任何与 OpenAI 兼容的 API。以下是一些示例:
!addprovider azure https://your-resource.openai.azure.com/openai/deployments/your-deployment YOUR_AZURE_KEY gpt-4 gpt-35-turbo
!provider set azure!addprovider openrouter https://openrouter.ai/api/v1 YOUR_OPENROUTER_KEY gpt-4 claude-3-opus
!provider set openrouter!addprovider local http://localhost:8000/v1 none llama-2-7b mistral-7b
!provider set local!addprovider together https://api.together.xyz/v1 YOUR_TOGETHER_KEY meta-llama/Llama-2-70b-chat-hf
!provider set together每个房间可以在 KV 中拥有自己的配置:
{
provider: "openai", // AI 提供商名称
model: "gpt-4", // 模型名称
temperature: 0.7, // 响应随机性(0-2)
maxTokens: 2000, // 最大响应长度
systemPrompt: "..." // 自定义系统提示
}存储在 KV 中 config:global 的全局设置:
{
defaultProvider: "openai",
defaultModel: "gpt-4",
maxContextMessages: 20 // 上下文中保留的消息数量
}sync:token- Matrix 同步令牌auth:access_token- Matrix 访问令牌auth:user_id- 机器人用户 IDauth:device_id- Matrix 设备 IDroom:config:{roomId}- 房间特定配置user:settings:{userId}- 用户偏好设置provider:{name}- AI 提供商配置config:global- 全局机器人配置config:admins- 管理员用户列表config:whitelist- 允许的用户列表
conversations/{roomId}/history.json- 对话历史logs/{date}/{roomId}/{timestamp}.json- 消息日志images/{messageId}.{ext}- 生成的图像uploads/{userId}/{fileId}- 用户上传config/backup-{timestamp}.json- 配置备份
npm run devnpm run build查看 TEST_CHECKLIST.zh-CN.md 获取完整的分步指南。
快速测试:
- 在 Matrix 中邀请机器人:
/invite @your-bot-user-id:oi6.uk - 等待 2-3 分钟让机器人接受邀请
- 尝试
!gpt命令:!gpt 你好! - 或提及机器人:
@your-bot-user-id:oi6.uk 你好! - 或使用帮助:
!help
重要:机器人响应以下方式:
!gpt <消息>- 最简单的方式,无需提及@机器人用户ID 消息- 传统提及方式!命令- 其他机器人命令
GET /- 健康检查GET /health- 详细健康状态POST /login- 通过 Matrix 进行身份验证GET /start- 启动同步循环GET /stop- 停止同步循环GET /status- 获取同步状态
如果您遇到关于 new_classes 迁移的错误:
In order to use Durable Objects with a free plan, you must create a namespace using a `new_sqlite_classes` migration.
确保您的 wrangler.toml 使用 new_sqlite_classes 而不是 new_classes:
[[migrations]]
tag = "v1"
new_sqlite_classes = ["MatrixSync"] # 用于免费计划wrangler.toml 中的 KV 绑定名称必须是 "KV"(大写):
[[kv_namespaces]]
binding = "KV" # 必须与代码匹配
id = "your_id_here"命名空间标题(在仪表板中显示)可以是任何内容,但绑定必须是 "KV"。
- 检查同步是否正在运行:
curl https://your-worker.workers.dev/status - 检查 Cloudflare 仪表板中的日志
- 验证身份验证:检查 KV 中的
auth:access_token - 确保机器人已被邀请到房间
- 验证 API 密钥是否正确
- 检查基础 URL 格式(不应以
/结尾) - 使用 curl 直接测试 API 端点
- 检查 Cloudflare Workers 日志
- 重启同步:
curl https://your-worker.workers.dev/start - 检查身份验证是否过期
- 重新登录:
curl -X POST https://your-worker.workers.dev/login
- KV 写入限制:KV 每秒每个键限制 1 次写入
- 请求超时:标准计划的 Workers 在 30 秒后超时
- 内存:Workers 有 128MB 内存限制
- R2 操作:免费套餐包含每月 100 万次请求
- 所有 API 密钥存储为 Cloudflare 密钥
- 管理员命令仅限于配置的管理员
- 可选的用户白名单进行访问控制
- 不记录或暴露凭证
MIT
欢迎贡献!请打开问题或 PR。
查看 CONTRIBUTING.zh-CN.md 了解更多信息。
灵感来源于: