# wwlbotdemo **Repository Path**: hanphycai/wwlbotdemo ## Basic Information - **Project Name**: wwlbotdemo - **Description**: 私有化企业微信的智能机器人接口对接示例。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2026-03-06 - **Last Updated**: 2026-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 企业微信智能机器人 Demo 基于企业微信智能机器人 API 和 DeepSeek 大模型,支持 Agent Skill 可扩展技能的智能机器人。 ## 功能特性 - 🤖 **智能对话**:基于 DeepSeek 大模型的智能回复 - 🔌 **流式回复**:支持企业微信流式消息协议,实时展示回复内容 - 🛠️ **Skill 扩展**:支持通过 SKILL.md 文件动态扩展机器人能力 - 💾 **历史记录**:SQLite 持久化存储,支持多轮对话上下文 - 🔐 **安全加密**:完整的企业微信消息加解密支持 - 🌐 **双协议支持**:同时支持 HTTP 回调和 WebSocket 长连接两种协议模式 ## 协议模式 本项目支持两种企业微信协议模式: | 模式 | 说明 | 适用场景 | |------|------|----------| | **callback** (默认) | HTTP 回调协议,企业微信主动推送消息到服务端 | 需要公网可访问的服务器 | | **websocket** | WebSocket 长连接协议,客户端主动连接企业微信服务器 | 无公网 IP 或内网环境 | 通过环境变量 `PROTOCOL_MODE` 切换协议模式。 ## 架构概览 ``` wwlbotdemo/ ├── src/ │ ├── adapters/ # 协议适配器 │ │ ├── base.py # 适配器基类 │ │ └── websocket_adapter.py # WebSocket 长连接适配器 │ ├── api/ # API 路由层 │ │ └── router.py # HTTP 路由,URL验证、消息回调 │ ├── core/ # 核心配置 │ │ └── config.py # 应用配置(环境变量) │ ├── llm/ # LLM 客户端 │ │ └── client.py # DeepSeek API 封装 │ ├── models/ # 数据模型 │ │ ├── database.py # 数据库连接管理 │ │ └── message.py # 消息数据模型 │ ├── services/ # 业务服务 │ │ ├── message_handler.py # 消息处理核心 │ │ ├── skill_loader.py # Skill 加载服务 │ │ └── stream_manager.py # 流式状态管理 │ ├── utils/ # 工具模块 │ │ └── crypto.py # 企业微信加解密 │ └── main.py # 应用入口 ├── skills/ # Skill 目录 ├── tests/ # 测试用例 ├── system_prompt.md # 系统提示词 ├── requirements.txt # Python 依赖 └── pytest.ini # 测试配置 ``` ## 系统架构图 ```mermaid flowchart TB subgraph 企业微信 WX[企业微信后台] end subgraph 协议层 API[HTTP Router
callback 模式] WS[WebSocket Adapter
websocket 模式] end subgraph 业务层 MH[Message Handler] SS[Stream Manager] LLM[LLM Client] DB[(SQLite)] SK[Skill Loader] CR[Crypto Utils] end WX -->|POST 消息回调| API WX -->|GET URL验证| API WX -->|POST stream刷新| API WX <-->|WebSocket 长连接| WS API --> CR API --> MH API --> SS WS --> MH WS --> SS MH --> SK MH --> LLM MH --> DB SS --> DB SK -->|启动加载| SKILL[skills/*.md] ``` ## 快速开始 ### 环境要求 - Python 3.10+ - pip 或 uv 包管理器 ### 安装依赖 ```bash # 使用 pip pip install -r requirements.txt # 或使用 uv uv pip install -r requirements.txt ``` ### 配置环境变量 创建 `.env` 文件或设置环境变量: ```bash # =============================================== # 协议模式配置 # =============================================== # 协议模式:callback(HTTP 回调,默认)或 websocket(WebSocket 长连接) PROTOCOL_MODE=callback # =============================================== # HTTP 回调模式配置(PROTOCOL_MODE=callback 时使用) # =============================================== # 企业微信配置(必填) PLATFORM_API_TOKEN=your_token PLATFORM_ENCODING_AES_KEY=your_aes_key PLATFORM_CORP_ID=your_corp_id # =============================================== # WebSocket 模式配置(PROTOCOL_MODE=websocket 时使用) # =============================================== # 从企业微信后台「智能机器人」页面获取(必填) WECHAT_BOT_ID=your_bot_id WECHAT_BOT_SECRET=your_bot_secret # WebSocket 服务地址(可选,SDK 有默认值) # WS_URL=wss://bot.weixin.qq.com/api/aibot # =============================================== # 通用配置 # =============================================== # DeepSeek LLM 配置(必填) LLM_API_KEY=your_deepseek_api_key LLM_API_BASE=https://api.deepseek.com/v1 LLM_MODEL=deepseek-chat # 应用配置(可选) APP_NAME=智能小秘书 HOST=0.0.0.0 PORT=8000 LOGLEVEL=info # 数据库和 Skill 配置(可选) DATABASE_PATH=data/bot.db SKILLS_PATH=skills SYSTEM_PROMPT_FILE=system_prompt.md CHAT_ROUNDS=5 # Skill 脚本执行超时(可选,单位:秒,默认 120) SKILL_SCRIPT_TIMEOUT=120 # 流式状态清理配置(可选) STREAM_MAX_AGE=300 # 未完成流的最大存活时间(秒,默认 300) STREAM_CLEANUP_INTERVAL=60 # 清理任务运行间隔(秒,默认 60) ``` ### 启动应用 #### HTTP 回调模式(默认) ```bash # 设置协议模式为 callback(或不设置,默认即为 callback) export PROTOCOL_MODE=callback # 开发模式(热重载) python -m src.main # 或直接使用 uvicorn uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload ``` #### WebSocket 长连接模式 ```bash # 设置协议模式为 websocket export PROTOCOL_MODE=websocket # 设置 WebSocket 模式所需的凭证 export WECHAT_BOT_ID=your_bot_id export WECHAT_BOT_SECRET=your_bot_secret # 启动应用 python -m src.main ``` > **注意**:WebSocket 模式不会启动 HTTP 服务,而是直接建立与企业微信服务器的长连接。 ### 配置企业微信回调 在企业微信管理后台配置智能机器人的回调 URL: - URL: `http://your-server:8000/` - Token: 与 `PLATFORM_API_TOKEN` 一致 - EncodingAESKey: 与 `PLATFORM_ENCODING_AES_KEY` 一致 ## Skill 扩展 ### 创建 Skill 在 `skills/` 目录下创建子目录,添加 `SKILL.md` 文件: ``` skills/ └── example-skill/ └── SKILL.md ``` ### SKILL.md 格式 ```markdown --- name: example-skill description: 这是一个示例技能,用于演示 Skill 机制。 --- # Example Skill 这里是 Skill 的详细说明和使用指南。 ``` ### Skill 注入机制 系统在每次 LLM 调用时,会将所有 Skill 的描述动态注入到上下文中: ``` ## Available Skills The following skills are available: - **skill-name**: Skill description When a task matches a skill's purpose, follow its instructions. ``` ## 运行测试 ```bash # 运行所有测试 pytest tests/ -v # 运行测试并生成覆盖率报告 pytest tests/ --cov=src --cov-report=html # 运行特定测试文件 pytest tests/test_api_integration.py -v # 运行 WebSocket 适配器测试 pytest tests/test_websocket_adapter.py -v ``` ## 项目结构说明 ### 协议层 (`src/adapters/`) - **base.py**: 协议适配器基类,定义通用接口 - **websocket_adapter.py**: WebSocket 长连接协议适配器 - 封装 wecom-aibot-python-sdk - 消息格式转换(frame -> MessageHandler 格式) - 流式回复适配(StreamManager -> reply_stream) - 事件处理(on_text, on_enter_chat 等) ### API 层 (`src/api/`) - **router.py**: 处理企业微信回调请求 - `GET /`: URL 验证接口 - `POST /`: 消息回调和流式刷新接口 - `GET /health`: 健康检查接口 ### 服务层 (`src/services/`) - **message_handler.py**: 消息处理核心服务 - 解析消息类型(text、stream 等) - 协调 LLM 调用、数据库存储 - 构建含 Skill 描述的上下文 - Skill 脚本执行超时保护(`SKILL_SCRIPT_TIMEOUT`),超时自动终止子进程 - **stream_manager.py**: 流式状态管理 - 使用 asyncio.Lock 保证并发安全 - 管理 stream_id 到内容的映射 - 后台定时清理超时未完成的幽灵流和已完成的流,防止内存泄漏(`STREAM_MAX_AGE` / `STREAM_CLEANUP_INTERVAL`) - **skill_loader.py**: Skill 加载服务 - 启动时扫描 skills 目录 - 解析 YAML frontmatter - 格式化 Skill 描述供 LLM 使用 ### 数据层 (`src/models/`) - **database.py**: 异步 SQLite 数据库管理 - **message.py**: 消息数据模型和 CRUD 操作 ### LLM 客户端 (`src/llm/`) - **client.py**: DeepSeek API 调用封装 - 支持流式和非流式模式 - 带回调的流式调用 ## 日志配置 日志级别可通过 `LOGLEVEL` 环境变量配置: - `debug`: 详细调试信息 - `info`: 一般运行信息(推荐生产环境) - `warning`: 警告信息 - `error`: 错误信息 可通过 `LOGFILE` 配置日志文件路径。 ## 开发指南 ### TDD 开发模式 本项目遵循测试驱动开发(TDD)模式: 1. 先编写测试用例 2. 运行测试确认失败 3. 实现功能代码 4. 运行测试确认通过 5. 重构优化 ### 代码风格 - 使用 Python 类型注解 - 遵循 PEP 8 代码风格 - 使用 async/await 进行异步编程 - 敏感信息不输出到日志 ## License MIT License