copaw-ai-assistant
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCoPaw 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 + backendbash
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 | bashmacOS / Linux:
bash
curl -fsSL https://copaw.agentscope.io/install.sh | bashWith 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.batWindows PowerShell:
powershell
irm https://copaw.agentscope.io/install.ps1 | iexAfter script install, open a new terminal:
bash
copaw init --defaults
copaw appcurl -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.batWindows PowerShell:
powershell
irm https://copaw.agentscope.io/install.ps1 | iex脚本安装完成后,打开新终端执行:
bash
copaw init --defaults
copaw appInstall from source
从源码安装
bash
git clone https://github.com/agentscope-ai/CoPaw.git
cd CoPaw
pip install -e ".[dev]"
copaw init --defaults
copaw appbash
git clone https://github.com/agentscope-ai/CoPaw.git
cd CoPaw
pip install -e ".[dev]"
copaw init --defaults
copaw appCLI 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 commandsbash
copaw init # 交互式工作区初始化
copaw init --defaults # 非交互式初始化
copaw app # 启动控制台(地址:http://127.0.0.1:8088/)
copaw app --port 8090 # 使用自定义端口
copaw --help # 查看所有命令Workspace Structure
工作区结构
After , a workspace is created (default: ):
copaw init~/.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配置文件(config.yaml
)
config.yamlcopaw initcopaw initLLM 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:11434yaml
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:11434Agent Settings
Agent设置
yaml
agent:
name: CoPaw
language: en # en, zh, ja, etc.
provider_id: openai-main
context_limit: 8000yaml
agent:
name: CoPaw
language: en # 支持en、zh、ja等
provider_id: openai-main
context_limit: 8000Channel: 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 groupsyaml
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: falseyaml
channels:
- type: feishu
app_id: ${FEISHU_APP_ID}
app_secret: ${FEISHU_APP_SECRET}
mention_only: falseChannel: Discord
渠道:Discord
yaml
channels:
- type: discord
token: ${DISCORD_BOT_TOKEN}
mention_only: trueyaml
channels:
- type: discord
token: ${DISCORD_BOT_TOKEN}
mention_only: trueChannel: 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-teamyaml
channels:
- type: mattermost
url: ${MATTERMOST_URL}
token: ${MATTERMOST_TOKEN}
team: my-teamChannel: 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 . They are auto-loaded when CoPaw starts — no registration step needed.
~/.copaw/workspace/skills/技能为放置在目录下的Python文件,CoPaw启动时会自动加载,无需额外注册步骤。
~/.copaw/workspace/skills/Minimal skill structure
最简技能结构
python
undefinedpython
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}"undefinedSKILL_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}"undefinedSkill with async support
支持异步的技能
python
undefinedpython
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}"undefinedSKILL_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}"undefinedSkill returning structured data
返回结构化数据的技能
python
undefinedpython
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 to run skills on a schedule and push results to a channel:
config.yamlyaml
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.yamlyaml
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-mainLocal Model Setup
本地模型配置
Ollama
Ollama
bash
undefinedbash
undefinedInstall Ollama: https://ollama.ai
安装Ollama:https://ollama.ai
ollama pull llama3.2
ollama serve # starts on http://localhost:11434
```yamlollama pull llama3.2
ollama serve # 启动服务,默认地址http://localhost:11434
```yamlconfig.yaml
config.yaml
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/v1yaml
providers:
- id: lmstudio-local
type: lmstudio
model: lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF
base_url: http://localhost:1234/v1llama.cpp (extra required)
llama.cpp(需安装扩展)
bash
pip install "copaw[llamacpp]"yaml
providers:
- id: llamacpp-local
type: llamacpp
model_path: /path/to/model.ggufbash
pip install "copaw[llamacpp]"yaml
providers:
- id: llamacpp-local
type: llamacpp
model_path: /path/to/model.ggufTool Guard (Security)
工具防护(安全功能)
Tool Guard blocks risky tool calls and requires user approval before execution. Configure in :
config.yamlyaml
agent:
tool_guard:
enabled: true
risk_patterns:
- "rm -rf"
- "DROP TABLE"
- "os.system"
auto_approve_low_risk: trueWhen a call is blocked, the Console shows an approval prompt. The user can approve or deny before the tool runs.
工具防护可拦截高风险工具调用,执行前需用户确认。在中配置:
config.yamlyaml
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
undefinedIn 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 , or reference them in as :
copaw appconfig.yaml${VAR_NAME}bash
undefined在运行前设置,或在中通过引用:
copaw appconfig.yaml${VAR_NAME}bash
undefinedLLM 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
undefinedyaml
undefinedconfig.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
```pythonchannels:
- 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
```pythonskills/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!"undefinedSKILL_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!"undefinedPattern: Multi-channel broadcast
场景:多渠道消息广播
python
undefinedpython
undefinedskills/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}"
undefinedSKILL_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}"
undefinedPattern: File summarization skill
场景:文件摘要技能
python
undefinedpython
undefinedskills/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
undefinedbash
undefinedUse 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
undefinedlsof -i :8088 # macOS/Linux
netstat -ano | findstr :8088 # Windows
undefinedSkills not loading
技能未加载
- Confirm the skill file is in
~/.copaw/workspace/skills/ - Confirm ,
SKILL_NAME,SKILL_DESCRIPTION, and the handler function are all defined at module levelSKILL_SCHEMA - Check for import errors
~/.copaw/workspace/logs/ - Restart after adding new skill files
copaw app
- 确认技能文件放置在目录下
~/.copaw/workspace/skills/ - 确认、
SKILL_NAME、SKILL_DESCRIPTION以及处理函数均定义在模块顶层SKILL_SCHEMA - 查看目录下的导入错误日志
~/.copaw/workspace/logs/ - 添加新技能文件后需重启
copaw app
Channel not receiving messages
渠道未接收消息
- Verify credentials are set correctly (env vars or )
config.yaml - Check the Console → Channels page for connection status
- For DingTalk/Feishu/Discord with , the bot must be @mentioned
mention_only: true - Discord messages over 2000 characters are split automatically — ensure the bot has permission
Send Messages
- 验证凭证设置正确(环境变量或)
config.yaml - 查看控制台→渠道页面的连接状态
- 对于设置的钉钉/飞书/Discord,需@机器人才能触发响应
mention_only: true - Discord消息超过2000字符会自动拆分——确保机器人拥有权限
Send Messages
LLM provider connection fails
LLM提供商连接失败
bash
undefinedbash
undefinedTest 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 automaticallytail -f ~/.copaw/workspace/logs/copaw.log
- 对于Ollama:确认`ollama serve`已启动且`base_url`匹配
- 对于兼容OpenAI的API:验证`base_url`以`/v1`结尾
- LLM调用会自动指数退避重试——临时故障会自动恢复Windows encoding issues
Windows编码问题
cmd
undefinedcmd
undefinedSet UTF-8 encoding for CMD
为CMD设置UTF-8编码
chcp 65001
Or set in environment:
```bash
export PYTHONIOENCODING=utf-8chcp 65001
或在环境变量中设置:
```bash
export PYTHONIOENCODING=utf-8Workspace reset
工作区重置
bash
undefinedbash
undefinedReinitialize 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:
- Visit ModelScope CoPaw Studio
- Fork the studio to your account
- Set environment variables in the studio settings
- Start the studio — Console is accessible via the studio URL
无需本地配置,一键云端部署:
- 访问ModelScope CoPaw Studio
- 将Studio复刻到自己的账号
- 在Studio设置中配置环境变量
- 启动Studio——控制台可通过Studio地址访问
Key Links
关键链接
- Documentation: https://copaw.agentscope.io/
- Channel setup guides: https://copaw.agentscope.io/docs/channels
- Release notes: https://agentscope-ai.github.io/CoPaw/release-notes
- GitHub: https://github.com/agentscope-ai/CoPaw
- PyPI: https://pypi.org/project/copaw/
- Discord community: https://discord.gg/eYMpfnkG8h
- 官方文档: https://copaw.agentscope.io/
- 渠道配置指南: https://copaw.agentscope.io/docs/channels
- 版本更新日志: https://agentscope-ai.github.io/CoPaw/release-notes
- GitHub仓库: https://github.com/agentscope-ai/CoPaw
- PyPI地址: https://pypi.org/project/copaw/
- Discord社区: https://discord.gg/eYMpfnkG8h