基于 OpenClaw 架构的多渠道 AI Agent 基础设施
支持手机 QQ/飞书/钉钉远程控制 PC,集成高德地图生活服务,多 LLM 提供商支持,三层记忆系统,技能系统,AI 日报自动生成
- 多 LLM 提供商支持:OpenAI、Claude、DeepSeek、Kimi、智谱、千问、火山引擎、魔搭、OpenRouter、Google 等
- 工具调用系统:文件读写、Bash 命令执行、网络请求、Tavily 搜索
- 三层记忆架构:
- 对话记忆(JSONL 持久化存储)
- 语义记忆(ChromaDB 向量检索)
- 工作记忆(TTL 缓存)
- 技能系统:支持 SKILL.md 格式技能定义,热重载
支持 QQ 官方机器人、飞书、钉钉三大平台:
| 平台 | 状态 | 特性 |
|---|---|---|
| QQ 官方机器人 | ✅ 已实现 | 群聊@触发、私聊、关键词触发 |
| 飞书 | ✅ 已实现 | 交互卡片、AI 日报自动推送、云文档集成 |
| 钉钉 | ✅ 已实现 | Markdown 消息、交互卡片、云文档上传(手动触发) |
通过手机发送指令,即可远程控制电脑:
| 指令类别 | 可用指令 | 功能说明 |
|---|---|---|
| 系统控制 | /锁屏 |
锁定电脑屏幕 |
/音量 50 |
设置音量(0-100) | |
/静音 |
切换静音状态 | |
/关机 |
关闭系统 | |
/重启 |
重启系统 | |
| 文件管理 | /文件列表 D:/ |
查看目录文件列表 |
/创建文件夹 路径 |
创建新文件夹 | |
/下载 URL |
下载文件到电脑 | |
| 信息查询 | /系统状态 |
查看 CPU、内存、磁盘使用情况 |
/电池状态 |
查看电池电量和电源状态 | |
/网络状态 |
查看网络连接信息 | |
/进程列表 |
查看运行中的进程 | |
/截图 |
截取屏幕并保存到指定目录 |
/设置位置 地址- 设置当前位置/上网- 搜索附近网吧,含套餐信息/吃饭- 搜索附近餐厅,含评价和推荐理由/娱乐- 搜索附近娱乐场所(KTV、棋牌室、健身房等)/洗脚- 搜索附近洗浴按摩场所/咖啡- 搜索附近咖啡馆
- 自动生成:每日自动获取 AI 领域最新资讯
- 智能分析:使用 LLM 进行深度分析和洞察提取
- 多平台推送:支持推送到飞书云文档(钉钉云盘上传需手动触发)
- 定时任务:支持飞书定时自动生成和推送(钉钉定时任务开发中)
支持通过 SKILL.md 文件定义技能,支持多种触发方式:
| 技能 | 触发命令 | 关键词 | 功能说明 |
|---|---|---|---|
| 翻译助手 | /翻译, /translate |
翻译, translate | 多语言翻译,自动识别源语言 |
| 会议助手 | /会议, /meeting |
会议纪要, 会议记录 | 整理会议纪要,提取待办事项 |
| 数据分析师 | /分析, /analyze |
数据分析, 统计分析 | 数据分析,生成图表建议 |
| 产品经理 | /产品, /prd |
PRD, 需求文档 | PRD 撰写,需求拆解分析 |
| 运营助手 | /运营, /operate |
写文案, 活动方案 | 文案撰写,活动策划 |
| 文件管理 | /文件, /file |
文件, 文件夹 | 文件管理助手 |
技能文件示例:
---
name: translator
version: 1.0.0
description: 多语言翻译助手
triggers:
- type: command
pattern: /翻译
- type: keyword
pattern: 翻译
---
# 翻译助手
你是一个专业的翻译助手...- 分层模块化设计:LLM、工具、记忆、技能四大核心模块
- Provider 模式:统一接口支持多种 LLM 提供商
- 向量数据库:ChromaDB 支持语义记忆检索
- WebSocket + JSON-RPC:实时双向通信
- 热重载机制:技能文件修改自动加载
- Node.js 18+
- Python 3.11+
- QQ 官方机器人(需申请)或 飞书应用 或 钉钉应用
- Ollama(可选,用于本地嵌入模型)
git clone https://github.com/yourusername/clawchat.git
cd clawchat# 安装 Gateway 依赖
cd gateway
npm install
# 安装 Runner 依赖
cd ../runner
pip install -e ".[dev]"复制 .env.example 为 .env:
cp .env.example .envQQ_OFFICIAL_APP_ID=your_app_id_here
QQ_OFFICIAL_APP_SECRET=your_app_secret_hereFEISHU_APP_ID=your_feishu_app_id_here
FEISHU_APP_SECRET=your_feishu_app_secret_hereDINGTALK_CLIENT_ID=your_dingtalk_client_id_here
DINGTALK_CLIENT_SECRET=your_dingtalk_client_secret_here
DINGTALK_ROBOT_CODE=your_dingtalk_robot_code_hereDeepSeek(推荐)
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=sk-...
LLM_MODEL=deepseek-chatOpenAI
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-...
LLM_MODEL=gpt-4o-miniOllama(本地模型)
LLM_PROVIDER=ollama
LLM_MODEL=llama3.2:3b# 高德地图
AMAP_API_KEY=your_amap_api_key_here
# Tavily 搜索(用于 AI 日报)
TAVILY_API_KEY=your_tavily_api_key_here编辑 config.yaml:
# 启用需要的渠道
channels:
qq-official:
enabled: true
appId: "${QQ_OFFICIAL_APP_ID}"
appSecret: "${QQ_OFFICIAL_APP_SECRET}"
trigger:
group:
at: true
keyword: ["/"]
private:
enabled: true
feishu:
enabled: true
appId: "${FEISHU_APP_ID}"
appSecret: "${FEISHU_APP_SECRET}"
dailyReport:
enabled: true
targetUserId: ""
schedule: "0 8 * * *" # 每天早上8点
uploadToDrive: true
driveFolderPath: "我的文件夹/AI日报"
dingtalk:
enabled: true
clientId: "${DINGTALK_CLIENT_ID}"
clientSecret: "${DINGTALK_CLIENT_SECRET}"
robotCode: "${DINGTALK_ROBOT_CODE}"
# 注意:钉钉暂不支持定时日报推送,仅支持手动触发上传
# 服务配置
services:
amap:
enabled: true
apiKey: "${AMAP_API_KEY}"
tavily:
enabled: true
api_key: "${TAVILY_API_KEY}"如需使用本地嵌入模型,确保 Ollama 已安装并运行:
# 拉取嵌入模型
ollama pull qwen3-embedding:0.6b-fp16编辑 config.yaml:
memory:
embedding_provider: "ollama"
embedding_model: "qwen3-embedding:0.6b-fp16"
embedding_base_url: "http://localhost:11434"编辑 runner/src/services/system_control.py,修改默认截图目录:
self._preferred_screenshot_dir = Path(r"E:\桌面\pic\ClawChat") # Windows
# 或
self._preferred_screenshot_dir = Path("/Users/username/Pictures/ClawChat") # macOS/Linux# 终端 1: 启动 Gateway
cd gateway
npm run dev
# 终端 2: 启动 Runner
cd runner
python -m src.main- QQ 私聊:直接发送
/系统状态 - QQ 群聊:@机器人 或发送
/系统状态 - 飞书/钉钉:发送
/系统状态
/锁屏 # 锁定电脑屏幕
/音量 50 # 设置音量为 50%
/静音 # 切换静音状态
/关机 # 关闭系统
/重启 # 重启系统
/取消关机 # 取消正在进行的关机/重启
/文件列表 D:/ # 查看 D 盘根目录
/创建文件夹 E:/test # 在 E 盘创建 test 文件夹
/下载 https://example.com/file.zip # 下载文件
/系统状态 # 查看系统资源使用情况
/电池状态 # 查看电池信息
/网络状态 # 查看网络连接
/进程列表 # 查看运行进程
/截图 # 截取屏幕保存到指定目录
/打开应用 notepad # 打开记事本
/关闭应用 chrome # 关闭 Chrome 浏览器
/设置位置 北京市海淀区 # 设置当前位置
/上网 # 搜索附近网吧
/吃饭 # 搜索附近餐厅
/娱乐 # 搜索娱乐场所
/洗脚 # 搜索洗浴按摩场所
/咖啡 # 搜索附近咖啡馆
/日报 # 生成今日 AI 日报
/日报 增强 # 使用 LLM 增强分析生成日报
/日报 上传 # 生成日报并上传到飞书云文档
注意:钉钉云盘上传功能目前需要手动触发,暂不支持定时自动推送。使用
/日报 上传指令时,日报将上传到飞书云文档。如需上传到钉钉云盘,请联系开发者配置。
graph TB
subgraph 用户接入层
QQ[QQ官方机器人]
FS[飞书机器人]
DT[钉钉机器人]
end
subgraph Gateway网关层
PA[协议适配器]
MT[消息转换器]
WS[WebSocket/HTTP]
end
subgraph Runner执行层
subgraph Agent核心
AR[Agent Runner]
LG[LLM Gateway]
SM[Skill Manager]
MM[Memory Manager]
end
subgraph 工具系统
TF[文件读写]
TB[Bash执行]
TN[网络请求]
TV[Tavily搜索]
TR[工具注册]
TE[工具执行]
end
subgraph 服务层
SS[系统控制]
SF[文件管理]
SI[信息查询]
SA[高德地图]
SL[生活服务]
SD[AI日报]
end
end
QQ --> PA
FS --> PA
DT --> PA
PA --> MT
MT --> WS
WS -->|JSON-RPC| AR
AR --> LG
AR --> SM
AR --> MM
AR --> TR
AR --> TE
TR --> TF
TR --> TB
TR --> TN
TR --> TV
TE --> SS
TE --> SF
TE --> SI
TE --> SA
TE --> SL
TE --> SD
LG -.->|OpenAI| OPENAI[OpenAI API]
LG -.->|Claude| ANTH[Anthropic API]
LG -.->|DeepSeek| DS[DeepSeek API]
LG -.->|其他| OTHER[其他提供商]
MM -.->|对话记忆| CM[(JSONL)]
MM -.->|语义记忆| SMEM[(ChromaDB)]
MM -.->|工作记忆| WM[(TTL Cache)]
clawchat/
├── 📁 gateway/ # Gateway 网关 (Node.js + TypeScript)
│ └── src/
│ ├── channels/ # 渠道适配器 (QQ/飞书/钉钉)
│ ├── core/ # 核心模块 (RPC、路由)
│ └── server/ # WebSocket/HTTP 服务器
│
├── 📁 runner/ # Agent Runner (Python)
│ └── src/
│ ├── agent/ # Agent 主循环和指令处理
│ ├── core/ # 核心模块
│ ├── llm/ # LLM 模块 (多提供商支持)
│ ├── memory/ # 记忆系统 (三层架构)
│ ├── services/ # 业务服务
│ ├── skills/ # 技能系统
│ └── tools/ # 工具系统
│
├── 📁 skills/ # 业务技能目录
│ ├── translator/ # 翻译助手
│ ├── meeting-assistant/ # 会议助手
│ ├── data-analyst/ # 数据分析师
│ ├── product-manager/ # 产品经理
│ ├── operation-assistant/ # 运营助手
│ └── file-manager/ # 文件管理助手
│
├── 📁 .claude/skills/ # Claude AI 技能库 (29个技能)
├── 📁 docs/plans/ # 架构设计文档
├── config.yaml # 主配置文件
├── .env.example # 环境变量示例
└── README.md # 项目说明
| 变量 | 说明 | 适用范围 |
|---|---|---|
LLM_PROVIDER |
LLM 提供商 | 必填 |
LLM_MODEL |
模型名称 | 必填 |
QQ_OFFICIAL_APP_ID |
QQ 机器人 AppID | QQ 渠道 |
QQ_OFFICIAL_APP_SECRET |
QQ 机器人 AppSecret | QQ 渠道 |
FEISHU_APP_ID |
飞书应用 ID | 飞书渠道 |
FEISHU_APP_SECRET |
飞书应用密钥 | 飞书渠道 |
DINGTALK_CLIENT_ID |
钉钉应用 Client ID | 钉钉渠道 |
DINGTALK_CLIENT_SECRET |
钉钉应用密钥 | 钉钉渠道 |
DEEPSEEK_API_KEY |
DeepSeek API Key | deepseek |
OPENAI_API_KEY |
OpenAI API Key | openai |
ANTHROPIC_API_KEY |
Anthropic API Key | anthropic |
AMAP_API_KEY |
高德地图 API Key | 地图服务 |
TAVILY_API_KEY |
Tavily API Key | 搜索服务 |
# 网关配置
gateway:
host: "0.0.0.0"
port: 18789 # WebSocket 端口
httpPort: 18793 # HTTP API 端口
# Runner 配置
runner:
host: "127.0.0.1"
port: 18790
# 渠道配置
channels:
qq-official: { ... }
feishu: { ... }
dingtalk: { ... }
# 功能开关
features:
streamOutput: true
messageReference: true
multiAgentRouting: true
# 第三方服务
services:
amap: { ... }
tavily: { ... }
# 记忆系统配置
memory:
data_dir: "./data/memory"
workspace_dir: "./data/workspace"
embedding_provider: "default"
embedding_model: "all-MiniLM-L6-v2"
chroma_persist_dir: "./data/chroma"
conversation_max_messages: 100
semantic_top_k: 5
working_memory_ttl: 3600
enable_markdown_memory: true
# 技能系统配置
skills:
skill_paths:
- "./skills"
- "./runner/src/skills/builtin"
auto_reload: true
# 安全配置
security:
bash:
allowed: ["git", "npm", "node", "python", "pip", "ls", "dir", "pwd"]
forbidden: ["rm -rf /", "sudo", "curl.*|sh"]
timeout: 30000
file:
workspace: "./test_data"
maxFileSize: 10485760- PC 控制指令仅在本地执行,不会暴露到公网
- 文件管理有路径白名单限制
- Bash 命令有允许/禁止列表
- 危险操作需要确认
- API 密钥存储在本地
.env文件 - 对话记忆本地 JSONL 存储
- 语义记忆本地 ChromaDB 存储
- 截图仅保存在本地指定目录
- 创建
skills/my_skill/SKILL.md:
---
name: my_skill
version: 1.0.0
description: 我的技能描述
triggers:
- type: command
pattern: /我的技能
- type: keyword
pattern: 关键词1
tools: []
priority: normal
---
# 我的技能
## 描述
技能功能描述...
## 示例
用户:/我的技能 参数
助手:执行结果...- 技能自动加载,无需重启
技能文件规范:
- 技能文件必须放在子目录中,命名为
SKILL.md - 支持命令触发(
type: command)和关键词触发(type: keyword) - 优先级可选:
low,normal,high,critical - 可通过
tools字段声明需要的工具
- 继承
BaseTool:
from src.tools.base import BaseTool
from src.tools.schema import ToolSchema, ToolParameter, ToolCategory
class MyTool(BaseTool):
def __init__(self):
super().__init__(
name="my_tool",
description="工具描述",
schema=ToolSchema(
category=ToolCategory.FILE,
parameters=[
ToolParameter(
name="param",
type="string",
description="参数描述",
required=True
)
]
)
)
async def execute(self, **params) -> str:
# 实现逻辑
return "执行结果"- 在
ToolRegistry中注册
- 继承
BaseProvider:
from src.llm.providers.base import BaseProvider
class MyProvider(BaseProvider):
async def chat(self, messages, **kwargs) -> LLMResponse:
# 实现 API 调用
pass
async def chat_stream(self, messages, **kwargs):
# 实现流式响应
pass- 在
providers/__init__.py中注册
# Windows: 查找占用端口的进程
netstat -ano | findstr 18790
# 结束进程
taskkill /PID <PID> /F
# Linux/macOS
lsof -i :18790
kill -9 <PID>- 检查
config.yaml中的appId和appSecret是否正确 - 确认机器人已在 QQ 开放平台 启用
- 检查网络连接
- 检查应用是否已发布并启用机器人能力
- 确认事件订阅 URL 配置正确
- 检查权限是否已申请(
im:chat:readonly,im:message:send_as_bot等)
- 检查 Client ID 和 Client Secret 是否正确
- 确认应用已发布到企业内部
- 检查机器人是否已启用
- 确保 Ollama 服务已启动:
ollama serve - 检查模型是否已下载:
ollama list - 验证 API 可访问:
curl http://localhost:11434/api/tags
- 确保已安装 Pillow:
pip install Pillow - 检查截图目录是否有写入权限
- 目录不存在时会自动创建父目录
- Windows 系统需要安装 pycaw:
pip install pycaw - 确保音频设备正常工作
- 检查 Tavily API Key 是否配置正确
- 确保网络可以访问 Tavily 服务
- 查看日志获取详细错误信息
- 目前钉钉暂不支持定时自动推送日报功能
- 钉钉云盘上传需要手动触发
- 如需此功能,建议先使用飞书渠道,或联系开发者
欢迎提交 Issue 和 Pull Request!
- 描述 commit 信息
- 提交前运行测试
- 遵循现有代码风格
Made with ❤️ by River