CoPaw:构建个人AI助手工作站,打通钉钉飞书实现自动化
1. 项目概述:你的个人AI助手工作站
如果你一直在寻找一个能真正“为你工作,与你一同成长”的AI助手,一个可以部署在自己电脑上、完全由你掌控,又能轻松连接钉钉、飞书、QQ等日常聊天工具,并且能力还能无限扩展的智能伙伴,那么你找对地方了。今天要深入聊的,就是这样一个名为CoPaw的开源项目。它不仅仅是一个简单的聊天机器人,更是一个个人AI助手工作站(Co Personal Agent Workstation),这个名字本身就揭示了它的定位:一个集成了多种能力、可深度定制、并能与你日常工作流无缝集成的中心化智能平台。
简单来说,CoPaw 就像一个数字世界的瑞士军刀。它允许你通过一个统一的AI大脑,去连接和管理你在不同平台上的交互。无论是让它在钉钉群里自动推送每日新闻摘要,还是在飞书上帮你整理会议纪要,甚至是在你的个人电脑上自动整理文件、总结文档,它都能胜任。更关键的是,它的所有数据、记忆和个性化设置都掌握在你手里,你可以选择在本地运行,享受完全的隐私和安全,也可以部署到云端,实现24小时不间断服务。这种“开箱即用”的便捷性与“深度可控”的灵活性相结合,正是 CoPaw 吸引众多开发者和效率追求者的核心魅力。
2. 核心设计理念与架构解析
2.1 为什么是“工作站”而非“单点工具”?
市面上的AI工具很多,有专注于对话的,有专注于文档处理的,也有各种自动化脚本。但 CoPaw 的设计哲学不同,它试图解决一个更根本的问题:AI能力的碎片化。我们每天使用的工具和平台是分散的,数据是孤立的,导致AI助手往往只能在一个特定场景下发挥作用。CoPaw 的“工作站”理念,就是建立一个统一的中控系统。
在这个系统里,AI核心(大语言模型)是大脑,“通道”(Channels)是四肢和感官,而“技能”(Skills)则是这个大脑掌握的各种工具和知识。大脑通过通道感知外部世界(接收来自钉钉、飞书等的消息),经过思考(调用模型推理),再通过技能执行具体任务(如搜索、总结、生成内容),最后通过通道反馈结果。这种架构使得功能扩展变得极其清晰:增加一个新聊天平台?开发一个通道适配器即可。想要一个新能力?编写一个技能插件就行。所有扩展都围绕这个统一的核心进行,避免了重复造轮子。
2.2 核心组件深度拆解
2.2.1 通道(Channels):连接万物的桥梁
通道是 CoPaw 与外部世界交互的接口。官方已经支持了钉钉、飞书、QQ、Discord、iMessage 等主流平台。每个通道本质上是一个双向消息网关。它的工作流程通常如下:
- 消息接收:通过平台提供的Webhook、机器人API或客户端模拟等方式,监听特定事件(如@消息、私聊、群消息)。
- 消息标准化:将来自不同平台、结构各异的消息(可能是JSON、XML或特定SDK对象),统一转换为 CoPaw 内部定义的标准化消息格式。这一步至关重要,它屏蔽了底层平台的差异性。
- 路由与处理:将标准化消息发送给核心的AI智能体(Agent)进行处理。
- 响应回传:接收AI智能体返回的响应,再将其转换回目标平台能识别的格式并发送出去。
实操心得:通道配置的坑配置钉钉、飞书等企业级应用通道时,最常遇到的问题是回调地址验证和权限配置。以钉钉机器人为例,除了在CoPaw后台填写Token和Secret,务必在钉钉开放平台正确配置“消息接收地址”(Webhook URL),并且该地址必须能被公网访问(如果是本地部署,需要内网穿透工具如ngrok或frp)。另一个常见坑点是IP白名单,如果CoPaw部署在云服务器,需要将服务器公网IP添加到钉钉机器人的IP白名单中,否则消息无法送达。
2.2.2 技能(Skills):可插拔的能力模块
技能是 CoPaw 能力的基石。你可以把它理解为一个个独立的、功能单一的“小程序”。CoPaw 采用了一种非常开发者友好的设计:技能即Python文件。你只需要在指定的工作空间目录(如~/copaw/skills)下放置一个符合规范的.py文件,CoPaw 在启动时就会自动发现并加载它。
一个最简单的技能文件结构如下:
# ~/copaw/skills/weather.py from copaw.skill import skill @skill( name="get_weather", description="获取指定城市的天气信息。", parameters={ "city": {"type": "string", "description": "城市名称,例如:北京"} } ) async def get_weather(city: str): # 这里是技能的实际逻辑,例如调用一个天气API # 模拟返回 return f"{city}的天气是晴,温度25℃。"技能设计的核心思想是“声明式”。通过@skill装饰器,你声明了这个技能的调用名称、描述和所需参数。当用户在与CoPaw对话中说“查询一下北京的天气”时,AI大脑会理解其意图,匹配到get_weather技能,并自动提取出参数city=”北京“,然后执行对应的函数。这种设计将意图识别和技能执行解耦,使得增加新功能变得非常简单。
2.2.3 记忆(Memory)与个性化:有状态的助手
一个只会机械应答的助手是缺乏实用价值的。CoPaw 引入了记忆系统,使其能够进行有上下文的、个性化的对话。记忆主要分为两类:
- 对话上下文记忆:即短期记忆,保存当前会话轮次内的对话历史。这直接决定了模型能否理解你刚才说了什么,是实现连贯对话的基础。CoPaw 通常会采用滑动窗口或摘要提炼的方式管理这部分记忆,以应对大模型有限的上下文长度。
- 长期记忆/知识库:这是实现个性化的关键。它可以存储用户的偏好(比如“我喜欢简洁的总结”)、历史信息(比如“我上周关注了AI芯片的新闻”)甚至私人文件内容。这些信息可以被技能查询和利用,从而让助手的回答更贴合你的个人需求。长期记忆的实现可以基于向量数据库(如Chroma、Milvus),将信息嵌入后存储,便于语义检索。
配置要点:在copaw init初始化时,系统会引导你设置工作目录,所有的配置、数据库文件、技能文件都会存放在这里。这意味着,只要你备份好这个目录,你的整个AI助手(包括它的记忆和配置)就可以完整地迁移到任何其他安装了CoPaw的机器上。
2.2.4 心跳(Heartbeat):自动化的触发器
“心跳”是 CoPaw 实现自动化任务的核心机制。你可以把它看作一个内置的定时任务调度器。通过配置,你可以让 CoPaw 在每天、每周或特定时间点自动执行某个技能,并将结果发送到指定的通道。
例如,一个经典的使用场景是“每日早报”:
- 创建一个技能
morning_digest,用于抓取并总结科技新闻、知乎热榜、B站热门视频。 - 在心跳配置中,添加一个任务,设定触发时间为
”0 9 * * *“(每天上午9点),调用morning_digest技能。 - 指定输出通道为你的钉钉工作群。
这样,每天上午9点,你的钉钉群就会自动收到一份由你的AI助手整理的个性化早报。心跳功能将 CoPaw 从一个被动的问答工具,转变为一个主动的、计划性的生产力伙伴。
3. 从零到一的完整部署与配置实战
了解了核心架构后,我们进入实战环节。我将以最推荐的pip install方式为例,带你完成一次从安装、配置到实际对话的全流程。假设我们的目标是在本地Mac电脑上部署,并最终连接到钉钉机器人。
3.1 环境准备与基础安装
首先,确保你的系统已安装Python 3.10 至 3.13。不建议使用Python 3.14及以上版本,可能存在兼容性问题。可以通过python3 --version检查。
步骤一:创建并激活虚拟环境(强烈推荐)虚拟环境能隔离项目依赖,避免污染系统Python环境,是Python项目开发的最佳实践。
# 创建名为 copaw_env 的虚拟环境 python3 -m venv copaw_env # 激活虚拟环境 # macOS/Linux: source copaw_env/bin/activate # Windows: # copaw_env\Scripts\activate激活后,命令行提示符前通常会显示(copaw_env),表示你已进入该环境。
步骤二:安装 CoPaw在激活的虚拟环境中,执行安装命令。建议使用国内镜像源以加速下载。
pip install copaw -i https://pypi.tuna.tsinghua.edu.cn/simple安装过程会同时安装核心依赖agentscope(CoPaw基于的智能体框架)。如果网络不畅,可以多试几次或更换其他镜像源(如阿里云https://mirrors.aliyun.com/pypi/simple/)。
3.2 初始化与关键配置
安装完成后,我们进行初始化。这是最关键的一步,将建立工作目录并引导你完成基础配置。
步骤三:运行初始化向导
copaw init这里我不推荐使用copaw init --defaults。虽然它能快速采用默认配置,但我们会错过一些重要的自定义选项。建议跟随交互式向导一步步进行:
- 设置工作目录:向导会询问工作目录路径。默认是
~/.copaw。你可以按回车使用默认值,或输入一个自定义路径(如~/Documents/MyCopaw)。所有后续数据都将存储于此。 - 选择大语言模型(LLM)服务提供商:这是核心决策点。向导会列出支持的云服务商,如阿里云灵积(DashScope)、智谱AI、OpenAI等。对于国内用户,阿里云灵积(DashScope)是网络最稳定、性价比不错的选择,它提供了通义千问系列模型的API。选择对应的数字编号。
- 配置API密钥:选择提供商后,会提示你输入对应的API Key。你需要提前到相应平台的官网注册账号并获取Key。
- 阿里云灵积(DashScope):登录阿里云控制台,搜索“灵积”,在“API密钥管理”中创建即可。
- 重要提示:API Key是敏感信息,初始化后会被加密保存在工作目录的配置文件中。你也可以稍后在Web控制台的设置中修改。
- 选择默认模型:向导会列出该提供商下的可用模型(如
qwen-max,qwen-plus)。根据你的预算和性能需求选择。qwen-turbo速度最快成本低,qwen-max能力最强但稍贵。 - 其他配置:向导可能还会询问是否启用基础技能包、设置本地服务器端口(默认8088)等,均可按需选择。
初始化完成后,你会看到类似”CoPaw initialized successfully at /path/to/your/workdir“的提示。
3.3 启动Web控制台并进行首次对话
步骤四:启动应用服务
copaw app执行后,CoPaw 服务将在后台启动。你会在终端看到日志输出,最后一行通常是”Application startup complete.“并显示访问地址http://127.0.0.1:8088。
步骤五:访问Web控制台打开浏览器,输入http://127.0.0.1:8088。你将看到 CoPaw 的Web控制台界面。这是管理和与你的AI助手交互的主要面板。
步骤六:模型激活与测试对话
- 在控制台左侧导航栏,点击”设置“(Settings),然后进入”模型“(Models)标签页。
- 你应该能看到你在
init阶段配置的模型提供商和模型。确保其状态为”已激活“(Active)。如果未激活,点击对应操作栏的激活按钮。 - 返回主聊天界面,在底部的输入框尝试发送第一条消息,例如:”你好,介绍一下你自己。“。
- 如果一切正常,你将收到AI助手的回复。至此,一个本地运行的、基于云模型API的CoPaw助手就已经就绪了。
注意事项:首次对话失败排查如果消息一直显示“发送中”或报错,请按以下步骤排查:
- 检查模型激活状态:回到“设置-模型”页面,确认模型已激活且API Key正确无误(可以尝试点击“测试连接”)。
- 检查网络连接:确保你的机器可以访问外网(对于DashScope等云服务)。如果是公司网络,可能有防火墙限制。
- 查看服务日志:在运行
copaw app的终端窗口,查看是否有红色错误信息。常见的错误是Invalid API Key或Network Error。- 账户余额:确保你的云服务账户有足够的余额或调用额度。
3.4 连接钉钉机器人:打通外部通道
现在,我们来实现一个更实用的场景:将CoPaw连接到钉钉群,让群成员都能@机器人进行对话。
步骤七:创建钉钉企业内部机器人
- 登录钉钉开发者后台(https://open.dingtalk.com)。
- 进入“应用开发” -> “企业内部开发” -> “机器人”。
- 点击“创建应用”,选择“机器人”类型,填写应用名称和描述。
- 创建成功后,在“功能列表”中,点击“机器人”下的“消息接收”。
- 获取关键信息:记录下
AppKey和AppSecret。同时,在“消息接收”板块,你会看到一个“加签”或“自定义关键词”等安全设置。为了简单起见,我们先选择“自定义关键词”,添加一个关键词如“CoPaw”。这意味着只有包含“CoPaw”的消息才会被转发给我们的服务。
步骤八:在CoPaw中配置钉钉通道
- 在CoPaw Web控制台,进入”设置“ -> ”通道“(Channels)。
- 点击“添加通道”,选择“钉钉(DingTalk)”。
- 填写配置信息:
- 机器人名称:自定义,如“我的助手”。
- App Key:填写上一步获取的
AppKey。 - App Secret:填写上一步获取的
AppSecret。 - 消息加签Token/关键词:根据你在钉钉后台的选择填写。如果用了加签,就填加签Token;如果用了关键词,就填你设置的关键词(如“CoPaw”)。
- Webhook地址:这是最易出错的一步。CoPaw会生成一个Webhook URL,格式类似
http://YOUR_SERVER_IP:8088/channels/dingtalk/callback。你需要将这个URL填写到钉钉后台“消息接收”的“Webhook”地址栏。- 问题:如果你的CoPaw运行在本地电脑(
127.0.0.1),这个地址钉钉服务器是无法访问的。 - 解决方案:你需要进行内网穿透。可以使用
ngrok、frp或localtunnel等工具。以ngrok为例:
运行后,# 安装ngrok (需注册账号获取authtoken) ngrok config add-authtoken YOUR_AUTH_TOKEN # 将本地8088端口暴露到公网 ngrok http 8088ngrok会生成一个https://xxxxxx.ngrok.io的公共地址。此时,CoPaw的Webhook地址应改为https://xxxxxx.ngrok.io/channels/dingtalk/callback,并将此地址填回钉钉后台。
- 问题:如果你的CoPaw运行在本地电脑(
- 保存通道配置。CoPaw会尝试验证与钉钉服务器的连接。
步骤九:测试钉钉机器人
- 在钉钉开发者后台,将机器人发布到企业(即使只有你自己)。
- 在钉钉桌面端,进入一个群聊(或创建一个测试群),在“群设置” -> “智能群助手”中添加你刚刚创建的机器人。
- 在群聊中 @机器人 并发送包含关键词的消息,例如:”@我的助手 CoPaw 今天天气怎么样?“。
- 如果配置正确,消息会通过钉钉服务器 -> 公网ngrok地址 -> 你本地的CoPaw服务。CoPaw处理后会回复,再沿原路返回显示在钉钉群中。
4. 高级玩法:本地模型与技能开发
4.1 摆脱云依赖:使用本地大模型
使用云API虽然方便,但存在成本、网络延迟和隐私顾虑。CoPaw 的强大之处在于它原生支持在本地运行开源大模型。
方案选择:llama.cpp vs MLX
- llama.cpp:这是一个用C++编写的高效推理框架,支持在CPU上运行量化后的模型,兼容性极佳(macOS/Linux/Windows均可)。适合绝大多数用户,尤其是没有高端GPU的。
- MLX:苹果专为Apple Silicon(M1/M2/M3/M4芯片)打造的机器学习框架,在其自家芯片上性能表现卓越。如果你是Mac用户,这是最佳选择。
安装本地模型支持:
# 安装 llama.cpp 后端支持 pip install 'copaw[llamacpp]' # 或安装 MLX 后端支持 (Apple Silicon Mac) pip install 'copaw[mlx]'下载与运行本地模型:
- 下载模型:CoPaw 集成了模型管理CLI。我们需要下载GGUF格式的模型文件(这是一种广泛使用的量化格式,平衡了模型大小和性能)。
# 例如,下载一个较小的通义千问模型 copaw models download Qwen/Qwen2.5-0.5B-Instruct-GGUF # 你可以搜索更多模型,如 TinyLlama, Phi-3-mini 等 copaw models search llama - 激活本地模型:
# 列出已下载的模型 copaw models list # 设置默认使用某个本地模型 copaw models set-default Qwen/Qwen2.5-0.5B-Instruct-GGUF - 重启服务并切换:重启
copaw app,然后在Web控制台的“设置-模型”页面,你会看到新增的“Local”提供商。停用之前的云模型,激活这个本地模型即可。现在,所有的对话推理都将发生在你的本地电脑上,无需网络,完全免费。
实操心得:本地模型选型与性能调优
- 模型大小与内存:模型参数量越大,能力通常越强,但所需内存也越多。一个7B参数的模型,量化到q4_0(4位整数量化)后,大约需要4-5GB内存。请根据你的电脑内存选择模型。对于入门,1.5B-3B参数的模型是很好的起点。
- 量化等级:GGUF文件通常有
q4_0,q4_K_M,q8_0等后缀,代表不同的量化精度。q4_0体积最小,速度最快,但精度损失稍大;q8_0体积大,速度慢,但精度高。一般选择q4_K_M或q5_K_M能在速度和精度间取得较好平衡。- 上下文长度:有些模型支持更长的上下文(如128K)。如果你的应用场景涉及长文档总结,请选择支持长上下文的模型,并在CoPaw配置中相应调整上下文窗口大小。
4.2 开发自定义技能:打造专属能力
当内置技能无法满足需求时,自定义技能开发就派上用场了。假设我们要开发一个“随机冷笑话”技能。
步骤一:创建技能文件在你的CoPaw工作目录下(初始化时设定的,默认是~/.copaw),找到或创建skills文件夹。在其中新建一个Python文件,例如joke_skill.py。
步骤二:编写技能代码
# ~/.copaw/skills/joke_skill.py import random from copaw.skill import skill # 定义一个冷笑话库 JOKES = [ “为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25。”, “我买了一个会讲冷笑话的冰箱,现在我的食物都冻坏了。”, “键盘上哪个键最帅?F4。”, “为什么数学书总是很忧郁?因为它有太多问题。”, ] @skill( name=“random_joke”, description=“随机讲一个冷笑话,为对话增添乐趣。”, parameters={} # 这个技能不需要参数 ) async def tell_random_joke(): “”“随机选择并返回一个冷笑话。”“” joke = random.choice(JOKES) return joke # 你也可以创建需要参数的技能 @skill( name=“joke_about”, description=“讲一个关于特定主题的冷笑话(示例)。”, parameters={ “topic”: {“type”: “string”, “description”: “笑话的主题,比如:程序员、天气、动物”} } ) async def tell_joke_about(topic: str): # 这里可以接入一个能根据主题生成笑话的API,这里简单返回 return f“关于{topic}的冷笑话?让我想想... 哦,{random.choice(JOKES)}”步骤三:测试技能
- 保存文件。无需重启CoPaw服务。CoPaw 支持技能的热加载(部分版本可能需要重启)。
- 在Web控制台或已连接的钉钉中,尝试对助手说:“讲个冷笑话”或“调用random_joke技能”。
- 助手应该能理解你的指令,并从
JOKES列表中随机返回一条。
技能开发进阶:调用外部API真正的技能往往需要与外部服务交互。以下是一个调用公开API查询天气的技能示例(注意错误处理):
import aiohttp from copaw.skill import skill @skill( name=“get_real_weather”, description=“查询真实城市的天气信息。”, parameters={ “city”: {“type”: “string”, “description”: “城市名称,例如:北京”}, “days”: {“type”: “integer”, “description”: “预报天数,默认为1”, “default”: 1} } ) async def fetch_weather(city: str, days: int = 1): “”“调用天气API查询天气。”“” # 使用一个假设的天气API,实际使用时请替换为真实API api_url = f“https://api.weatherapi.com/v1/forecast.json” params = { “key”: “YOUR_API_KEY”, # 切记不要在代码中硬编码密钥! “q”: city, “days”: days, “lang”: “zh” } try: async with aiohttp.ClientSession() as session: async with session.get(api_url, params=params) as response: if response.status == 200: data = await response.json() current = data[‘current’] forecast_day = data[‘forecast’][‘forecastday’][0][‘day’] return ( f“{city}当前天气:{current[‘condition’][‘text’]},温度{current[‘temp_c’]}°C," f“体感温度{current[‘feelslike_c’]}°C,湿度{current[‘humidity’]}%。\n” f“今日预报:最高{forecast_day[‘maxtemp_c’]}°C,最低{forecast_day[‘mintemp_c’]}°C," f“{forecast_day[‘condition’][‘text’]}。” ) else: return f“查询天气失败,API返回状态码:{response.status}” except aiohttp.ClientError as e: return f“网络请求出错:{str(e)}” except KeyError as e: return f“解析天气数据时出错,缺少字段:{str(e)}” # 重要:API密钥应通过环境变量或CoPaw的设置界面管理,不要写在代码里。 # 在CoPaw控制台‘设置->环境变量’中添加 WEATHER_API_KEY=your_key # 在代码中通过 os.getenv(‘WEATHER_API_KEY’) 读取。5. 常见问题与深度排查指南
在实际部署和使用 CoPaw 的过程中,你可能会遇到各种问题。下面我将一些典型问题及其解决方案整理成表,并提供更深层次的排查思路。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
运行copaw app后无法访问http://127.0.0.1:8088 | 1. 端口被占用。 2. 服务启动失败。 3. 防火墙/安全软件阻止。 | 1.检查端口:lsof -i:8088(macOS/Linux) 或netstat -ano | findstr :8088(Windows) 查看是否被其他进程占用。可修改端口copaw app --port 8090。2.查看日志:仔细阅读 copaw app启动时的终端输出,寻找ERROR或WARNING信息。3.检查Python环境:确认在正确的虚拟环境中,且 copaw已安装 (pip list | grep copaw)。 |
| Web控制台能打开,但发送消息无反应或一直“发送中” | 1. 模型未激活或API Key错误。 2. 网络问题导致无法连接模型API。 3. 模型服务商额度用尽或服务异常。 | 1.检查模型配置:进入“设置-模型”,确认目标模型状态为“已激活”,且API Key正确。可点击“测试连接”。 2.测试网络连通性:尝试在终端 curl模型服务商的健康检查端点(如果有)。3.查看服务商控制台:登录DashScope等平台,查看调用量、余额和错误日志。 |
| 钉钉/飞书机器人收不到消息或无法回复 | 1. Webhook地址错误或不可达。 2. 钉钉安全配置(Token/Secret/关键词)不匹配。 3. CoPaw通道配置错误。 4. 内网穿透服务中断。 | 1.验证Webhook:在钉钉后台重新保存Webhook,看CoPaw服务日志是否有收到验证请求。 2.对比密钥:逐字核对CoPaw通道配置与钉钉后台的AppKey、AppSecret、Token/关键词。 3.检查内网穿透:确保 ngrok等服务正在运行,且生成的域名是有效的。重启ngrok会改变域名,需同步更新钉钉后台和CoPaw配置。 |
| 本地模型加载失败或推理速度极慢 | 1. 模型文件损坏或路径错误。 2. 系统内存不足。 3. 未使用量化模型或量化等级不适合。 4. 未正确配置后端(如MLX在非Apple Silicon上运行)。 | 1.重新下载模型:copaw models download --force <model_id>。2.监控资源:使用 htop或任务管理器查看内存和CPU占用。尝试更小的模型。3.选择合适量化:优先下载 q4_K_M或q5_K_M格式的GGUF模型。4.确认后端:Apple Silicon Mac优先用MLX后端 ( pip install ‘copaw[mlx]‘)。其他平台用llama.cpp。 |
| 自定义技能不生效 | 1. 技能文件未放在正确的skills目录。2. 技能Python语法错误。 3. 技能装饰器 @skill参数格式错误。4. 技能函数不是异步 ( async)。 | 1.确认目录:技能文件必须放在工作目录下的skills/文件夹内。2.检查语法:在技能目录外单独运行 python -m py_compile skills/your_skill.py检查语法。3.检查日志: copaw app启动时或收到消息时,控制台会输出技能加载日志,查看是否有错误。4.遵循模板:确保技能函数使用 async def定义,并且参数与@skill装饰器声明一致。 |
| 心跳任务未按时执行 | 1. Cron表达式配置错误。 2. CoPaw服务进程挂起或重启。 3. 技能执行本身出错。 4. 系统时区问题。 | 1.验证Cron表达式:使用在线Cron表达式验证工具检查格式是否正确(如0 9 * * *代表每天9点)。2.查看心跳日志:CoPaw日志中会记录心跳任务的触发和执行情况,查看是否有报错。 3.手动测试技能:在聊天中手动调用心跳任务配置的技能,看是否能成功执行。 4.检查系统时间:确保部署CoPaw的服务器或电脑的系统时间和时区设置正确。 |
深度排查:查看详细日志当问题复杂时,启用更详细的日志是定位问题的关键。CoPaw 基于 Python 的logging模块。你可以通过设置环境变量来调整日志级别。
# 在启动 copaw app 前,设置日志级别为 DEBUG export COPaw_LOG_LEVEL=DEBUG # 然后启动 copaw appDEBUG 级别会输出大量内部运行信息,包括网络请求、技能加载、消息流转的每一个细节,对于排查复杂的交互问题非常有帮助。
