CowAgent Documentation

Open-source super AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-model, multi-channel.

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy CowAgent on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name cowagent -p 9899:9899 --restart always zhayujie/chatgpt-on-wechat
Configured Services & Ports
⚙️ chatgpt-on-wechat
image: zhayujie/chatgpt-on-wechat
🔌 Ports: 9899:9899
docker-compose.yml
yaml (docker-compose.yml)
version: '2.0'
services:
  chatgpt-on-wechat:
    image: zhayujie/chatgpt-on-wechat
    container_name: chatgpt-on-wechat
    security_opt:
      - seccomp:unconfined
    ports:
      - "9899:9899"
    environment:
      COW_LANG: 'auto'
      # Empty: web console only. Multiple: 'web, weixin, feishu'
      CHANNEL_TYPE: ''
      # Empty: deepseek-flash
      MODEL: ''
      DEEPSEEK_API_KEY: ''
      DEEPSEEK_API_BASE: 'https://api.deepseek.com/v1'
      MINIMAX_API_KEY: ''
      ZHIPU_AI_API_KEY: ''
      ARK_API_KEY: ''
      MOONSHOT_API_KEY: ''
      DASHSCOPE_API_KEY: ''
      CLAUDE_API_KEY: ''
      CLAUDE_API_BASE: 'https://api.anthropic.com/v1'
      OPEN_AI_API_KEY: ''
      OPEN_AI_API_BASE: 'https://api.openai.com/v1'
      GEMINI_API_KEY: ''
      GEMINI_API_BASE: 'https://generativelanguage.googleapis.com'
      VOICE_TO_TEXT: 'openai'
      TEXT_TO_VOICE: 'openai'
      VOICE_REPLY_VOICE: 'False'
      SPEECH_RECOGNITION: 'True'
      GROUP_SPEECH_RECOGNITION: 'False'
      USE_LINKAI: 'False'
      LINKAI_API_KEY: ''
      LINKAI_APP_CODE: ''
      FEISHU_APP_ID: ''
      FEISHU_APP_SECRET: ''
      DINGTALK_CLIENT_ID: ''
      DINGTALK_CLIENT_SECRET: ''
      WECOM_BOT_ID: ''
      WECOM_BOT_SECRET: ''
      # To access the web console from the host, set this to '0.0.0.0' and set WEB_PASSWORD
      WEB_HOST: '127.0.0.1'
      WEB_PASSWORD: ''
      AGENT: 'True'
      # Container is already an isolation boundary, so the agent runs unconfined inside it
      AGENT_PERMISSION_MODE: 'full-access'
      AGENT_MAX_CONTEXT_TOKENS: 50000
      AGENT_MAX_CONTEXT_TURNS: 20
      AGENT_MAX_STEPS: 20
      SELF_EVOLUTION_ENABLED: 'True'
      # Writable data root (config.json, run.log, credentials) — kept separate
      # from the workspace so it survives image upgrades / container recreation.
      COW_DATA_DIR: '/home/agent/.cow'
    volumes:
      # Workspace: skills, memory, knowledge, mcp.json, conversation artifacts
      - ./cow:/home/agent/cow
      # Data root: config.json, run.log, credentials
      - ./cow-data:/home/agent/.cow

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
bash <(curl -fsSL https://cdn.link-ai.tech/code/cow/run.sh)

Windows (PowerShell):

powershell
irm https://cdn.link-ai.tech/code/cow/run.ps1 | iex

Docker:

bash
curl -O https://cdn.link-ai.tech/code/cow/docker-compose.yml
docker compose up -d

Once 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_host to 0.0.0.0 in config.json to make the console reachable from outside, and set web_password to protect it. Don't forget to open port 9899 in your firewall or security group.

📖 Detailed guides: Quick Start · Install from Source · Upgrade

After installation, manage the service with the cow CLI:

bash
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 ✅ ✅ ✅ ✅
WeChat ✅ ✅ ✅ ✅
Feishu / Lark ✅ ✅ ✅ ✅ ✅
DingTalk ✅ ✅ ✅ ✅ ✅
WeCom Bot ✅ ✅ ✅ ✅ ✅
QQ ✅ ✅ ✅ ✅
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
bash
/skill list                   # list installed skills
/skill search <keyword>        # search the marketplace
/skill install <name>          # one-click install

Learn 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:

  • 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

  1. 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.
  2. 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.
  3. 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 表达式重复执行
  • 🔧 动态工具调用: 定时执行其他工具并发送结果(如搜索新闻、查询天气等)
  • 📋 任务管理: 查询、启用、禁用、删除任务

安装依赖

bash
pip install croniter>=2.0.0

使用方法

1. 创建定时任务

Agent 可以通过自然语言创建定时任务,支持两种类型:

1.1 静态消息任务

发送预定义的消息:

示例对话:

text
用户: 每天早上9点提醒我开会
Agent: [调用 scheduler 工具]
      action: create
      name: 每日开会提醒
      message: 该开会了!
      schedule_type: cron
      schedule_value: 0 9 * * *

1.2 动态工具调用任务

定时执行工具并发送结果:

示例对话:

text
用户: 每天早上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 表达式:

text
0 9 * * *      # 每天 9:00
0 */2 * * *    # 每 2 小时
30 8 * * 1-5   # 工作日 8:30
0 0 1 * *      # 每月 1 号

固定间隔 (`interval`)

以秒为单位的间隔:

text
3600           # 每小时
86400          # 每天
1800           # 每 30 分钟

一次性任务 (`once`)

指定具体时间(ISO 格式):

text
2024-12-25T09:00:00
2024-12-31T23:59:59

3. 查询任务列表

text
用户: 查看我的定时任务
Agent: [调用 scheduler 工具]
      action: list

4. 查看任务详情

text
用户: 查看任务 abc123 的详情
Agent: [调用 scheduler 工具]
      action: get
      task_id: abc123

5. 删除任务

text
用户: 删除任务 abc123
Agent: [调用 scheduler 工具]
      action: delete
      task_id: abc123

6. 启用/禁用任务

text
用户: 暂停任务 abc123
Agent: [调用 scheduler 工具]
      action: disable
      task_id: abc123

用户: 恢复任务 abc123
Agent: [调用 scheduler 工具]
      action: enable
      task_id: abc123

任务存储

任务保存在 JSON 文件中:

text
~/cow/scheduler/tasks.json

任务数据结构:

静态消息任务:

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

动态工具调用任务:

json
{
  "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. 每日提醒(静态消息)

text
用户: 每天早上8点提醒我吃药
Agent: ✅ 定时任务创建成功
       任务ID: a1b2c3d4
       调度: 每天 8:00
       消息: 该吃药了!

2. 工作日提醒(静态消息)

text
用户: 工作日下午6点提醒我下班
Agent: [创建 cron: 0 18 * * 1-5]
       消息: 该下班了!

3. 倒计时提醒(静态消息)

text
用户: 1小时后提醒我
Agent: [创建 interval: 3600]

4. 每日日程推送(动态工具调用)

text
用户: 每天早上8点帮我读取今日日程
Agent: ✅ 定时任务创建成功
       任务ID: schedule001
       调度: 每天 8:00
       工具: read(file_path='~/cow/schedule.txt')
       前缀: 📅 今日日程

5. 定时文件备份(动态工具调用)

text
用户: 每天晚上11点备份工作文件
Agent: [创建 cron: 0 23 * * *]
       工具: bash(command='cp ~/cow/work.txt ~/cow/backup/work_$(date +%Y%m%d).txt')
       前缀: ✅ 文件已备份

6. 周报提醒(静态消息)

text
用户: 每周五下午5点提醒我写周报
Agent: [创建 cron: 0 17 * * 5]
       消息: 📊 该写周报了!

4. 特定日期提醒

text
用户: 12月25日早上9点提醒我圣诞快乐
Agent: [创建 once: 2024-12-25T09:00:00]

注意事项

  1. 时区: 使用系统本地时区
  2. 精度: 检查间隔为 30 秒,实际执行可能有 ±30 秒误差
  3. 持久化: 任务保存在文件中,重启后自动恢复
  4. 一次性任务: 执行后自动禁用,不会删除(可手动删除)
  5. 错误处理: 执行失败会记录错误,不影响其他任务

技术实现

  • TaskStore: 任务持久化存储
  • SchedulerService: 后台调度服务
  • SchedulerTool: Agent 工具接口
  • Integration: 与 AgentBridge 集成

依赖

  • croniter: Cron 表达式解析(轻量级,仅 ~50KB)

File: channel/feishu/README.md

飞书Channel使用说明

飞书Channel支持两种事件接收模式,可以根据部署环境灵活选择。

模式对比

模式 适用场景 优点 缺点
webhook 生产环境 稳定可靠,官方推荐 需要公网IP或域名
websocket 本地开发 无需公网IP,开发便捷 需要额外依赖

配置说明

基础配置

在 config.json 中添加以下配置:

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 ID
  • feishu_app_secret: 飞书应用的App Secret
  • feishu_token: 事件订阅的Verification Token
  • feishu_bot_name: 机器人名称(用于群聊@判断)
  • feishu_event_mode: 事件接收模式,可选值:
    • "websocket": 长连接模式(默认)
    • "webhook": HTTP服务器模式
  • feishu_port: webhook模式下的HTTP服务端口(默认9891)

模式一: Webhook模式(推荐生产环境)

1. 配置

json
{
  "feishu_event_mode": "webhook",
  "feishu_port": 9891
}

2. 启动服务

bash
python3 app.py

服务将在 http://0.0.0.0:9891 启动。

3. 配置飞书应用

  1. 登录飞书开放平台
  2. 进入应用详情 -> 事件订阅
  3. 选择 将事件发送至开发者服务器
  4. 填写请求地址: http://your-domain:9891/
  5. 添加事件: im.message.receive_v1 (接收消息v2.0) 和 im.message.recalled_v1 (消息撤回)
  6. 保存配置

4. 注意事项

  • 需要有公网IP或域名
  • 确保防火墙开放对应端口
  • 建议使用HTTPS(需要配置反向代理)

模式二: WebSocket模式(推荐本地开发)

1. 安装依赖

bash
pip install lark-oapi

2. 配置

json
{
  "feishu_event_mode": "websocket"
}

3. 启动服务

bash
python3 app.py

程序将自动建立与飞书开放平台的长连接。

4. 配置飞书应用

  1. 登录飞书开放平台
  2. 进入应用详情 -> 事件订阅
  3. 选择 使用长连接接收事件
  4. 添加事件: im.message.receive_v1 (接收消息v2.0) 和 im.message.recalled_v1 (消息撤回)
  5. 保存配置

5. 注意事项

  • 无需公网IP
  • 需要能访问公网(建立WebSocket连接)
  • 每个应用最多50个连接
  • 集群模式下消息随机分发到一个客户端

平滑迁移

从webhook模式切换到websocket模式(或反向切换):

  1. 修改 config.json 中的 feishu_event_mode
  2. 如果切换到websocket模式,安装 lark-oapi 依赖
  3. 重启服务
  4. 在飞书开放平台修改事件订阅方式

重要: 同一时间只能使用一种模式,否则会导致消息重复接收。

消息去重机制

两种模式都使用相同的消息去重机制:

  • 使用 ExpiredDict 存储已处理的消息ID
  • 过期时间: 7.1小时
  • 确保消息不会重复处理

故障排查

WebSocket模式连接失败

text
[FeiShu] lark_oapi not installed

解决: 安装依赖 pip install lark-oapi

SSL证书验证失败

text
[Lark][ERROR] connect failed, err:[SSL:CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain

原因: 网络环境中存在自签名证书或SSL中间人代理(如企业代理、VPN等)

解决: 程序会自动检测SSL证书验证失败,并自动重试禁用证书验证的连接。无需手动配置。

当遇到证书错误时,日志会显示:

text
[FeiShu] SSL certificate verification disabled due to certificate error. This may happen when using corporate proxy or self-signed certificates.

这是正常现象,程序会自动处理并继续运行。

Webhook模式端口被占用

text
Address already in use

解决: 修改 feishu_port 配置或关闭占用端口的进程

收不到消息

  1. 检查飞书应用的事件订阅配置
  2. 确认已添加 im.message.receive_v1 和 im.message.recalled_v1 事件
  3. 检查应用权限: 需要 im:message 权限
  4. 查看日志中的错误信息

开发建议

  • 本地开发: 使用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 微信客服接入文档。

一、接入流程概览

text
┌─────────────────────┐    ┌─────────────────────┐    ┌──────────────────┐
│ 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`)

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。

四、运行

bash
python app.py

启动后日志里会看到:

text
[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
bash
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
python
"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.连接个人微信

选择我的企业,点击微信插件,下面有个邀请关注的二维码。微信扫码后,即可在微信中看到对应企业,在这里你便可以和机器人沟通。

向机器人发送消息,如果日志里出现报错:

bash
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,扫描下方的二维码会自动邀请你来体验。

text
---

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