🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx skills add https://skills.sh/aradotso/trending-skills/copaw-ai-assistant

💡 提示:需要 Node.js 和 NPM

CoPaw AI 助手技能

技能来自 ara.so — 每日 2026 技能合集。

CoPaw 是一个个人 AI 助手框架,你可以部署在自己的机器上或云端。它通过一个单一的代理连接多个聊天平台(钉钉、飞书、QQ、Discord、iMessage、Telegram、Mattermost、Matrix、MQTT),支持自定义 Python 技能、定时 Cron 任务、本地和云端 LLM,并提供一个位于 http://127.0.0.1:8088/ 的 Web 控制台。


安装

pip(如果 Python 3.10–3.13 可用,推荐)

pip install copaw
copaw init --defaults    # 使用合理的默认值进行非交互式设置
copaw app                # 启动 Web 控制台 + 后端

脚本安装(无需设置 Python)

macOS / Linux:

curl -fsSL https://copaw.agentscope.io/install.sh | bash
# 启用 Ollama 支持:
curl -fsSL https://copaw.agentscope.io/install.sh | bash -s -- --extras ollama
# 多个扩展功能:
curl -fsSL https://copaw.agentscope.io/install.sh | bash -s -- --extras ollama,llamacpp

Windows CMD:

curl -fsSL https://copaw.agentscope.io/install.bat -o install.bat && install.bat

Windows PowerShell:

irm https://copaw.agentscope.io/install.ps1 | iex

脚本安装后,打开一个新的终端:

copaw init --defaults
copaw app

从源码安装

git clone https://github.com/agentscope-ai/CoPaw.git
cd CoPaw
pip install -e ".[dev]"
copaw init --defaults
copaw app

CLI 参考

copaw init                  # 交互式工作区设置
copaw init --defaults       # 非交互式设置
copaw app                   # 启动控制台 (http://127.0.0.1:8088/)
copaw app --port 8090       # 使用自定义端口
copaw --help                # 列出所有命令

工作区结构

运行 copaw init 后,会创建一个工作区(默认路径:~/.copaw/workspace/):

~/.copaw/workspace/
├── config.yaml          # 代理、提供商、频道配置
├── skills/              # 自定义技能文件(自动加载)
│   └── my_skill.py
├── memory/              # 对话记忆存储
└── logs/                # 运行时日志

配置 (config.yaml)

copaw init 会生成此文件。可以直接编辑或使用控制台 UI。

LLM 提供商(OpenAI 兼容)

providers:
  - id: openai-main
    type: openai
    api_key: ${OPENAI_API_KEY}        # 使用环境变量引用
    model: gpt-4o
    base_url: https://api.openai.com/v1

  - id: local-ollama
    type: ollama
    model: llama3.2
    base_url: http://localhost:11434

代理设置

agent:
  name: CoPaw
  language: en                        # en, zh, ja, 等等
  provider_id: openai-main
  context_limit: 8000

频道:钉钉

channels:
  - type: dingtalk
    app_key: ${DINGTALK_APP_KEY}
    app_secret: ${DINGTALK_APP_SECRET}
    agent_id: ${DINGTALK_AGENT_ID}
    mention_only: true                # 在群组中仅当被 @ 时回复

频道:飞书

channels:
  - type: feishu
    app_id: ${FEISHU_APP_ID}
    app_secret: ${FEISHU_APP_SECRET}
    mention_only: false

频道:Discord

channels:
  - type: discord
    token: ${DISCORD_BOT_TOKEN}
    mention_only: true

频道:Telegram

channels:
  - type: telegram
    token: ${TELEGRAM_BOT_TOKEN}

频道:QQ

channels:
  - type: qq
    uin: ${QQ_UIN}
    password: ${QQ_PASSWORD}

频道:Mattermost

channels:
  - type: mattermost
    url: ${MATTERMOST_URL}
    token: ${MATTERMOST_TOKEN}
    team: my-team

频道:Matrix

channels:
  - type: matrix
    homeserver: ${MATRIX_HOMESERVER}
    user_id: ${MATRIX_USER_ID}
    access_token: ${MATRIX_ACCESS_TOKEN}

自定义技能

技能是放置在 ~/.copaw/workspace/skills/ 中的 Python 文件。它们会在 CoPaw 启动时自动加载——无需注册步骤。

最小技能结构

# ~/.copaw/workspace/skills/weather.py

SKILL_NAME = "get_weather"
SKILL_DESCRIPTION = "获取城市的当前天气"

# 工具模式(OpenAI 函数调用格式)
SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "城市名称,例如 '东京'"
                }
            },
            "required": ["city"]
        }
    }
}


def get_weather(city: str) -> str:
    """获取给定城市的天气数据。"""
    import os
    import requests

    api_key = os.environ["OPENWEATHER_API_KEY"]
    url = f"https://api.openweathermap.org/data/2.5/weather"
    resp = requests.get(url, params={"q": city, "appid": api_key, "units": "metric"})
    resp.raise_for_status()
    data = resp.json()
    temp = data["main"]["temp"]
    desc = data["weather"][0]["description"]
    return f"{city}: {temp}°C, {desc}"

支持异步的技能

# ~/.copaw/workspace/skills/summarize_url.py

SKILL_NAME = "summarize_url"
SKILL_DESCRIPTION = "获取并总结一个 URL 的内容"

SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {
            "type": "object",
            "properties": {
                "url": {"type": "string", "description": "要总结的 URL"}
            },
            "required": ["url"]
        }
    }
}


async def summarize_url(url: str) -> str:
    import httpx

    async with httpx.AsyncClient(timeout=15) as client:
        resp = await client.get(url)
        text = resp.text[:4000]   # 为适应上下文限制进行截断
    return f"来自 {url} 的内容预览:\n{text}"

返回结构化数据的技能

# ~/.copaw/workspace/skills/list_files.py

import os
import json

SKILL_NAME = "list_files"
SKILL_DESCRIPTION = "列出目录中的文件"

SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {
            "type": "object",
            "properties": {
                "path": {
                    "type": "string",
                    "description": "绝对或相对目录路径"
                },
                "extension": {
                    "type": "string",
                    "description": "按扩展名过滤,例如 '.py'。可选。"
                }
            },
            "required": ["path"]
        }
    }
}


def list_files(path: str, extension: str = "") -> str:
    entries = os.listdir(os.path.expanduser(path))
    if extension:
        entries = [e for e in entries if e.endswith(extension)]
    return json.dumps(sorted(entries))

Cron / 定时任务

config.yaml 中定义 cron 任务,按计划运行技能并将结果推送到频道:

cron:
  - id: daily-digest
    schedule: "0 8 * * *"            # 每天 08:00
    skill: get_weather
    skill_args:
      city: "Tokyo"
    channel_id: dingtalk-main         # 匹配下面的频道 ID
    message_template: "早上好!今天的天气:{result}"

  - id: hourly-news
    schedule: "0 * * * *"
    skill: fetch_tech_news
    channel_id: discord-main

本地模型设置

Ollama

# 安装 Ollama: https://ollama.ai
ollama pull llama3.2
ollama serve   # 在 http://localhost:11434 启动
# config.yaml
providers:
  - id: ollama-local
    type: ollama
    model: llama3.2
    base_url: http://localhost:11434

LM Studio

providers:
  - id: lmstudio-local
    type: lmstudio
    model: lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF
    base_url: http://localhost:1234/v1

llama.cpp(需要额外扩展)

pip install "copaw[llamacpp]"
providers:
  - id: llamacpp-local
    type: llamacpp
    model_path: /path/to/model.gguf

工具防护(安全)

工具防护会阻止有风险的工具调用,并在执行前需要用户批准。在 config.yaml 中配置:

agent:
  tool_guard:
    enabled: true
    risk_patterns:
      - "rm -rf"
      - "DROP TABLE"
      - "os.system"
    auto_approve_low_risk: true

当调用被阻止时,控制台会显示批准提示。用户可以在工具运行前批准或拒绝。


Token 用量跟踪

Token 用量会被自动跟踪,并在控制台仪表板中可见。以编程方式访问:

# 在技能或调试脚本中
from copaw.telemetry import get_usage_summary

summary = get_usage_summary()
print(summary)
# {'total_tokens': 142300, 'prompt_tokens': 98200, 'completion_tokens': 44100, 'by_provider': {...}}

环境变量

在运行 copaw app 之前设置这些变量,或在 config.yaml 中引用为 ${VAR_NAME}

# LLM 提供商
export OPENAI_API_KEY=...
export ANTHROPIC_API_KEY=...

# 频道
export DINGTALK_APP_KEY=...
export DINGTALK_APP_SECRET=...
export DINGTALK_AGENT_ID=...

export FEISHU_APP_ID=...
export FEISHU_APP_SECRET=...

export DISCORD_BOT_TOKEN=...
export TELEGRAM_BOT_TOKEN=...

export QQ_UIN=...
export QQ_PASSWORD=...

export MATTERMOST_URL=...
export MATTERMOST_TOKEN=...

export MATRIX_HOMESERVER=...
export MATRIX_USER_ID=...
export MATRIX_ACCESS_TOKEN=...

# 自定义技能密钥
export OPENWEATHER_API_KEY=...

常见模式

模式:向钉钉发送早报

# config.yaml 摘录
channels:
  - id: dingtalk-main
    type: dingtalk
    app_key: ${DINGTALK_APP_KEY}
    app_secret: ${DINGTALK_APP_SECRET}
    agent_id: ${DINGTALK_AGENT_ID}

cron:
  - id: morning-brief
    schedule: "30 7 * * 1-5"         # 工作日 07:30
    skill: daily_briefing
    channel_id: dingtalk-main
# skills/daily_briefing.py
SKILL_NAME = "daily_briefing"
SKILL_DESCRIPTION = "编制包含天气和新闻的早报"

SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {"type": "object", "properties": {}, "required": []}
    }
}

def daily_briefing() -> str:
    import os, requests, datetime

    today = datetime.date.today().strftime("%A, %B %d")
    # 在此处添加你自己的数据源
    return f"早上好!今天是 {today}。祝你度过高效的一天!"

模式:多频道广播

# skills/broadcast.py
SKILL_NAME = "broadcast_message"
SKILL_DESCRIPTION = "向所有已配置的频道发送消息"

SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {
            "type": "object",
            "properties": {
                "message": {"type": "string", "description": "要广播的消息"}
            },
            "required": ["message"]
        }
    }
}

def broadcast_message(message: str) -> str:
    # CoPaw 处理路由;返回消息,让代理传递它
    return f"[广播] {message}"

模式:文件摘要技能

# skills/summarize_file.py
SKILL_NAME = "summarize_file"
SKILL_DESCRIPTION = "读取并总结本地文件"

SKILL_SCHEMA = {
    "type": "function",
    "function": {
        "name": SKILL_NAME,
        "description": SKILL_DESCRIPTION,
        "parameters": {
            "type": "object",
            "properties": {
                "file_path": {"type": "string", "description": "文件的绝对路径"}
            },
            "required": ["file_path"]
        }
    }
}

def summarize_file(file_path: str) -> str:
    import os

    path = os.path.expanduser(file_path)
    if not os.path.exists(path):
        return f"文件未找到: {path}"

    with open(path, "r", encoding="utf-8", errors="ignore") as f:
        content = f.read(8000)

    return f"文件: {path}\n大小: {os.path.getsize(path)} 字节\n内容预览:\n{content}"

故障排除

无法在 8088 端口访问控制台

# 使用不同的端口
copaw app --port 8090

# 检查是否有其他进程在使用 8088
lsof -i :8088    # macOS/Linux
netstat -ano | findstr :8088   # Windows

技能未加载

  • 确认技能文件位于 ~/.copaw/workspace/skills/
  • 确认 SKILL_NAMESKILL_DESCRIPTIONSKILL_SCHEMA 和处理函数都在模块级别定义
  • 检查 ~/.copaw/workspace/logs/ 中的导入错误
  • 添加新技能文件后重启 copaw app

频道未收到消息

  1. 验证凭证设置正确(环境变量或 config.yaml
  2. 检查控制台 → 频道页面的连接状态
  3. 对于钉钉/飞书/Discord 且 mention_only: true,必须 @ 机器人
  4. Discord 消息超过 2000 个字符会自动拆分——确保机器人具有 发送消息 权限

LLM 提供商连接失败

# 从 CLI 测试提供商(控制台 → 提供商 → 测试连接)
# 或检查日志:
tail -f ~/.copaw/workspace/logs/copaw.log
  • 对于 Ollama:确认 ollama serve 正在运行,且 base_url 匹配
  • 对于 OpenAI 兼容 API:确认 base_url/v1 结尾
  • LLM 调用会自动以指数退避重试——临时故障会自动解决

Windows 编码问题

# 为 CMD 设置 UTF-8 编码
chcp 65001

或在环境中设置:

export PYTHONIOENCODING=utf-8

重置工作区

# 重新初始化工作区(保留 skills/)
copaw init

# 完全重置(具有破坏性)
rm -rf ~/.copaw/workspace
copaw init --defaults

ModelScope 云部署

一键云部署,无需本地设置:

  1. 访问 ModelScope CoPaw Studio
  2. 将工作室复刻到你的账户
  3. 在工作室设置中设置环境变量
  4. 启动工作室——控制台可通过工作室 URL 访问

关键链接

📄 原始文档

完整文档(英文):

https://skills.sh/aradotso/trending-skills/copaw-ai-assistant

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。