AI 用户双向通信中间层 - 让 AI 通过消息推送与用户进行异步双向交流。
普通用户在社交软件中无法创建聊天机器人(需要管理员权限),但可以创建消息推送机器人。GetChat 开发了一个 AI 到用户的中间层,让 AI 能通过消息推送与用户进行双向交流。
- 双向通信:AI 主动发起对话,用户通过链接页面回复
- 深度思考实时推送:支持 AI 响应的 reasoning/content 分离,深度思考完成后立即推送
- 上下文保留:通过持久的
copaw_session_id保持对话历史不丢失 - 自动续期:SessionKey 即将过期时自动创建新链接并推送
- 重启恢复:中间层重启后自动重建 SessionKey 并推送新链接
- 消息队列:支持用户连续发送消息,后台串行处理
- 全局并发控制:限制最大并发 AI 调用数,防止资源耗尽
- 配置热重载:修改配置文件后自动生效,无需重启服务
- 永久 SessionKey:支持固定链接模式,重启后链接不变
- @userid 提及:支持企业微信 @userid 通知特定用户
- 企业微信推送:支持企业微信 Markdown 格式推送
┌─────────────────┐ 持久化绑定 ┌─────────────────┐
│ 推送机器人 (Bot) │ ←──────────────────────→ │ CoPaw AI 会话 │
│ (配置文件) │ bot_id + copaw_id │ (上下文保留) │
└─────────────────┘ └─────────────────┘
│
│ 动态创建(内存)
▼
┌──────────────┐
│ SessionKey │ ← 重启后重建
│ (临时凭证) │ ← 即将过期时重建
└──────────────┘
┌──────────────┐
│ 永久 SessionKey │ ← 固定链接,重启不变
│ (配置文件) │ ← 不会过期
└──────────────┘
| 组件 | 选择 |
|---|---|
| Web 框架 | FastAPI |
| ASGI 服务器 | Uvicorn |
| HTTP 客户端 | httpx (异步) |
| AI 集成 | CoPaw REST API(SSE 流式响应) |
| 推送渠道 | 企业微信 |
| 配置方式 | YAML |
| Session 存储 | 内存缓存(TTLCache) |
| 调度器 | APScheduler (AsyncIOScheduler) |
pip install -r requirements.txt编辑 config.yaml,配置以下关键参数:
配置加载优先级:环境变量 > config.local.yaml > config.yaml
创建 config.local.yaml 可覆盖默认配置(不会纳入版本控制):
app:
base_url: "https://your-domain.com" # 修改为你的域名
ai:
endpoint: "http://localhost:8088/api/agent/process" # CoPaw API 地址
bots:
- id: "wechat_main"
webhook_url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-key" # 修改为你的 webhook
bindings:
# 方式 1:临时 SessionKey(每次启动生成新链接)
- bot_id: "wechat_main"
copaw_session_id: "chat_001" # 修改为你的 CoPaw 会话 ID
enabled: true
session_key: "" # 留空表示使用临时 SessionKey
# 方式 2:永久 SessionKey(固定链接,重启不变)
- bot_id: "wechat_main"
copaw_session_id: "chat_001"
enabled: true
session_key: "YourPermanentKey12345678901234567890" # 32位随机字符串python main.py服务默认运行在 http://0.0.0.0:7333
# 使用 uvicorn
uvicorn app:create_fastapi_app --host 0.0.0.0 --port 7333 --workers 4
# 或使用 Docker
docker build -t get-chat:latest .
docker run -d -p 7333:7333 -v $(pwd)/config.yaml:/app/config.yaml --name get-chat get-chat:latest通过配置 bindings 自动在启动时创建会话并推送链接。
- 用户点击消息中的会话链接
https://xxx.com/s/<sessionKey> - 在页面中输入回复内容
- AI 回复后会通过企业微信推送给用户
在用户输入页面支持 @userid 格式提及特定用户:
- 输入消息时使用
@userid格式(如@zhangsan 请查看) - 企业微信推送时会自动转换为
<@userid>格式 - 被提及的用户会收到特别通知
| 端点 | 方法 | 说明 |
|---|---|---|
/health |
GET | 健康检查 |
/debug/sessions |
GET | 调试会话列表(需 debug_mode=true) |
/debug/scheduler |
GET | 调度器任务状态(需 debug_mode=true) |
/docs |
GET | Swagger UI 文档(需 doc_enable=true) |
/redoc |
GET | ReDoc 文档(需 doc_enable=true) |
/s/<session_key> |
GET | 用户聊天页面 |
/s/<session_key>/status |
GET | 会话状态(倒计时、队列长度) |
/s/<session_key>/reply |
POST | 用户提交回复 |
get-chat/
├── main.py # FastAPI 应用入口
├── config.py # 配置加载器
├── config.yaml # 配置文件
├── requirements.txt
├── app/
│ ├── __init__.py # FastAPI 应用工厂
│ ├── api/ # API 路由
│ │ └── routes.py # FastAPI 端点定义
│ ├── core/ # 核心模块
│ │ └── dependencies.py # 依赖注入
│ ├── web/ # Web 界面
│ │ └── templates/ # Jinja2 模板
│ ├── services/ # 异步服务
│ │ ├── session_service.py # Session 管理
│ │ ├── push_service_async.py # 异步推送服务
│ │ ├── ai_service_async.py # 异步 AI 服务
│ │ ├── queue_service_async.py # 异步队列服务
│ │ ├── scheduler_service_async.py # 异步调度器
│ │ └── binding_service.py # 绑定管理服务
│ ├── models/ # 数据模型
│ ├── utils/ # 工具函数
│ └── integrations/ # 第三方集成
│ └── wechat_async.py # 异步企业微信集成
└── docs/
└── DESIGN.md # 设计文档
- SessionKey:临时访问凭证,存储在内存中,3 小时过期,用户访问聊天页面使用
- 永久 SessionKey:固定访问凭证,存储在配置文件中,永不过期,重启后不变
- copaw_session_id:持久的 AI 会话 ID,多个 SessionKey 可共享同一个,用于保持 AI 上下文
- 启动恢复:中间层启动时读取
bindings配置,为每个绑定创建新的 SessionKey 并推送链接 - 用户回复:用户通过链接页面发送消息,消息进入队列,后台异步调用 CoPaw API
- 自动续期:调度器每分钟检查一次,剩余时间 < 10 分钟时自动创建新 Session 并推送新链接
MIT License