Skip to content

log-z/get-chat

Repository files navigation

GetChat

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)

安装部署

1. 安装依赖

pip install -r requirements.txt

2. 配置文件

编辑 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位随机字符串

3. 启动服务

python main.py

服务默认运行在 http://0.0.0.0:7333

4. 生产环境部署

# 使用 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

使用方式

AI 主动发起对话

通过配置 bindings 自动在启动时创建会话并推送链接。

用户回复

  1. 用户点击消息中的会话链接 https://xxx.com/s/<sessionKey>
  2. 在页面中输入回复内容
  3. AI 回复后会通过企业微信推送给用户

@userid 提及功能

在用户输入页面支持 @userid 格式提及特定用户:

  1. 输入消息时使用 @userid 格式(如 @zhangsan 请查看
  2. 企业微信推送时会自动转换为 <@userid> 格式
  3. 被提及的用户会收到特别通知

API 端点

端点 方法 说明
/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 vs copaw_session_id

  • SessionKey:临时访问凭证,存储在内存中,3 小时过期,用户访问聊天页面使用
  • 永久 SessionKey:固定访问凭证,存储在配置文件中,永不过期,重启后不变
  • copaw_session_id:持久的 AI 会话 ID,多个 SessionKey 可共享同一个,用于保持 AI 上下文

工作流程

  1. 启动恢复:中间层启动时读取 bindings 配置,为每个绑定创建新的 SessionKey 并推送链接
  2. 用户回复:用户通过链接页面发送消息,消息进入队列,后台异步调用 CoPaw API
  3. 自动续期:调度器每分钟检查一次,剩余时间 < 10 分钟时自动创建新 Session 并推送新链接

许可证

MIT License

About

GetChat - 随时随地对话

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors