File: README.md
CowAgent is an open-source super AI assistant that proactively plans tasks, controls your computer and external services, creates and runs Skills, builds a personal knowledge base and long-term memory, and grows alongside you through self-evolution — a reference implementation of Agent Harness engineering.
CowAgent is lightweight, easy to deploy, and built to extend. Plug in any major LLM provider and run it 24/7 on a personal computer or server, across the web and all major IM platforms.
🎬 Demo
🌟 Highlights
| Capability | Description |
|---|---|
| Planning | Decomposes complex tasks and executes them step by step, looping over tools until the goal is reached |
| Memory | Three-tier architecture (context → daily → core), automatic Deep Dream distillation, hybrid keyword + vector retrieval |
| Knowledge | Auto-curates structured knowledge into a Markdown wiki, builds an evolving knowledge graph with visual browsing |
| Evolution | Self-Evolution reviews conversations automatically to improve skills, follow up on unfinished tasks, and consolidate memory and knowledge, growing through everyday use |
| Skills | One-click install from Skill Hub, GitHub, ClawHub; or create custom skills via natural-language conversation |
| Tools | Built-in file I/O, terminal, browser, scheduler, memory retrieval, web search, and 10+ more tools — with native MCP integration |
| Channels | Integrates with Web, WeChat, Feishu, DingTalk, WeCom, QQ, Official Accounts, Telegram, and Slack |
| Multimodal | First-class support for text, images, voice, and files — recognition, generation, and delivery |
| Models | Claude, GPT, Gemini, DeepSeek, Qwen, GLM, Kimi, MiniMax, Doubao, and more — swap providers from the Web console with one click |
| Deploy | One-line installer, unified Web console, multiple deployment modes (local, Docker, server) |
🏗️ Architecture
CowAgent is a complete Agent Harness: messages flow in through Channels; the Agent Core plans and reasons over memory, knowledge, and the available tools and skills; Models generate the response, which is sent back through the originating channel. Every layer is decoupled and independently extensible.
Read more in Architecture.
🚀 Quick Start
A one-line installer takes care of dependencies, configuration, and startup:
Linux / macOS:
bash <(curl -fsSL https://cdn.link-ai.tech/code/cow/run.sh)Windows (PowerShell):
irm https://cdn.link-ai.tech/code/cow/run.ps1 | iexDocker:
curl -O https://cdn.link-ai.tech/code/cow/docker-compose.yml
docker compose up -dOnce started, open http://localhost:9899 to access the Web console — your one-stop hub to chat with the Agent, configure models, connect channels, and install skills.
Deploying on a server? Set
web_hostto0.0.0.0inconfig.jsonto make the console reachable from outside, and setweb_passwordto protect it. Don't forget to open port9899in your firewall or security group.
📖 Detailed guides: Quick Start · Install from Source · Upgrade
After installation, manage the service with the cow CLI:
cow start | stop | restart # service control
cow status | logs # status and logs
cow update # pull latest code and restart
cow skill install <name> # install a skill
cow install-browser # install browser automation💻 Desktop client: download the CowAgent Desktop client (macOS / Windows) — the backend is bundled, ready to use out of the box.
🤖 Models
CowAgent supports all mainstream LLM providers. Chat, vision, image generation, ASR/TTS, and embeddings can each be routed to a different vendor. Providers are configured directly in the Web console — no manual file editing required.
| Provider | Featured Models | Chat | Vision | Image Gen | ASR | TTS | Embedding |
|---|---|---|---|---|---|---|---|
| DeepSeek | deepseek-v4-flash / pro | ✅ | |||||
| Claude | claude-opus-5 / sonnet-5 | ✅ | ✅ | ||||
| OpenAI | gpt-5.6 series | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Gemini | gemini-3.7-flash | ✅ | ✅ | ✅ | |||
| MiniMax | MiniMax-M3 | ✅ | ✅ | ✅ | ✅ | ||
| GLM | glm-5.3, glm-5v-turbo | ✅ | ✅ | ✅ | ✅ | ||
| Qwen | qwen3.8-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Kimi | kimi-k3 | ✅ | ✅ | ||||
| Doubao | doubao-seed-2.1 series | ✅ | ✅ | ✅ | ✅ | ||
| ERNIE | ernie-5.1 | ✅ | ✅ | ||||
| MiMo | mimo-v2.5 / pro | ✅ | ✅ | ✅ | |||
| LinkAI | One key for 100+ models | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Custom | Local models / third-party proxy | ✅ |
For details on each provider, see the Models overview.
💬 Channels
A single Agent instance can serve multiple channels in parallel. Most channels can be onboarded right from the Web console.
| Channel | Text | Image | File | Voice | Group |
|---|---|---|---|---|---|
| Web Console (default) | ✅ | ✅ | ✅ | ✅ | |
| Telegram | ✅ | ✅ | ✅ | ✅ | ✅ |
| Slack | ✅ | ✅ | ✅ | ✅ | |
| Discord | ✅ | ✅ | ✅ | ✅ | |
| ✅ | ✅ | ✅ | ✅ | ||
| Feishu / Lark | ✅ | ✅ | ✅ | ✅ | ✅ |
| DingTalk | ✅ | ✅ | ✅ | ✅ | ✅ |
| WeCom Bot | ✅ | ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ | ||
| WeCom App | ✅ | ✅ | ✅ | ✅ | |
| WeChat Customer Service | ✅ | ✅ | ✅ | ✅ | |
| WeChat Official Account | ✅ | ✅ | ✅ |
See the Channels overview for setup details.
The Web console is the default channel and the unified entry point to configure models, channels, skills, memory, and more.
🧠 Memory & Knowledge Base
Long-term memory uses a three-tier architecture: conversation context (short-term) → daily memory (mid-term) → MEMORY.md (long-term). A nightly Deep Dream pass distills scattered memories into refined long-term entries and a narrative journal. See Long-term Memory · Deep Dream.
Personal knowledge base complements the time-ordered memory by organizing structured knowledge by topic. The Agent automatically curates valuable information from conversations, maintains cross-references and indexes, and the Web console offers an interactive knowledge-graph view. See Personal Knowledge Base.
🔧 Tools & Skills
Tools are atomic capabilities the Agent uses to interact with system resources. Skills are higher-level workflows defined by a manifest file that compose multiple tools to accomplish complex tasks.
Tool System
Built-in tools cover file I/O (read / write / edit / ls), terminal (bash), file sending (send), memory retrieval (memory), environment variables (env_config), web fetching (web_fetch), scheduling (scheduler), web search (web_search), vision (vision), and browser automation (browser).
MCP protocol integrates the open ecosystem of Model Context Protocol servers. A single mcp.json is enough — supports stdio / SSE transports, hot reload, and zero-code integration.
Learn more: Tools overview · MCP integration.
Skills System
- Skill Hub — open skill marketplace: browse, search, install in one click
- GitHub / ClawHub / URL and more — install skills from any source
- Conversational authoring — generate custom skills through dialogue with
skill-creator; turn any workflow or third-party API into a reusable skill
/skill list # list installed skills
/skill search <keyword> # search the marketplace
/skill install <name> # one-click installLearn more: Skills overview · Creating Skills.
🏷 Changelog
2026.08.20: v2.1.7 — Multiple workspaces, session-level permission modes, task notifications, desktop improvements, plus new model support.
2026.08.12: v2.1.6 — Sub agents for parallel task delegation, reasoning-effort settings, a pluggable memory vector backend, plus experience and security improvements.
2026.07.29: v2.1.5 — Workspace with file preview, core tool improvements (file search, write-time validation, background commands), context compaction (
/compact), one-click prompt optimization, security hardening.
2026.07.20: v2.1.4 — Desktop experience improvements, MCP OAuth authorization, Lark channel enhancements, scheduler improvements and data backup, new models.
2026.07.08: v2.1.3 — Desktop client for macOS / Windows, knowledge base document management, on-demand MCP tool retrieval, Traditional Chinese support, new models.
2026.06.18: v2.1.2 — Web console upgrades (scheduled task management, knowledge base categories, multiple custom model providers), Self-Evolution improvements, new models (kimi-k2.7-code, glm-5.2), security hardening and refinements.
2026.06.09: v2.1.1 — Self-Evolution, Web console upgrades (message management, parallel sessions), cross-platform MCP enhancements with concurrent calls, new models (MiniMax-M3, qwen3.7-plus), Python 3.13 support.
2026.06.01: v2.1.0 — Internationalization, new channels (Telegram, Discord, Slack, WeChat Customer Service), CLI interaction upgrades, streamlined one-line install, MCP Streamable HTTP support, new models (claude-opus-4-8, MiMo).
Full history: Release Notes
🤝 Community & Support
Join our Discord server to ask questions, share skills, and follow development:
You can also file an issue on GitHub, or scan the QR code below to join our WeChat group:
🔗 Related Projects
- Cow Skill Hub — open skill marketplace for AI Agents; works with CowAgent, OpenClaw, Claude Code, and more
- bot-on-anything — lightweight LLM application framework with integrations for Slack, Telegram, Discord, Gmail, and more
- AgentMesh — open-source multi-agent framework for solving complex problems through team collaboration
🏢 Enterprise Services
LinkAI is an all-in-one AI Agent platform for enterprises and developers, offering managed hosting and enterprise-grade support for CowAgent:
- 🚀 Zero-deployment hosted runtime — spin up a CowAgent online assistant in under a minute, no server required
- 🧠 Agent infrastructure — unified access to LLMs, knowledge bases, databases, skills, and workflows; plug-and-play building blocks that extend what CowAgent can do
- 🏢 Team & enterprise features — workspaces, role-based access, audit logs, and private deployment for production use cases
For enterprise inquiries: [email protected] or scan the QR code to reach our team on WeChat.
🛠️ Development & Contributing
All kinds of contributions are welcome — new features, bug fixes, performance improvements, docs, or sharing your own skills on the Skill Hub. See CONTRIBUTING.md to get started, then open an Issue to discuss or send a PR directly.
⭐ Star the project to show your support, and Watch → Custom → Releases to get notified of new versions. PRs and Issues are always welcome.
🌟 Contributors
⚠️ Disclaimer
- This project is licensed under the MIT License and is intended for technical research and learning. You are responsible for complying with applicable laws and regulations in your jurisdiction; the maintainers assume no liability for any consequences arising from use of this project.
- Cost & safety: Agent mode consumes substantially more tokens than regular chat — pick models that balance quality and cost. The Agent has access to your local operating system, so only deploy it in trusted environments.
- CowAgent is a pure open-source project and does not participate in, authorize, or issue any cryptocurrency.
📌 Project Renaming Notice
This project was previously named chatgpt-on-wechat and is now officially CowAgent. The old GitHub URL redirects automatically; existing users may optionally run git remote set-url origin https://github.com/zhayujie/CowAgent.git to update the local remote.
File: agent/tools/scheduler/README.md
定时任务工具 (Scheduler Tool)
功能简介
定时任务工具允许 Agent 创建、管理和执行定时任务,支持:
- ⏰ 定时提醒: 在指定时间发送消息
- 🔄 周期性任务: 按固定间隔或 cron 表达式重复执行
- 🔧 动态工具调用: 定时执行其他工具并发送结果(如搜索新闻、查询天气等)
- 📋 任务管理: 查询、启用、禁用、删除任务
安装依赖
pip install croniter>=2.0.0使用方法
1. 创建定时任务
Agent 可以通过自然语言创建定时任务,支持两种类型:
1.1 静态消息任务
发送预定义的消息:
示例对话:
用户: 每天早上9点提醒我开会
Agent: [调用 scheduler 工具]
action: create
name: 每日开会提醒
message: 该开会了!
schedule_type: cron
schedule_value: 0 9 * * *1.2 动态工具调用任务
定时执行工具并发送结果:
示例对话:
用户: 每天早上8点帮我读取一下今日日程
Agent: [调用 scheduler 工具]
action: create
name: 每日日程
tool_call:
tool_name: read
tool_params:
file_path: ~/cow/schedule.txt
result_prefix: 📅 今日日程
schedule_type: cron
schedule_value: 0 8 * * *工具调用参数说明:
tool_name: 要调用的工具名称(如bash、read、write等内置工具)tool_params: 工具的参数(字典格式)result_prefix: 可选,在结果前添加的前缀文本
注意: 如果要使用 skills(如 bocha-search),需要通过 bash 工具调用 skill 脚本
2. 支持的调度类型
Cron 表达式 (`cron`)
使用标准 cron 表达式:
0 9 * * * # 每天 9:00
0 */2 * * * # 每 2 小时
30 8 * * 1-5 # 工作日 8:30
0 0 1 * * # 每月 1 号固定间隔 (`interval`)
以秒为单位的间隔:
3600 # 每小时
86400 # 每天
1800 # 每 30 分钟一次性任务 (`once`)
指定具体时间(ISO 格式):
2024-12-25T09:00:00
2024-12-31T23:59:593. 查询任务列表
用户: 查看我的定时任务
Agent: [调用 scheduler 工具]
action: list4. 查看任务详情
用户: 查看任务 abc123 的详情
Agent: [调用 scheduler 工具]
action: get
task_id: abc1235. 删除任务
用户: 删除任务 abc123
Agent: [调用 scheduler 工具]
action: delete
task_id: abc1236. 启用/禁用任务
用户: 暂停任务 abc123
Agent: [调用 scheduler 工具]
action: disable
task_id: abc123
用户: 恢复任务 abc123
Agent: [调用 scheduler 工具]
action: enable
task_id: abc123任务存储
任务保存在 JSON 文件中:
~/cow/scheduler/tasks.json任务数据结构:
静态消息任务:
{
"id": "abc123",
"name": "每日提醒",
"enabled": true,
"created_at": "2024-01-01T10:00:00",
"updated_at": "2024-01-01T10:00:00",
"schedule": {
"type": "cron",
"expression": "0 9 * * *"
},
"action": {
"type": "send_message",
"content": "该开会了!",
"receiver": "wxid_xxx",
"receiver_name": "张三",
"is_group": false,
"channel_type": "wechat"
},
"next_run_at": "2024-01-02T09:00:00",
"last_run_at": "2024-01-01T09:00:00"
}动态工具调用任务:
{
"id": "def456",
"name": "每日日程",
"enabled": true,
"created_at": "2024-01-01T10:00:00",
"updated_at": "2024-01-01T10:00:00",
"schedule": {
"type": "cron",
"expression": "0 8 * * *"
},
"action": {
"type": "tool_call",
"tool_name": "read",
"tool_params": {
"file_path": "~/cow/schedule.txt"
},
"result_prefix": "📅 今日日程",
"receiver": "wxid_xxx",
"receiver_name": "张三",
"is_group": false,
"channel_type": "wechat"
},
"next_run_at": "2024-01-02T08:00:00"
}后台服务
定时任务由后台服务 SchedulerService 管理:
- 每 30 秒检查一次到期任务
- 自动执行到期任务
- 计算下次执行时间
- 记录执行历史和错误
服务在 Agent 初始化时自动启动,无需手动配置。
接收者确定
定时任务会发送给创建任务时的对话对象:
- 如果在私聊中创建,发送给该用户
- 如果在群聊中创建,发送到该群
- 接收者信息在创建时自动保存
常见用例
1. 每日提醒(静态消息)
用户: 每天早上8点提醒我吃药
Agent: ✅ 定时任务创建成功
任务ID: a1b2c3d4
调度: 每天 8:00
消息: 该吃药了!2. 工作日提醒(静态消息)
用户: 工作日下午6点提醒我下班
Agent: [创建 cron: 0 18 * * 1-5]
消息: 该下班了!3. 倒计时提醒(静态消息)
用户: 1小时后提醒我
Agent: [创建 interval: 3600]4. 每日日程推送(动态工具调用)
用户: 每天早上8点帮我读取今日日程
Agent: ✅ 定时任务创建成功
任务ID: schedule001
调度: 每天 8:00
工具: read(file_path='~/cow/schedule.txt')
前缀: 📅 今日日程5. 定时文件备份(动态工具调用)
用户: 每天晚上11点备份工作文件
Agent: [创建 cron: 0 23 * * *]
工具: bash(command='cp ~/cow/work.txt ~/cow/backup/work_$(date +%Y%m%d).txt')
前缀: ✅ 文件已备份6. 周报提醒(静态消息)
用户: 每周五下午5点提醒我写周报
Agent: [创建 cron: 0 17 * * 5]
消息: 📊 该写周报了!4. 特定日期提醒
用户: 12月25日早上9点提醒我圣诞快乐
Agent: [创建 once: 2024-12-25T09:00:00]注意事项
- 时区: 使用系统本地时区
- 精度: 检查间隔为 30 秒,实际执行可能有 ±30 秒误差
- 持久化: 任务保存在文件中,重启后自动恢复
- 一次性任务: 执行后自动禁用,不会删除(可手动删除)
- 错误处理: 执行失败会记录错误,不影响其他任务
技术实现
- TaskStore: 任务持久化存储
- SchedulerService: 后台调度服务
- SchedulerTool: Agent 工具接口
- Integration: 与 AgentBridge 集成
依赖
croniter: Cron 表达式解析(轻量级,仅 ~50KB)
File: channel/feishu/README.md
飞书Channel使用说明
飞书Channel支持两种事件接收模式,可以根据部署环境灵活选择。
模式对比
| 模式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| webhook | 生产环境 | 稳定可靠,官方推荐 | 需要公网IP或域名 |
| websocket | 本地开发 | 无需公网IP,开发便捷 | 需要额外依赖 |
配置说明
基础配置
在 config.json 中添加以下配置:
{
"channel_type": "feishu",
"feishu_app_id": "cli_xxxxx",
"feishu_app_secret": "your_app_secret",
"feishu_token": "your_verification_token",
"feishu_bot_name": "你的机器人名称",
"feishu_event_mode": "webhook",
"feishu_port": 9891
}配置项说明
feishu_app_id: 飞书应用的App IDfeishu_app_secret: 飞书应用的App Secretfeishu_token: 事件订阅的Verification Tokenfeishu_bot_name: 机器人名称(用于群聊@判断)feishu_event_mode: 事件接收模式,可选值:"websocket": 长连接模式(默认)"webhook": HTTP服务器模式
feishu_port: webhook模式下的HTTP服务端口(默认9891)
模式一: Webhook模式(推荐生产环境)
1. 配置
{
"feishu_event_mode": "webhook",
"feishu_port": 9891
}2. 启动服务
python3 app.py服务将在 http://0.0.0.0:9891 启动。
3. 配置飞书应用
- 登录飞书开放平台
- 进入应用详情 -> 事件订阅
- 选择 将事件发送至开发者服务器
- 填写请求地址:
http://your-domain:9891/ - 添加事件:
im.message.receive_v1(接收消息v2.0) 和im.message.recalled_v1(消息撤回) - 保存配置
4. 注意事项
- 需要有公网IP或域名
- 确保防火墙开放对应端口
- 建议使用HTTPS(需要配置反向代理)
模式二: WebSocket模式(推荐本地开发)
1. 安装依赖
pip install lark-oapi2. 配置
{
"feishu_event_mode": "websocket"
}3. 启动服务
python3 app.py程序将自动建立与飞书开放平台的长连接。
4. 配置飞书应用
- 登录飞书开放平台
- 进入应用详情 -> 事件订阅
- 选择 使用长连接接收事件
- 添加事件:
im.message.receive_v1(接收消息v2.0) 和im.message.recalled_v1(消息撤回) - 保存配置
5. 注意事项
- 无需公网IP
- 需要能访问公网(建立WebSocket连接)
- 每个应用最多50个连接
- 集群模式下消息随机分发到一个客户端
平滑迁移
从webhook模式切换到websocket模式(或反向切换):
- 修改
config.json中的feishu_event_mode - 如果切换到websocket模式,安装
lark-oapi依赖 - 重启服务
- 在飞书开放平台修改事件订阅方式
重要: 同一时间只能使用一种模式,否则会导致消息重复接收。
消息去重机制
两种模式都使用相同的消息去重机制:
- 使用
ExpiredDict存储已处理的消息ID - 过期时间: 7.1小时
- 确保消息不会重复处理
故障排查
WebSocket模式连接失败
[FeiShu] lark_oapi not installed解决: 安装依赖 pip install lark-oapi
SSL证书验证失败
[Lark][ERROR] connect failed, err:[SSL:CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain原因: 网络环境中存在自签名证书或SSL中间人代理(如企业代理、VPN等)
解决: 程序会自动检测SSL证书验证失败,并自动重试禁用证书验证的连接。无需手动配置。
当遇到证书错误时,日志会显示:
[FeiShu] SSL certificate verification disabled due to certificate error. This may happen when using corporate proxy or self-signed certificates.这是正常现象,程序会自动处理并继续运行。
Webhook模式端口被占用
Address already in use解决: 修改 feishu_port 配置或关闭占用端口的进程
收不到消息
- 检查飞书应用的事件订阅配置
- 确认已添加
im.message.receive_v1和im.message.recalled_v1事件 - 检查应用权限: 需要
im:message权限 - 查看日志中的错误信息
开发建议
- 本地开发: 使用websocket模式,快速迭代
- 测试环境: 可以使用webhook模式 + 内网穿透工具(如ngrok)
- 生产环境: 使用webhook模式,配置正式域名和HTTPS
参考文档
File: channel/web/README.md
Web Channel
提供了一个默认的AI对话页面,可展示文本、图片等消息交互,支持markdown语法渲染,兼容插件执行。
使用说明
- 在
config.json配置文件中的channel_type字段填入web - 程序运行后将监听9899端口,浏览器访问 http://localhost:9899/chat 即可使用
- 监听端口可以在配置文件
web_port中自定义 - 对于Docker运行方式,如果需要外部访问,需要在
docker-compose.yml中通过 ports配置将端口监听映射到宿主机
File: channel/wechat_kf/README.md
微信客服(WeChat Customer Service)通道
与
channel/wechatcom/(企微自建应用)是两个独立的 CoW 通道:
- 自建应用:面向企业内部成员(员工通过企业微信 App 与机器人对话)。
- 微信客服:面向外部微信用户(普通微信用户通过链接/二维码进入对话)。
但底层都基于"企微自建应用"——本通道是通过把一个企微自建应用绑定到微信客服账号来实现 AI 接管对外咨询,详见 LinkAI 微信客服接入文档。
一、接入流程概览
┌─────────────────────┐ ┌─────────────────────┐ ┌──────────────────┐
│ 1. 企业微信后台 │ → │ 2. CoW 配置回调 │ → │ 3. 绑定微信客服 │
│ 创建一个自建应用 │ │ 端口 9888 │ │ 账号 │
└─────────────────────┘ └─────────────────────┘ └──────────────────┘
↓
外部微信用户通过
链接/二维码 →
消息 → CoW Bot重要:建议单独再创建一个企微自建应用用于微信客服,不要复用已经接入员工内部使用的那个
wechatcom_app应用,否则两个通道会争抢同一个回调地址。
二、企业微信后台配置
1. 创建企微自建应用
进入 企业微信管理后台 → 应用管理 → 创建应用。
2. 收集字段
| 字段 | 来源 | 对应 CoW 配置项 |
|---|---|---|
| 企业ID(CorpId) | 「我的企业」最下方 | wechat_kf_corp_id |
| Secret | 进入应用详情 → 点击「查看」(会推送到管理员手机端,在手机上查看) | wechat_kf_secret |
| Token | 应用「接收消息 → 设置API接收」 | wechat_kf_token |
| EncodingAESKey | 应用「接收消息 → 设置API接收」 | wechat_kf_aes_key |
AgentId 在本通道不需要(消息发送走的是
cgi-bin/kf/send_msg,不依赖 agent_id)。
3. 配置回调地址 + 可信 IP
在应用「接收消息 → 设置API接收」里填:
- URL:
http://<your-host>:9888/wxkf/(公网必须可达) - Token / EncodingAESKey:与下方
config.json一致
回到应用详情页,把服务器公网 IP 填入「企业可信IP」。
4. 绑定微信客服账号
进入 企业微信后台 → 微信客服 → 创建客服账号 → 将该账号绑定到上一步创建的企微自建应用。
绑定完成后,进入 微信客服 → 微信客服账号详情 页面,在「接入链接」一栏:
- 「复制链接」可拿到形如
https://work.weixin.qq.com/kfid/kfcd83e5896b9ba07be的访问链接 - 「生成二维码」可拿到对应二维码
把链接或二维码推给微信客户使用即可。
三、CoW 配置(`config.json`)
{
"channel_type": "wechat_kf",
"wechat_kf_corp_id": "ww1234567890abcdef",
"wechat_kf_secret": "<企微应用的 Secret>",
"wechat_kf_token": "<接收消息 Token>",
"wechat_kf_aes_key": "<EncodingAESKey>",
"wechat_kf_port": 9888
}| 字段 | 说明 |
|---|---|
wechat_kf_corp_id |
企业 ID |
wechat_kf_secret |
绑定到微信客服的那个企微自建应用的 Secret |
wechat_kf_token |
该应用「接收消息」配置的 Token |
wechat_kf_aes_key |
该应用「接收消息」配置的 EncodingAESKey |
wechat_kf_port |
监听端口,默认 9888 |
也支持环境变量:WECHAT_KF_CORP_ID / WECHAT_KF_SECRET / WECHAT_KF_TOKEN / WECHAT_KF_AES_KEY。
四、运行
python app.py启动后日志里会看到:
[wechat_kf] WeCom customer-service channel started
[wechat_kf] Listening on http://0.0.0.0:9888/wxkf/回到企微后台「设置API接收」点击保存——会触发 GET /wxkf/?...&echostr=...,CoW 通过 crypto.check_signature 校验后返回明文 echostr,验证成功。
五、支持的回复类型
| ReplyType | 是否支持 | 备注 |
|---|---|---|
TEXT / INFO / ERROR |
✅ | 自动按 2048 字节切片分段发送 |
IMAGE(本地) / IMAGE_URL(网络) |
✅ | 大图自动压缩到 10MB 以内 |
VOICE |
✅ | 转 amr 后发送,>60s 自动切片 |
VIDEO_URL |
✅ | 通过临时素材接口上传 |
FILE |
✅ |
六、参考文档
File: channel/wechatcom/README.md
企业微信应用号channel
企业微信官方提供了客服、应用等API,本channel使用的是企业微信的自建应用API的能力。
因为未来可能还会开发客服能力,所以本channel的类型名叫作wechatcom_app。
wechatcom_app channel支持插件系统和图片声音交互等能力,除了无法加入群聊,作为个人使用的私人助理已绰绰有余。
开始之前
- 在企业中确认自己拥有在企业内自建应用的权限。
- 如果没有权限或者是个人用户,也可创建未认证的企业。操作方式:登录手机企业微信,选择
创建/加入企业来创建企业,类型请选择企业,企业名称可随意填写。
未认证的企业有100人的服务人数上限,其他功能与认证企业没有差异。
本channel需安装的依赖与公众号一致,需要安装wechatpy和web.py,它们包含在requirements-optional.txt中。
此外,如果你是Linux系统,除了ffmpeg还需要安装amr编码器,否则会出现找不到编码器的错误,无法正常使用语音功能。
- Ubuntu/Debian
apt-get install libavcodec-extra- Alpine
需自行编译ffmpeg,在编译参数里加入amr编码器的支持
使用方法
1.查看企业ID
- 扫码登陆企业微信后台
- 选择
我的企业,点击企业信息,记住该企业ID
2.创建自建应用
- 选择应用管理, 在自建区选创建应用来创建企业自建应用
- 上传应用logo,填写应用名称等项
- 创建应用后进入应用详情页面,记住
AgentId和Secert
3.配置应用
- 在详情页点击
企业可信IP的配置(没看到可以不管),填入你服务器的公网IP,如果不知道可以先不填 - 点击
接收消息下的启用API接收消息 URL填写格式为http://url:port/wxcomapp,port是程序监听的端口,默认是9898
如果是未认证的企业,url可直接使用服务器的IP。如果是认证企业,需要使用备案的域名,可使用二级域名。Token可随意填写,停留在这个页面- 在程序根目录
config.json中增加配置(去掉注释),wechatcomapp_aes_key是当前页面的wechatcomapp_aes_key
"channel_type": "wechatcom_app",
"wechatcom_corp_id": "", # 企业微信公司的corpID
"wechatcomapp_token": "", # 企业微信app的token
"wechatcomapp_port": 9898, # 企业微信app的服务端口, 不需要端口转发
"wechatcomapp_secret": "", # 企业微信app的secret
"wechatcomapp_agent_id": "", # 企业微信app的agent_id
"wechatcomapp_aes_key": "", # 企业微信app的aes_key- 运行程序,在页面中点击保存,保存成功说明验证成功
4.连接个人微信
选择我的企业,点击微信插件,下面有个邀请关注的二维码。微信扫码后,即可在微信中看到对应企业,在这里你便可以和机器人沟通。
向机器人发送消息,如果日志里出现报错:
Error code: 60020, message: "not allow to access from your ip, ...from ip: xx.xx.xx.xx"意思是IP不可信,需要参考上一步的企业可信IP配置,把这里的IP加进去。
### Railway部署方式(2023-06-08已失效)
公众号不能在Railway上部署,但企业微信应用可以!
填写配置后,将部署完成后的网址**.railway.app/wxcomapp,填写在上一步的URL中。发送信息后观察日志,把报错的IP加入到可信IP。(每次重启后都需要加入可信IP)
## 测试体验
AIGC开放社区中已经部署了多个可免费使用的Bot,扫描下方的二维码会自动邀请你来体验。
---
## File: channel/wechatmp/README.md
# 微信公众号channel
微信公众号channel,提供稳定的服务。
目前支持订阅号和服务号两种类型的公众号,它们都支持文本交互,语音和图片输入。其中个人主体的微信订阅号由于无法通过微信认证,存在回复时间限制,每天的图片和声音回复次数也有限制。
## 使用方法(订阅号,服务号类似)
在开始部署前,你需要一个拥有公网IP的服务器,以提供微信服务器和我们自己服务器的连接。或者你需要进行内网穿透,否则微信服务器无法将消息发送给我们的服务器。
此外,需要在我们的服务器上安装python的web框架web.py和wechatpy。
以ubuntu为例(在ubuntu 22.04上测试):
```
pip3 install web.py
pip3 install wechatpy
```
然后在[微信公众平台](https://mp.weixin.qq.com)注册一个自己的公众号,类型选择订阅号,主体为个人即可。
然后根据[接入指南](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html)的说明,在[微信公众平台](https://mp.weixin.qq.com)的“设置与开发”-“基本配置”-“服务器配置”中填写服务器地址`URL`和令牌`Token`。`URL`填写格式为`http://url/wx`,可使用IP(成功几率看脸),`Token`是你自己编的一个特定的令牌。消息加解密方式如果选择了需要加密的模式,需要在配置中填写`wechatmp_aes_key`。
相关的服务器验证代码已经写好,你不需要再添加任何代码。你只需要在本项目根目录的`config.json`中添加
```
"channel_type": "wechatmp", # 如果通过了微信认证,将"wechatmp"替换为"wechatmp_service",可极大的优化使用体验
"wechatmp_token": "xxxx", # 微信公众平台的Token
"wechatmp_port": 8080, # 微信公众平台的端口,需要端口转发到80或443
"wechatmp_app_id": "xxxx", # 微信公众平台的appID
"wechatmp_app_secret": "xxxx", # 微信公众平台的appsecret
"wechatmp_aes_key": "", # 微信公众平台的EncodingAESKey,加密模式需要
"single_chat_prefix": [""], # 推荐设置,任意对话都可以触发回复,不添加前缀
"single_chat_reply_prefix": "", # 推荐设置,回复不设置前缀
"plugin_trigger_prefix": "&", # 推荐设置,在手机微信客户端中,$%^等符号与中文连在一起时会自动显示一段较大的间隔,用户体验不好。请不要使用管理员指令前缀"#",这会造成未知问题。
```
然后运行`python3 app.py`启动web服务器。这里会默认监听8080端口,但是微信公众号的服务器配置只支持80/443端口,有两种方法来解决这个问题。第一个是推荐的方法,使用端口转发命令将80端口转发到8080端口:
```
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables-save > /etc/iptables/rules.v4
```
第二个方法是让python程序直接监听80端口,在配置文件中设置`"wechatmp_port": 80` ,在linux上需要使用`sudo python3 app.py`启动程序。然而这会导致一系列环境和权限问题,因此不是推荐的方法。
443端口同理,注意需要支持SSL,也就是https的访问,在`wechatmp_channel.py`中需要修改相应的证书路径。
程序启动并监听端口后,在刚才的“服务器配置”中点击`提交`即可验证你的服务器。
随后在[微信公众平台](https://mp.weixin.qq.com)启用服务器,关闭手动填写规则的自动回复,即可实现ChatGPT的自动回复。
之后需要在公众号开发信息下将本机IP加入到IP白名单。
不然在启用后,发送语音、图片等消息可能会遇到如下报错:
```
'errcode': 40164, 'errmsg': 'invalid ip xx.xx.xx.xx not in whitelist rid
```
## 个人微信公众号的限制
由于人微信公众号不能通过微信认证,所以没有客服接口,因此公众号无法主动发出消息,只能被动回复。而微信官方对被动回复有5秒的时间限制,最多重试2次,因此最多只有15秒的自动回复时间窗口。因此如果问题比较复杂或者我们的服务器比较忙,ChatGPT的回答就没办法及时回复给用户。为了解决这个问题,这里做了回答缓存,它需要你在回复超时后,再次主动发送任意文字(例如1)来尝试拿到回答缓存。为了优化使用体验,目前设置了两分钟(120秒)的timeout,用户在至多两分钟后即可得到查询到回复或者错误原因。
另外,由于微信官方的限制,自动回复有长度限制。因此这里将ChatGPT的回答进行了拆分,以满足限制。
## 私有api_key
公共api有访问频率限制(免费账号每分钟最多3次ChatGPT的API调用),这在服务多人的时候会遇到问题。因此这里多加了一个设置私有api_key的功能。目前通过godcmd插件的命令来设置私有api_key。
## 语音输入
利用微信自带的语音识别功能,提供语音输入能力。需要在公众号管理页面的“设置与开发”->“接口权限”页面开启“接收语音识别结果”。
## 语音回复
请在配置文件中添加以下词条:
```
"voice_reply_voice": true,
```
这样公众号将会用语音回复语音消息,实现语音对话。
默认的语音合成引擎是`google`,它是免费使用的。
如果要选择其他的语音合成引擎,请添加以下配置项:
```
"text_to_voice": "pytts"
```
pytts是本地的语音合成引擎。还支持baidu,azure,这些你需要自行配置相关的依赖和key。
如果使用pytts,在ubuntu上需要安装如下依赖:
```
sudo apt update
sudo apt install espeak
sudo apt install ffmpeg
python3 -m pip install pyttsx3
```
不是很建议开启pytts语音回复,因为它是离线本地计算,算的慢会拖垮服务器,且声音不好听。
## 图片回复
现在认证公众号和非认证公众号都可以实现的图片和语音回复。但是非认证公众号使用了永久素材接口,每天有1000次的调用上限(每个月有10次重置机会,程序中已设定遇到上限会自动重置),且永久素材库存也有上限。因此对于非认证公众号,我们会在回复图片或者语音消息后的10秒内从永久素材库存内删除该素材。
## 测试
目前在`RoboStyle`这个公众号上进行了测试(基于[wechatmp分支](https://github.com/JS00000/chatgpt-on-wechat/tree/wechatmp)),感兴趣的可以关注并体验。开启了godcmd, Banwords, role, dungeon, finish这五个插件,其他的插件还没有详尽测试。百度的接口暂未测试。[wechatmp-stable分支](https://github.com/JS00000/chatgpt-on-wechat/tree/wechatmp-stable)是较稳定的上个版本,但也缺少最新的功能支持。
## TODO
- [x] 语音输入
- [x] 图片输入
- [x] 使用临时素材接口提供认证公众号的图片和语音回复
- [x] 使用永久素材接口提供未认证公众号的图片和语音回复
- [ ] 高并发支持
---
## File: desktop/README.md
# CowAgent Desktop
Cross-platform desktop client for CowAgent, built with Electron + React + TypeScript.
## Development
### Prerequisites
- Node.js 18+
- npm or yarn
- Python 3.7+ (for the backend)
### Setup
```bash
cd desktop
npm install
```
### Run in Development
Start the renderer dev server and Electron together:
```bash
npm run dev
```
Or run them separately:
```bash
# Terminal 1: Start Vite dev server
npm run dev:renderer
# Terminal 2: Start Electron (after renderer is ready)
npm run dev:main
```
The app will automatically start the Python backend from the parent directory.
### Build
```bash
# Build for current platform
npm run dist
# Build for macOS only
npm run dist:mac
# Build for Windows only
npm run dist:win
```
Build outputs are placed in the `release/` directory.
## Architecture
```
desktop/
├── src/
│ ├── main/ # Electron main process
│ │ ├── index.ts # Window management, IPC
│ │ ├── python-manager.ts # Python backend lifecycle
│ │ └── preload.ts # Context bridge for renderer
│ └── renderer/ # React UI (Vite)
│ └── src/
│ ├── api/ # HTTP client for backend APIs
│ ├── components/ # Reusable UI components
│ ├── hooks/ # React hooks
│ ├── pages/ # Page components
│ └── types.ts # TypeScript types
├── resources/ # App icons
├── package.json # Dependencies and build config
└── vite.config.ts # Vite config
```
### How it Works
1. Electron main process starts and creates the app window
2. It spawns the Python backend (`app.py`) as a child process
3. The React UI communicates with the Python backend via HTTP APIs
4. SSE (Server-Sent Events) is used for streaming chat responses and live logs
---
## File: docs/cli/general.mdx
---
title: General Commands
---
The following commands can be used in chat with the `/` prefix or in the terminal with the `cow` prefix (some are chat-only).
<Tip>
In the Web console, typing `/` brings up an autocomplete menu with keyboard navigation and Tab completion.
</Tip>
## help
Show help information for all available commands.
```text
/help
```
## status
View current session and service status, including process info, model configuration, message count, and loaded skills.
```text
/status
```
## cancel
Abort the agent task currently running in this session. When the agent is busy with a long task (e.g. multi-turn tool calls or a long streaming response), send `/cancel` and the agent will stop before the next tool execution. Available across all channels — Web, WeChat, WeCom, Feishu, etc.
```text
/cancel
```
## steer
Redirect the Agent task currently running in this session without cancelling it. The instruction is injected at the next safe checkpoint; a tool that is already running may finish, while tools that have not started are skipped. If no task is active, `/steer` does not start or queue a new one. Available across all chat channels.
```text
/steer focus on the failing tests first
```
In the Web console, enter an instruction while a reply is running and click **Steer active task**. Sending an ordinary message still uses the session queue.
## config
View or modify runtime configuration. Changes take effect immediately without restarting.
**View all configurable items:**
```text
/config
```
**View a single item:**
```text
/config model
```
**Modify a config item:**
```text
/config model deepseek-v4-flash
```
**Configurable items:**
| Item | Description | Example |
| --- | --- | --- |
| `model` | AI model name | `deepseek-v4-flash` |
| `agent_max_context_tokens` | Max context tokens | `40000` |
| `agent_max_context_turns` | Max context memory turns | `30` |
| `agent_max_steps` | Max decision steps per task | `15` |
| `enable_thinking` | Enable deep thinking mode | `true` / `false` |
<Note>
When changing `model`, the system automatically matches the corresponding model API. Configuration is persisted to `config.json`.
</Note>
## context
View current session context statistics, including message count and content length.
```text
/context
```
**Clear current session context:**
```text
/clear
```
<Tip>
Clearing context makes the Agent "forget" previous conversation, useful for switching topics or freeing context space. `/context clear` still works as an alias.
</Tip>
## compact
Summarize older turns to free up context while keeping recent turns intact. Unlike automatic trimming, this runs immediately regardless of current token usage.
```text
/compact
```
<Tip>
Use `/compact` before a long task to reclaim context space without fully clearing the conversation. Recent turns and an LLM summary of older turns are retained.
</Tip>
## logs
View recent service logs. Shows the last 20 lines by default, up to 50.
```text
/logs
```
**Specify line count:**
```text
/logs 50
```
## version
Show the current CowAgent version.
```text
/version
```
---
## File: docs/cli/index.mdx
---
title: Commands Overview
---
CowAgent provides two ways to interact via commands:
- **Terminal CLI** — Run `cow <command>` in your system terminal for service management, skill management, and other operations
- **Chat Commands** — Type `/<command>` or `cow <command>` in any conversation to check status, manage skills, adjust configuration, etc.
## Cow CLI
After deploying with the one-click install script, the `cow` command is automatically available. For manual installations, run:
```bash
pip install -e .
```
Then use the `cow` command from anywhere:
```bash
cow help
```
Example output:
```
🐮 CowAgent CLI
Usage: cow <command>
Service:
start Start the CowAgent service
stop Stop the CowAgent service
restart Restart the CowAgent service
update Update code and restart service
status Show service status
logs View service logs
Skills:
skill Manage skills (list / search / install / uninstall ...)
Memory & Knowledge:
memory Memory distillation (dream)
knowledge View knowledge base stats and structure
Data portability:
backup Back up config and agent workspace
restore Restore a CowAgent backup
Others:
help Show this help message
version Show version
```
## Chat Commands
In the Web console or any connected channel, type `/` to see command suggestions. Supported commands:
| Command | Description |
| --- | --- |
| `/help` | Show command help |
| `/status` | View service status and configuration |
| `/cancel` | Abort the currently running agent task |
| `/steer ` | Guide the currently running agent task without queueing a new turn |
| `/config` | View or modify runtime configuration |
| `/skill` | Manage skills (install, uninstall, enable, disable, etc.) |
| `/memory dream [N]` | Manually trigger memory distillation (default 3 days, max 30) |
| `/knowledge` | View knowledge base statistics |
| `/knowledge list` | View knowledge base directory structure |
| `/knowledge on\|off` | Enable or disable knowledge base |
| `/context` | View current session context info |
| `/context clear` | Clear current session context |
| `/logs` | View recent logs |
| `/version` | Show version number |
<Tip>
Service management commands like `/start`, `/stop`, `/restart` will prompt you to use them in the terminal instead, as they involve process operations.
</Tip>
## Command Availability
| Command | Terminal (`cow`) | Chat (`/`) |
| --- | :---: | :---: |
| help | ✓ | ✓ |
| version | ✓ | ✓ |
| status | ✓ | ✓ |
| logs | ✓ | ✓ |
| cancel | ✗ | ✓ |
| config | ✗ | ✓ |
| context | — | ✓ |
| memory (subcommands) | ✗ | ✓ |
| knowledge (subcommands) | ✓ | ✓ |
| skill (subcommands) | ✓ | ✓ |
| start / stop / restart | ✓ | ✗ |
| update | ✓ | ✗ |
| install-browser | ✓ | ✗ |
| backup / restore | ✓ | ✗ |
<Note>
`context` only shows a hint in the terminal to use it in chat. `config` is only available in chat.
</Note>