copaw-ai-assistant

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

CoPaw AI Assistant Skill

CoPaw AI助手技能

Skill by ara.so — Daily 2026 Skills collection.
CoPaw is a personal AI assistant framework you deploy on your own machine or in the cloud. It connects to multiple chat platforms (DingTalk, Feishu, QQ, Discord, iMessage, Telegram, Mattermost, Matrix, MQTT) through a single agent, supports custom Python skills, scheduled cron jobs, local and cloud LLMs, and provides a web Console at
http://127.0.0.1:8088/
.

ara.so开发的技能——属于Daily 2026技能合集。
CoPaw是一款可部署在本地机器或云端的个人AI助手框架。它通过单个Agent连接多个聊天平台(钉钉、飞书、QQ、Discord、iMessage、Telegram、Mattermost、Matrix、MQTT),支持自定义Python技能、定时cron任务、本地及云端LLM,并提供Web控制台,访问地址为
http://127.0.0.1:8088/

Installation

安装

pip (recommended if Python 3.10–3.13 is available)

pip安装(若Python版本为3.10–3.13,推荐使用此方式)

bash
pip install copaw
copaw init --defaults    # non-interactive setup with sensible defaults
copaw app                # starts the web Console + backend
bash
pip install copaw
copaw init --defaults    # 使用合理默认值的非交互式初始化
copaw app                # 启动Web控制台 + 后端服务

Script install (no Python setup required)

脚本安装(无需预先配置Python)

macOS / Linux:
bash
curl -fsSL https://copaw.agentscope.io/install.sh | bash
macOS / Linux:
bash
curl -fsSL https://copaw.agentscope.io/install.sh | bash

With Ollama support:

带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

Multiple extras:

多扩展支持:

curl -fsSL https://copaw.agentscope.io/install.sh | bash -s -- --extras ollama,llamacpp

**Windows CMD:**
```cmd
curl -fsSL https://copaw.agentscope.io/install.bat -o install.bat && install.bat
Windows PowerShell:
powershell
irm https://copaw.agentscope.io/install.ps1 | iex
After script install, open a new terminal:
bash
copaw init --defaults
copaw app
curl -fsSL https://copaw.agentscope.io/install.sh | bash -s -- --extras ollama,llamacpp

**Windows CMD:**
```cmd
curl -fsSL https://copaw.agentscope.io/install.bat -o install.bat && install.bat
Windows PowerShell:
powershell
irm https://copaw.agentscope.io/install.ps1 | iex
脚本安装完成后,打开新终端执行:
bash
copaw init --defaults
copaw app

Install from source

从源码安装

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

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

CLI Reference

CLI参考

bash
copaw init                  # interactive workspace setup
copaw init --defaults       # non-interactive setup
copaw app                   # start the Console (http://127.0.0.1:8088/)
copaw app --port 8090       # use a custom port
copaw --help                # list all commands

bash
copaw init                  # 交互式工作区初始化
copaw init --defaults       # 非交互式初始化
copaw app                   # 启动控制台(地址:http://127.0.0.1:8088/)
copaw app --port 8090       # 使用自定义端口
copaw --help                # 查看所有命令

Workspace Structure

工作区结构

After
copaw init
, a workspace is created (default:
~/.copaw/workspace/
):
~/.copaw/workspace/
├── config.yaml          # agent, provider, channel configuration
├── skills/              # custom skill files (auto-loaded)
│   └── my_skill.py
├── memory/              # conversation memory storage
└── logs/                # runtime logs

执行
copaw init
后会创建工作区(默认路径:
~/.copaw/workspace/
):
~/.copaw/workspace/
├── config.yaml          # Agent、提供商、渠道配置文件
├── skills/              # 自定义技能文件(自动加载)
│   └── my_skill.py
├── memory/              # 对话记忆存储目录
└── logs/                # 运行时日志目录

Configuration (
config.yaml
)

配置文件(
config.yaml

copaw init
generates this file. Edit it directly or use the Console UI.
copaw init
会生成此文件,可直接编辑或通过控制台UI修改。

LLM Provider (OpenAI-compatible)

LLM提供商(兼容OpenAI)

yaml
providers:
  - id: openai-main
    type: openai
    api_key: ${OPENAI_API_KEY}        # use env var reference
    model: gpt-4o
    base_url: https://api.openai.com/v1

  - id: local-ollama
    type: ollama
    model: llama3.2
    base_url: http://localhost:11434
yaml
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 Settings

Agent设置

yaml
agent:
  name: CoPaw
  language: en                        # en, zh, ja, etc.
  provider_id: openai-main
  context_limit: 8000
yaml
agent:
  name: CoPaw
  language: en                        # 支持en、zh、ja等
  provider_id: openai-main
  context_limit: 8000

Channel: DingTalk

渠道:钉钉

yaml
channels:
  - type: dingtalk
    app_key: ${DINGTALK_APP_KEY}
    app_secret: ${DINGTALK_APP_SECRET}
    agent_id: ${DINGTALK_AGENT_ID}
    mention_only: true                # only respond when @mentioned in groups
yaml
channels:
  - type: dingtalk
    app_key: ${DINGTALK_APP_KEY}
    app_secret: ${DINGTALK_APP_SECRET}
    agent_id: ${DINGTALK_AGENT_ID}
    mention_only: true                # 仅在群聊中被@时响应

Channel: Feishu (Lark)

渠道:飞书(Lark)

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

Channel: Discord

渠道:Discord

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

Channel: Telegram

渠道:Telegram

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

Channel: QQ

渠道:QQ

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

Channel: Mattermost

渠道:Mattermost

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

Channel: Matrix

渠道:Matrix

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

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

Custom Skills

自定义技能

Skills are Python files placed in
~/.copaw/workspace/skills/
. They are auto-loaded when CoPaw starts — no registration step needed.
技能为放置在
~/.copaw/workspace/skills/
目录下的Python文件,CoPaw启动时会自动加载,无需额外注册步骤。

Minimal skill structure

最简技能结构

python
undefined
python
undefined

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

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

SKILL_NAME = "get_weather" SKILL_DESCRIPTION = "Get current weather for a city"
SKILL_NAME = "get_weather" SKILL_DESCRIPTION = "Get current weather for a city"

Tool schema (OpenAI function-calling format)

工具Schema(OpenAI函数调用格式)

SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "City name, e.g. 'Tokyo'" } }, "required": ["city"] } } }
def get_weather(city: str) -> str: """Fetch weather data for the given city.""" 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}"
undefined
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "City name, e.g. 'Tokyo'" } }, "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}"
undefined

Skill with async support

支持异步的技能

python
undefined
python
undefined

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

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

SKILL_NAME = "summarize_url" SKILL_DESCRIPTION = "Fetch and summarize the content of a URL"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "url": {"type": "string", "description": "The URL to summarize"} }, "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]   # truncate for context limit
return f"Content preview from {url}:\n{text}"
undefined
SKILL_NAME = "summarize_url" SKILL_DESCRIPTION = "Fetch and summarize the content of a URL"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "url": {"type": "string", "description": "The URL to summarize"} }, "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"Content preview from {url}:\n{text}"
undefined

Skill returning structured data

返回结构化数据的技能

python
undefined
python
undefined

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

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

import os import json
SKILL_NAME = "list_files" SKILL_DESCRIPTION = "List files in a directory"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "path": { "type": "string", "description": "Absolute or relative directory path" }, "extension": { "type": "string", "description": "Filter by extension, e.g. '.py'. Optional." } }, "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))

---
import os import json
SKILL_NAME = "list_files" SKILL_DESCRIPTION = "List files in a directory"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "path": { "type": "string", "description": "Absolute or relative directory path" }, "extension": { "type": "string", "description": "Filter by extension, e.g. '.py'. Optional." } }, "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 / Scheduled Tasks

Cron/定时任务

Define cron jobs in
config.yaml
to run skills on a schedule and push results to a channel:
yaml
cron:
  - id: daily-digest
    schedule: "0 8 * * *"            # every day at 08:00
    skill: get_weather
    skill_args:
      city: "Tokyo"
    channel_id: dingtalk-main         # matches a channel id below
    message_template: "Good morning! Today's weather: {result}"

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

config.yaml
中定义定时任务,可按计划运行技能并将结果推送到指定渠道:
yaml
cron:
  - id: daily-digest
    schedule: "0 8 * * *"            # 每天08:00执行
    skill: get_weather
    skill_args:
      city: "Tokyo"
    channel_id: dingtalk-main         # 与下方渠道ID匹配
    message_template: "Good morning! Today's weather: {result}"

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

Local Model Setup

本地模型配置

Ollama

Ollama

bash
undefined
bash
undefined

Install Ollama: https://ollama.ai

安装Ollama:https://ollama.ai

ollama pull llama3.2 ollama serve # starts on http://localhost:11434

```yaml
ollama pull llama3.2 ollama serve # 启动服务,默认地址http://localhost:11434

```yaml

config.yaml

config.yaml

providers:
undefined
providers:
undefined

LM Studio

LM Studio

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

llama.cpp (extra required)

llama.cpp(需安装扩展)

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

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

Tool Guard (Security)

工具防护(安全功能)

Tool Guard blocks risky tool calls and requires user approval before execution. Configure in
config.yaml
:
yaml
agent:
  tool_guard:
    enabled: true
    risk_patterns:
      - "rm -rf"
      - "DROP TABLE"
      - "os.system"
    auto_approve_low_risk: true
When a call is blocked, the Console shows an approval prompt. The user can approve or deny before the tool runs.

工具防护可拦截高风险工具调用,执行前需用户确认。在
config.yaml
中配置:
yaml
agent:
  tool_guard:
    enabled: true
    risk_patterns:
      - "rm -rf"
      - "DROP TABLE"
      - "os.system"
    auto_approve_low_risk: true
当调用被拦截时,控制台会显示确认提示,用户可选择批准或拒绝后再执行工具。

Token Usage Tracking

令牌使用追踪

Token usage is tracked automatically and visible in the Console dashboard. Access programmatically:
python
undefined
系统会自动追踪令牌使用情况,可在控制台仪表板查看,也可通过代码调用获取:
python
undefined

In a skill or debug script

在技能或调试脚本中使用

from copaw.telemetry import get_usage_summary
summary = get_usage_summary() print(summary)
from copaw.telemetry import get_usage_summary
summary = get_usage_summary() print(summary)

{'total_tokens': 142300, 'prompt_tokens': 98200, 'completion_tokens': 44100, 'by_provider': {...}}

{'total_tokens': 142300, 'prompt_tokens': 98200, 'completion_tokens': 44100, 'by_provider': {...}}


---

---

Environment Variables

环境变量

Set these before running
copaw app
, or reference them in
config.yaml
as
${VAR_NAME}
:
bash
undefined
在运行
copaw app
前设置,或在
config.yaml
中通过
${VAR_NAME}
引用:
bash
undefined

LLM providers

LLM提供商

export OPENAI_API_KEY=... export ANTHROPIC_API_KEY=...
export OPENAI_API_KEY=... export ANTHROPIC_API_KEY=...

Channels

聊天渠道

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 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=...

Custom skill secrets

自定义技能密钥

export OPENWEATHER_API_KEY=...

---
export OPENWEATHER_API_KEY=...

---

Common Patterns

常见使用场景

Pattern: Morning briefing to DingTalk

场景:钉钉早报推送

yaml
undefined
yaml
undefined

config.yaml excerpt

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" # weekdays 07:30 skill: daily_briefing channel_id: dingtalk-main

```python
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

```python

skills/daily_briefing.py

skills/daily_briefing.py

SKILL_NAME = "daily_briefing" SKILL_DESCRIPTION = "Compile a morning briefing with weather and news"
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")
# Add your own data sources here
return f"Good morning! Today is {today}. Have a productive day!"
undefined
SKILL_NAME = "daily_briefing" SKILL_DESCRIPTION = "Compile a morning briefing with weather and news"
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"Good morning! Today is {today}. Have a productive day!"
undefined

Pattern: Multi-channel broadcast

场景:多渠道消息广播

python
undefined
python
undefined

skills/broadcast.py

skills/broadcast.py

SKILL_NAME = "broadcast_message" SKILL_DESCRIPTION = "Send a message to all configured channels"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "message": {"type": "string", "description": "Message to broadcast"} }, "required": ["message"] } } }
def broadcast_message(message: str) -> str: # CoPaw handles routing; return the message and let the agent deliver it return f"[BROADCAST] {message}"
undefined
SKILL_NAME = "broadcast_message" SKILL_DESCRIPTION = "Send a message to all configured channels"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "message": {"type": "string", "description": "Message to broadcast"} }, "required": ["message"] } } }
def broadcast_message(message: str) -> str: # CoPaw会处理路由逻辑;返回消息后由Agent完成分发 return f"[BROADCAST] {message}"
undefined

Pattern: File summarization skill

场景:文件摘要技能

python
undefined
python
undefined

skills/summarize_file.py

skills/summarize_file.py

SKILL_NAME = "summarize_file" SKILL_DESCRIPTION = "Read and summarize a local file"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Absolute path to the file"} }, "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"File not found: {path}"

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

return f"File: {path}\nSize: {os.path.getsize(path)} bytes\nContent preview:\n{content}"

---
SKILL_NAME = "summarize_file" SKILL_DESCRIPTION = "Read and summarize a local file"
SKILL_SCHEMA = { "type": "function", "function": { "name": SKILL_NAME, "description": SKILL_DESCRIPTION, "parameters": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Absolute path to the file"} }, "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"File not found: {path}"

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

return f"File: {path}\nSize: {os.path.getsize(path)} bytes\nContent preview:\n{content}"

---

Troubleshooting

故障排查

Console not accessible at port 8088

控制台无法在8088端口访问

bash
undefined
bash
undefined

Use a different port

使用其他端口

copaw app --port 8090
copaw app --port 8090

Check if another process is using 8088

检查8088端口是否被占用

lsof -i :8088 # macOS/Linux netstat -ano | findstr :8088 # Windows
undefined
lsof -i :8088 # macOS/Linux netstat -ano | findstr :8088 # Windows
undefined

Skills not loading

技能未加载

  • Confirm the skill file is in
    ~/.copaw/workspace/skills/
  • Confirm
    SKILL_NAME
    ,
    SKILL_DESCRIPTION
    ,
    SKILL_SCHEMA
    , and the handler function are all defined at module level
  • Check
    ~/.copaw/workspace/logs/
    for import errors
  • Restart
    copaw app
    after adding new skill files
  • 确认技能文件放置在
    ~/.copaw/workspace/skills/
    目录下
  • 确认
    SKILL_NAME
    SKILL_DESCRIPTION
    SKILL_SCHEMA
    以及处理函数均定义在模块顶层
  • 查看
    ~/.copaw/workspace/logs/
    目录下的导入错误日志
  • 添加新技能文件后需重启
    copaw app

Channel not receiving messages

渠道未接收消息

  1. Verify credentials are set correctly (env vars or
    config.yaml
    )
  2. Check the Console → Channels page for connection status
  3. For DingTalk/Feishu/Discord with
    mention_only: true
    , the bot must be @mentioned
  4. Discord messages over 2000 characters are split automatically — ensure the bot has
    Send Messages
    permission
  1. 验证凭证设置正确(环境变量或
    config.yaml
  2. 查看控制台→渠道页面的连接状态
  3. 对于设置
    mention_only: true
    的钉钉/飞书/Discord,需@机器人才能触发响应
  4. Discord消息超过2000字符会自动拆分——确保机器人拥有
    Send Messages
    权限

LLM provider connection fails

LLM提供商连接失败

bash
undefined
bash
undefined

Test provider from CLI (Console → Providers → Test Connection)

通过CLI测试提供商连接(控制台→提供商→测试连接)

Or check logs:

或查看日志:

tail -f ~/.copaw/workspace/logs/copaw.log

- For Ollama: confirm `ollama serve` is running and `base_url` matches
- For OpenAI-compatible APIs: verify `base_url` ends with `/v1`
- LLM calls auto-retry with exponential backoff — transient failures resolve automatically
tail -f ~/.copaw/workspace/logs/copaw.log

- 对于Ollama:确认`ollama serve`已启动且`base_url`匹配
- 对于兼容OpenAI的API:验证`base_url`以`/v1`结尾
- LLM调用会自动指数退避重试——临时故障会自动恢复

Windows encoding issues

Windows编码问题

cmd
undefined
cmd
undefined

Set UTF-8 encoding for CMD

为CMD设置UTF-8编码

chcp 65001

Or set in environment:
```bash
export PYTHONIOENCODING=utf-8
chcp 65001

或在环境变量中设置:
```bash
export PYTHONIOENCODING=utf-8

Workspace reset

工作区重置

bash
undefined
bash
undefined

Reinitialize workspace (preserves skills/)

重新初始化工作区(保留skills/目录)

copaw init
copaw init

Full reset (destructive)

完全重置(会删除所有数据)

rm -rf ~/.copaw/workspace copaw init --defaults

---
rm -rf ~/.copaw/workspace copaw init --defaults

---

ModelScope Cloud Deployment

ModelScope云端部署

For one-click cloud deployment without local setup:
  1. Visit ModelScope CoPaw Studio
  2. Fork the studio to your account
  3. Set environment variables in the studio settings
  4. Start the studio — Console is accessible via the studio URL

无需本地配置,一键云端部署:
  1. 访问ModelScope CoPaw Studio
  2. 将Studio复刻到自己的账号
  3. 在Studio设置中配置环境变量
  4. 启动Studio——控制台可通过Studio地址访问

Key Links

关键链接