Skip to content

HeShen-1/ClawChat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ClawChat 🤖

Node.js 18+ Python 3.11+ License: MIT Platform: QQ | Feishu | DingTalk

基于 OpenClaw 架构的多渠道 AI Agent 基础设施
支持手机 QQ/飞书/钉钉远程控制 PC,集成高德地图生活服务,多 LLM 提供商支持,三层记忆系统,技能系统,AI 日报自动生成


✨ 核心特性

🤖 AI 对话能力

  • 多 LLM 提供商支持:OpenAI、Claude、DeepSeek、Kimi、智谱、千问、火山引擎、魔搭、OpenRouter、Google 等
  • 工具调用系统:文件读写、Bash 命令执行、网络请求、Tavily 搜索
  • 三层记忆架构
    • 对话记忆(JSONL 持久化存储)
    • 语义记忆(ChromaDB 向量检索)
    • 工作记忆(TTL 缓存)
  • 技能系统:支持 SKILL.md 格式技能定义,热重载

📱 多渠道消息接入

支持 QQ 官方机器人、飞书、钉钉三大平台:

平台 状态 特性
QQ 官方机器人 ✅ 已实现 群聊@触发、私聊、关键词触发
飞书 ✅ 已实现 交互卡片、AI 日报自动推送、云文档集成
钉钉 ✅ 已实现 Markdown 消息、交互卡片、云文档上传(手动触发)

🖥️ PC 远程控制

通过手机发送指令,即可远程控制电脑:

指令类别 可用指令 功能说明
系统控制 /锁屏 锁定电脑屏幕
/音量 50 设置音量(0-100)
/静音 切换静音状态
/关机 关闭系统
/重启 重启系统
文件管理 /文件列表 D:/ 查看目录文件列表
/创建文件夹 路径 创建新文件夹
/下载 URL 下载文件到电脑
信息查询 /系统状态 查看 CPU、内存、磁盘使用情况
/电池状态 查看电池电量和电源状态
/网络状态 查看网络连接信息
/进程列表 查看运行中的进程
/截图 截取屏幕并保存到指定目录

🗺️ 高德地图生活服务

  • /设置位置 地址 - 设置当前位置
  • /上网 - 搜索附近网吧,含套餐信息
  • /吃饭 - 搜索附近餐厅,含评价和推荐理由
  • /娱乐 - 搜索附近娱乐场所(KTV、棋牌室、健身房等)
  • /洗脚 - 搜索附近洗浴按摩场所
  • /咖啡 - 搜索附近咖啡馆

📰 AI 日报系统

  • 自动生成:每日自动获取 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(可选,用于本地嵌入模型)

1. 克隆项目

git clone https://github.com/yourusername/clawchat.git
cd clawchat

2. 安装依赖

# 安装 Gateway 依赖
cd gateway
npm install

# 安装 Runner 依赖
cd ../runner
pip install -e ".[dev]"

3. 配置环境变量

复制 .env.example.env

cp .env.example .env

配置 QQ 官方机器人(可选)

QQ_OFFICIAL_APP_ID=your_app_id_here
QQ_OFFICIAL_APP_SECRET=your_app_secret_here

配置飞书机器人(可选)

FEISHU_APP_ID=your_feishu_app_id_here
FEISHU_APP_SECRET=your_feishu_app_secret_here

配置钉钉机器人(可选)

DINGTALK_CLIENT_ID=your_dingtalk_client_id_here
DINGTALK_CLIENT_SECRET=your_dingtalk_client_secret_here
DINGTALK_ROBOT_CODE=your_dingtalk_robot_code_here

选择 LLM 提供商(必填)

DeepSeek(推荐)

LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=sk-...
LLM_MODEL=deepseek-chat

OpenAI

LLM_PROVIDER=openai
OPENAI_API_KEY=sk-...
LLM_MODEL=gpt-4o-mini

Ollama(本地模型)

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

4. 配置主配置文件

编辑 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}"

5. 配置 Ollama 嵌入模型(可选)

如需使用本地嵌入模型,确保 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"

6. 配置截图保存路径(可选)

编辑 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

7. 启动服务

# 终端 1: 启动 Gateway
cd gateway
npm run dev

# 终端 2: 启动 Runner
cd runner
python -m src.main

8. 测试

  • QQ 私聊:直接发送 /系统状态
  • QQ 群聊:@机器人 或发送 /系统状态
  • 飞书/钉钉:发送 /系统状态

📖 使用指南

PC 远程控制指令

系统控制

/锁屏                    # 锁定电脑屏幕
/音量 50                 # 设置音量为 50%
/静音                    # 切换静音状态
/关机                    # 关闭系统
/重启                    # 重启系统
/取消关机                # 取消正在进行的关机/重启

文件管理

/文件列表 D:/            # 查看 D 盘根目录
/创建文件夹 E:/test      # 在 E 盘创建 test 文件夹
/下载 https://example.com/file.zip  # 下载文件

信息查询

/系统状态                # 查看系统资源使用情况
/电池状态                # 查看电池信息
/网络状态                # 查看网络连接
/进程列表                # 查看运行进程
/截图                    # 截取屏幕保存到指定目录

应用控制

/打开应用 notepad        # 打开记事本
/关闭应用 chrome         # 关闭 Chrome 浏览器

生活服务指令

/设置位置 北京市海淀区    # 设置当前位置
/上网                    # 搜索附近网吧
/吃饭                    # 搜索附近餐厅
/娱乐                    # 搜索娱乐场所
/洗脚                    # 搜索洗浴按摩场所
/咖啡                    # 搜索附近咖啡馆

AI 日报指令

/日报                    # 生成今日 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)]
Loading

📁 项目结构

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                  # 项目说明

⚙️ 配置说明

环境变量 (.env)

变量 说明 适用范围
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 搜索服务

配置文件 (config.yaml)

# 网关配置
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 存储
  • 截图仅保存在本地指定目录

🛠️ 开发指南

添加新技能

  1. 创建 skills/my_skill/SKILL.md
---
name: my_skill
version: 1.0.0
description: 我的技能描述
triggers:
  - type: command
    pattern: /我的技能
  - type: keyword
    pattern: 关键词1
tools: []
priority: normal
---

# 我的技能

## 描述

技能功能描述...

## 示例

用户:/我的技能 参数
助手:执行结果...
  1. 技能自动加载,无需重启

技能文件规范:

  • 技能文件必须放在子目录中,命名为 SKILL.md
  • 支持命令触发(type: command)和关键词触发(type: keyword
  • 优先级可选:low, normal, high, critical
  • 可通过 tools 字段声明需要的工具

添加新工具

  1. 继承 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 "执行结果"
  1. ToolRegistry 中注册

添加新 LLM 提供商

  1. 继承 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
  1. providers/__init__.py 中注册

🐛 常见问题

Q: 启动时报端口被占用?

# Windows: 查找占用端口的进程
netstat -ano | findstr 18790
# 结束进程
taskkill /PID <PID> /F

# Linux/macOS
lsof -i :18790
kill -9 <PID>

Q: QQ 机器人无法连接?

  • 检查 config.yaml 中的 appIdappSecret 是否正确
  • 确认机器人已在 QQ 开放平台 启用
  • 检查网络连接

Q: 飞书机器人无法接收消息?

  • 检查应用是否已发布并启用机器人能力
  • 确认事件订阅 URL 配置正确
  • 检查权限是否已申请(im:chat:readonly, im:message:send_as_bot 等)

Q: 钉钉机器人无法连接?

  • 检查 Client ID 和 Client Secret 是否正确
  • 确认应用已发布到企业内部
  • 检查机器人是否已启用

Q: Ollama 嵌入模型无法使用?

  • 确保 Ollama 服务已启动:ollama serve
  • 检查模型是否已下载:ollama list
  • 验证 API 可访问:curl http://localhost:11434/api/tags

Q: 截图功能无法使用?

  • 确保已安装 Pillow:pip install Pillow
  • 检查截图目录是否有写入权限
  • 目录不存在时会自动创建父目录

Q: 音量控制无效?

  • Windows 系统需要安装 pycaw:pip install pycaw
  • 确保音频设备正常工作

Q: AI 日报生成失败?

  • 检查 Tavily API Key 是否配置正确
  • 确保网络可以访问 Tavily 服务
  • 查看日志获取详细错误信息

Q: 钉钉日报无法自动推送?

  • 目前钉钉暂不支持定时自动推送日报功能
  • 钉钉云盘上传需要手动触发
  • 如需此功能,建议先使用飞书渠道,或联系开发者

📜 许可证

MIT License


🤝 贡献

欢迎提交 Issue 和 Pull Request!

提交规范

  • 描述 commit 信息
  • 提交前运行测试
  • 遵循现有代码风格

🙏 致谢


Made with ❤️ by River

About

基于 OpenClaw 架构的多渠道 AI Agent 基础设施

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors