经过五天的学习,你已经掌握了OpenClaw Agent开发的核心技能:Day1理解Agentic AI的概念,Day2学会搭建第一个Agent,Day3掌握自定义Skill开发,Day4配置多Agent协作,Day5完成企业级部署。
今天是收官之作,我们把前五天的知识串联起来,从零开始搭建一个完整的AI助手。
这个AI助手不是玩具,而是一个真正可用的个人助手:能回答问题、管理日程、处理文件、记住你的偏好。
一、课程回顾与今日目标
1.1 六天学到了什么
Day1:Agentic AI的概念。理解了什么是Agent、Agent和普通程序的区别、Agent的核心能力:感知→推理→行动→记忆。
Day2:搭建第一个Agent。学会了安装OpenClaw、配置Agent、连接大模型、实现对话能力。
Day3:自定义Skill开发。掌握了Skill的结构(SKILL.md加scripts)、如何让Agent调用外部工具、Skill的触发机制。
Day4:多Agent协作。理解了Supervisor模式、Sub-Agent配置、工作流定义(串行、并行、条件分支)。
Day5:企业级部署。学会了权限管理(RBAC)、数据安全(加密、脱敏)、监控审计、生产环境部署。
1.2 今天的目标
搭建一个个人AI助手,具备以下核心能力:
- 即时问答:回答各种问题、提供信息检索服务
- 日程管理:帮你管理日程、设置提醒
- 文件处理:读取、总结、整理文档
- 偏好记忆:记住你的偏好,提供个性化服务
这是一个完整的实战项目,涵盖前五天的所有知识点。
1.3 技术选型
| 项目 | 选择 |
|---|---|
| 框架 | OpenClaw 2026.5.4 |
| 模型 | MiniMax-M2.7 |
| 技能 | 文件系统、日历、天气、信息检索 |
| 部署 | 本地运行,支持后台服务 |
二、确定应用场景
2.1 为什么先确定场景
磨刀不误砍柴工。在动手之前,先想清楚这个AI助手要解决什么问题。不是所有功能都重要,也不是所有功能都能做。要根据实际需求筛选核心功能。
2.2 个人助手的三个核心场景
通过对20位知识工作者的调研,发现个人助手最重要的三个场景:
场景一:信息处理(重要性:高)
每天花2小时处理信息:查资料、整理笔记、写邮件。如果AI能帮忙处理,可以显著提升效率。
具体功能:网页搜索、文档总结、邮件撰写、笔记整理。
场景二:日程管理(重要性:中)
日程碎片化,经常忘记重要会议和截止日期。需要一个能主动提醒的助手。
具体功能:查看日程、添加提醒、提前通知、冲突检测。
场景三:知识管理(重要性:中)
个人知识分散在邮件、文档、笔记中,难以检索。需要一个能快速找到答案的助手。
具体功能:知识库问答、语义搜索、自动归类。
2.3 最终选择
综合考虑开发复杂度和用户价值,我们选择信息处理作为第一个版本的核心场景。
原因:
- 开发难度适中,第一个版本可以做出来
- 用户痛点明确,价值可感知
- 扩展性好,后续可以叠加其他功能
核心功能:
- 即时问答:回答各类问题
- 文档总结:上传文档,生成摘要
- 邮件助手:帮助撰写邮件
- 搜索助手:联网搜索信息
三、系统架构设计
3.1 单Agent架构
第一个版本采用单Agent架构,简化复杂度:
↓
Skill调用
↓
文件系统 / 日历 / 搜索
用户发送请求,Agent接收后调用大模型理解意图,然后调用相应的Skill处理请求,返回结果。

3.2 为什么不用多Agent
多Agent协作适合复杂任务分解的场景。个人助手第一个版本的功能相对简单,单Agent足够应付。等功能增加后(如同时处理日程和文档),可以升级为多Agent架构。
3.3 技能列表
根据选定场景,需要以下Skill:
| Skill | 功能 | 来源 |
|---|---|---|
| 搜索Skill | 联网搜索信息 | 内置Skill |
| 文件Skill | 读取和处理本地文件 | 自定义开发 |
| 摘要Skill | 生成文档摘要 | 自定义开发 |
| 邮件Skill | 邮件撰写辅助 | 自定义开发 |
四、配置主Agent
4.1 创建工作目录
mkdir -p ~/.openclaw/workspace/my-assistant/skills
mkdir -p ~/.openclaw/workspace/my-assistant/knowledge
mkdir -p ~/.openclaw/workspace/my-assistant/logs
目录说明:
my-assistant/:助手根目录skills/:存放自定义Skillknowledge/:本地知识库logs/:日志目录
4.2 创建Agent配置
创建~/.openclaw/workspace/my-assistant/agent.json:
"name": "my-assistant",
"description": "个人AI助手,帮主处理信息、管理知识、提供即时问答服务",
"model": "minimax-portal/MiniMax-M2.7",
"language": "zh",
"timezone": "Asia/Shanghai",
"skills": {
"builtin": ["search", "calculator"],
"custom": [
"~/.openclaw/workspace/my-assistant/skills/file-skill",
"~/.openclaw/workspace/my-assistant/skills/summarize-skill",
"~/.openclaw/workspace/my-assistant/skills/email-skill"
]
},
"memory": {
"enabled": true,
"type": "file",
"path": "~/.openclaw/workspace/my-assistant/memory.json"
},
"workspace": "~/.openclaw/workspace/my-assistant",
"limits": {
"maxTokens": 4000,
"timeout": 60
}
}
配置说明:
name:助手名称description:助手描述,供用户了解助手能力model:使用M2.7模型language:中文timezone:北京时间skills:内置技能和自定义技能memory:记忆系统配置limits:限制参数
4.3 注册Agent
编辑~/.openclaw/openclaw.json,添加Agent注册:
agents: {
entries: {
"my-assistant": {
type: "agent",
configPath: "~/.openclaw/workspace/my-assistant/agent.json"
}
}
}
}
4.4 测试Agent启动
如果启动成功,会看到类似输出:
[OpenClaw] Model loaded: minimax-portal/MiniMax-M2.7
[OpenClaw] Skills loaded: 5
[OpenClaw] Memory initialized
[OpenClaw] Agent ready at http://127.0.0.1:18789
五、开发自定义Skill
5.1 文件处理Skill
5.1.1 创建目录
5.1.2 编写SKILL.md
创建~/.openclaw/workspace/my-assistant/skills/file-skill/SKILL.md:
## 技能简介
文件处理Skill帮助Agent读取、搜索、处理本地文件。
## 功能列表
1. **read_file**:读取文件内容
2. **list_files**:列出目录文件
3. **search_content**:在文件中搜索关键词
4. **get_file_info**:获取文件信息
## 使用场景
– 用户要求读取某个文件
– 用户询问目录下有哪些文件
– 用户需要在文件中搜索特定内容
– 用户想知道文件大小、修改时间等信息
## 使用示例
用户:"帮我看看 ~/documents/readme.txt 的内容"
Agent调用:read_file, {"path": "~/documents/readme.txt"}
用户:"~/projects 目录下有什么文件?"
Agent调用:list_files, {"path": "~/projects"}
用户:"在 ~/notes 目录下搜索'会议纪要'"
Agent调用:search_content, {"path": "~/notes", "keyword": "会议纪要"}
## 参数说明
| 参数 | 类型 | 必填 | 说明 |
|——|——|——|——|
| path | string | 是 | 文件路径 |
| keyword | string | search_content时必填 | 搜索关键词 |
## 输出格式
标准JSON格式,包含执行结果或错误信息。
5.1.3 编写处理脚本
创建~/.openclaw/workspace/my-assistant/skills/file-skill/scripts/file_handler.py:
import os
import json
import re
from datetime import datetime
def read_file(path):
"""读取文件内容"""
try:
path = os.path.expanduser(path)
if not os.path.exists(path):
return {"success": False, "error": "文件不存在"}
if not os.path.isfile(path):
return {"success": False, "error": "路径不是文件"}
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
return {
"success": True,
"path": path,
"content": content,
"size": os.path.getsize(path),
"modified": datetime.fromtimestamp(os.path.getmtime(path)).isoformat()
}
except Exception as e:
return {"success": False, "error": str(e)}
def list_files(path):
"""列出目录文件"""
try:
path = os.path.expanduser(path)
if not os.path.exists(path):
return {"success": False, "error": "目录不存在"}
if not os.path.isdir(path):
return {"success": False, "error": "路径不是目录"}
files = []
for item in os.listdir(path):
item_path = os.path.join(path, item)
files.append({
"name": item,
"type": "dir" if os.path.isdir(item_path) else "file",
"size": os.path.getsize(item_path) if os.path.isfile(item_path) else 0
})
return {
"success": True,
"path": path,
"files": files,
"count": len(files)
}
except Exception as e:
return {"success": False, "error": str(e)}
def search_content(path, keyword):
"""在文件中搜索关键词"""
try:
path = os.path.expanduser(path)
if not os.path.exists(path):
return {"success": False, "error": "路径不存在"}
results = []
pattern = re.compile(keyword, re.IGNORECASE)
if os.path.isfile(path):
with open(path, 'r', encoding='utf-8') as f:
for i, line in enumerate(f, 1):
if pattern.search(line):
results.append({
"file": path,
"line": i,
"content": line.strip()
})
else:
for root, dirs, files in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
for i, line in enumerate(f, 1):
if pattern.search(line):
results.append({
"file": file_path,
"line": i,
"content": line.strip()
})
except:
continue
return {
"success": True,
"keyword": keyword,
"results": results,
"count": len(results)
}
except Exception as e:
return {"success": False, "error": str(e)}
def get_file_info(path):
"""获取文件信息"""
try:
path = os.path.expanduser(path)
if not os.path.exists(path):
return {"success": False, "error": "文件不存在"}
stat = os.stat(path)
return {
"success": True,
"path": path,
"size": stat.st_size,
"created": datetime.fromtimestamp(stat.st_ctime).isoformat(),
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
"is_file": os.path.isfile(path),
"is_dir": os.path.isdir(path)
}
except Exception as e:
return {"success": False, "error": str(e)}
if __name__ == "__main__":
import sys
action = sys.argv[1] if len(sys.argv) > 1 else None
if action == "read_file":
result = read_file(sys.argv[2] if len(sys.argv) > 2 else "")
elif action == "list_files":
result = list_files(sys.argv[2] if len(sys.argv) > 2 else "")
elif action == "search_content":
result = search_content(sys.argv[2] if len(sys.argv) > 2 else "",
sys.argv[3] if len(sys.argv) > 3 else "")
elif action == "get_file_info":
result = get_file_info(sys.argv[2] if len(sys.argv) > 2 else "")
else:
result = {"success": False, "error": "未知操作"}
print(json.dumps(result, ensure_ascii=False))
5.2 摘要Skill
5.2.1 创建目录
5.2.2 编写SKILL.md
创建~/.openclaw/workspace/my-assistant/skills/summarize-skill/SKILL.md:

## 技能简介
文档摘要Skill帮助Agent读取长文档并生成简洁摘要。
## 功能列表
1. **summarize_text**:对文本内容生成摘要
2. **summarize_file**:对文件生成摘要
## 使用场景
– 用户上传了一份文档,希望了解主要内容
– 用户需要将长文章缩写成短文
– 用户希望提取文档的关键点
## 使用示例
用户:"帮我总结一下这篇文档的主要内容"
Agent调用:summarize_text, {"text": "用户提供的文本"}
用户:"这个PDF文件讲了什么?"
Agent调用:summarize_file, {"path": "~/documents/report.pdf"}
## 参数说明
| 参数 | 类型 | 必填 | 说明 |
|——|——|——|——|
| text | string | summarize_text时必填 | 要摘要的文本 |
| path | string | summarize_file时必填 | 文件路径 |
| max_length | int | 否 | 摘要最大长度(字符数) |
5.2.3 编写处理脚本
创建~/.openclaw/workspace/my-assistant/skills/summarize-skill/scripts/summarize_handler.py:
import os
import json
import sys
def summarize_text(text, max_length=200):
"""生成文本摘要"""
if not text or len(text.strip()) == 0:
return {"success": False, "error": "文本为空"}
# 简单摘要策略:取前3段,每段取前两句话
lines = text.split('\n')
paragraphs = [p.strip() for p in lines if p.strip()]
summary_parts = []
for para in paragraphs[:3]:
para_lines = para.split('。')
for line in para_lines[:2]:
if line.strip():
summary_parts.append(line.strip())
summary = '。'.join(summary_parts)
if len(summary) > max_length:
summary = summary[:max_length] + '…'
else:
summary += '。'
return {
"success": True,
"original_length": len(text),
"summary_length": len(summary),
"summary": summary
}
def summarize_file(path, max_length=200):
"""生成文件摘要"""
try:
path = os.path.expanduser(path)
if not os.path.exists(path):
return {"success": False, "error": "文件不存在"}
# 根据文件类型读取
ext = os.path.splitext(path)[1].lower()
if ext in ['.txt', '.md', '.json', '.xml', '.py', '.js', '.html', '.css']:
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
elif ext in ['.pdf', '.doc', '.docx']:
return {"success": False, "error": "不支持的格式,请使用txt或md文件"}
else:
return {"success": False, "error": f"未知的文件类型: {ext}"}
return summarize_text(content, max_length)
except Exception as e:
return {"success": False, "error": str(e)}
if __name__ == "__main__":
action = sys.argv[1] if len(sys.argv) > 1 else None
if action == "summarize_text":
text = sys.stdin.read() if len(sys.argv) == 2 else sys.argv[2] if len(sys.argv) > 2 else ""
result = summarize_text(text)
elif action == "summarize_file":
result = summarize_file(sys.argv[2] if len(sys.argv) > 2 else "")
else:
result = {"success": False, "error": "未知操作"}
print(json.dumps(result, ensure_ascii=False))
5.3 邮件助手Skill
5.3.1 创建目录
5.3.2 编写SKILL.md
创建~/.openclaw/workspace/my-assistant/skills/email-skill/SKILL.md:
## 技能简介
邮件助手Skill帮助用户撰写邮件,提供邮件模板和优化建议。
## 功能列表
1. **draft_email**:根据简要信息起草邮件
2. **improve_email**:优化现有邮件内容
3. **email_template**:提供常用邮件模板
## 使用场景
– 用户需要写一封邮件但不知如何开始
– 用户写完邮件后希望优化表达
– 用户需要某种场景的邮件模板
## 使用示例
用户:"帮我写一封请假邮件,明天请假一天"
Agent调用:draft_email, {"purpose": "请假", "details": "明天请假一天,因为身体不适"}
用户:"帮我优化一下这封邮件:'经理你好,我想请假…'"
Agent调用:improve_email, {"content": "经理你好,我想请假…"}
用户:"给我一个会议邀请的模板"
Agent调用:email_template, {"type": "meeting_invitation"}
## 参数说明
| 参数 | 类型 | 必填 | 说明 |
|——|——|——|——|
| purpose | string | draft_email时必填 | 邮件目的 |
| details | string | 否 | 邮件详情 |
| content | string | improve_email时必填 | 要优化的邮件内容 |
| type | string | email_template时必填 | 模板类型 |
## 模板类型
– meeting_invitation:会议邀请
– sick_leave:病假申请
– resignation:离职申请
– thank_you:感谢邮件
– apology:道歉邮件
– follow_up:跟进邮件
5.3.3 编写处理脚本
创建~/.openclaw/workspace/my-assistant/skills/email-skill/scripts/email_handler.py:
import json
import sys
TEMPLATES = {
"meeting_invitation": {
"subject": "会议邀请:{topic}",
"body": """尊敬的{recipient}:
您好!
诚邀您参加以下会议:
【会议主题】{topic}
【会议时间】{time}
【会议地点】{location}
【会议内容】{content}
请确认是否能出席。如有疑问,请联系我。
此致
敬礼
{sender}
{date}"""
},
"sick_leave": {
"subject": "请假申请:{date}请假",
"body": """尊敬的{manager}:
您好!
因身体不适,我申请在{date}请假{days}天。
请假原因:{reason}
我已经将手头工作交接给{backup},确保工作不受影响。
恳请批准。
此致
敬礼
{employee}
{date}"""
},
"thank_you": {
"subject": "感谢",
"body": """尊敬的{recipient}:
您好!
感谢您{reason}。您的帮助对我来说非常重要。
我会继续努力,不辜负您的信任。
再次感谢!
此致
敬礼
{sender}
{date}"""
}
}
def draft_email(purpose, details="", recipient="", sender="我"):
"""起草邮件"""
date = "2026年5月23日"
templates = {
"请假": f"尊敬的领导:\n\n您好!\n\n因{details},申请请假。\n\n请批准。\n\n此致\n敬礼\n\n{sender}\n{date}",
"感谢": f"尊敬的{recipient}:\n\n您好!\n\n感谢您{details}。\n\n此致\n敬礼\n\n{sender}\n{date}",
"会议邀请": f"尊敬的{recipient}:\n\n您好!\n\n诚邀您参加会议:{details}\n\n请确认是否能出席。\n\n此致\n敬礼\n\n{sender}\n{date}",
}
body = templates.get(purpose, f"尊敬的{recipient}:\n\n您好!\n\n{details}\n\n此致\n敬礼\n\n{sender}\n{date}")
return {
"success": True,
"purpose": purpose,
"draft": body
}
def improve_email(content):
"""优化邮件"""
improvements = []
if len(content) < 20:
improvements.append("邮件内容过短,建议补充更多细节")
if "你好" in content and "您好" not in content:
improvements.append("建议将'你好'改为'您好',更正式")
if not content.endswith(("此致", "敬礼")):
improvements.append("建议添加结尾祝福语")
improved = content
if "你好" in improved:
improved = improved.replace("你好", "您好")
return {
"success": True,
"original": content,
"improved": improved,
"suggestions": improvements
}
def email_template(template_type):
"""获取邮件模板"""
if template_type in TEMPLATES:
return {
"success": True,
"type": template_type,
"template": TEMPLATES[template_type]
}
else:
return {
"success": False,
"error": f"未知模板类型: {template_type}",
"available": list(TEMPLATES.keys())
}
if __name__ == "__main__":
action = sys.argv[1] if len(sys.argv) > 1 else None
if action == "draft_email":
result = draft_email(
sys.argv[2] if len(sys.argv) > 2 else "",
sys.argv[3] if len(sys.argv) > 3 else ""
)
elif action == "improve_email":
content = sys.stdin.read() if len(sys.argv) == 2 else sys.argv[2] if len(sys.argv) > 2 else ""
result = improve_email(content)
elif action == "email_template":
result = email_template(sys.argv[2] if len(sys.argv) > 2 else "")
else:
result = {"success": False, "error": "未知操作"}
print(json.dumps(result, ensure_ascii=False))
5.4 技能配置文件
在~/.openclaw/openclaw.json中注册新技能:
skills: {
entries: {
"file-skill": {
path: "~/.openclaw/workspace/my-assistant/skills/file-skill",
enabled: true
},
"summarize-skill": {
path: "~/.openclaw/workspace/my-assistant/skills/summarize-skill",
enabled: true
},
"email-skill": {
path: "~/.openclaw/workspace/my-assistant/skills/email-skill",
enabled: true
}
}
}
}
六、测试与调优
6.1 启动测试
启动成功后,开始功能测试。

6.2 功能测试
测试1:即时问答
Agent:正在联网搜索…
(搜索Skill返回结果)
(结合搜索结果回答)
测试2:文件读取
Agent:正在读取文件…
(调用file-skill的read_file)
(返回文件内容)
测试3:文档摘要
Agent:正在生成摘要…
(调用summarize-skill的summarize_file)
(返回摘要结果)
测试4:邮件起草
Agent:正在起草邮件…
(调用email-skill的draft_email)
(返回邮件草稿)
6.3 调优
根据测试结果调整:
问题一:响应慢
可能原因:大模型调用超时或搜索耗时过长。
解决方案:
- 增加timeout配置
- 添加搜索结果缓存
- 优化Skill脚本性能
问题二:回答不准确
可能原因:提示词不够明确。
解决方案:
- 优化Agent配置中的description
- 在Skill的SKILL.md中添加更详细的使用示例
- 调整prompt模板
问题三:Skill调用失败
可能原因:脚本路径错误或权限不足。
解决方案:
- 检查脚本是否有执行权限
- 确认路径配置正确
- 查看日志定位问题
6.4 配置日志
在Agent配置中启用日志:
"logging": {
"enabled": true,
"level": "debug",
"file": "~/.openclaw/workspace/my-assistant/logs/assistant.log"
}
}
查看日志:
七、部署上线
7.1 打包配置
将助手配置打包,方便迁移:
tar -czf my-assistant-backup.tar.gz my-assistant/
7.2 配置开机启动
使用systemd服务配置开机启动:
创建/etc/systemd/system/openclaw-assistant.service:
Description=OpenClaw Personal Assistant
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/.openclaw/workspace
ExecStart=/usr/bin/openclaw start my-assistant
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
启用服务:
systemctl start openclaw-assistant
7.3 配置远程访问
如果需要远程访问,配置反向代理:
listen 443 ssl;
server_name assistant.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:18789;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
7.4 更新与维护
更新技能:
openclaw skills update file-skill
# 重启Agent
openclaw restart my-assistant
备份数据:
cp ~/.openclaw/workspace/my-assistant/memory.json ~/.openclaw/workspace/my-assistant/memory.json.bak
八、总结与展望
8.1 课程总结
通过六天的学习,你已经掌握了OpenClaw Agent开发的完整技能:
| Day | 主题 | 核心技能 |
|---|---|---|
| Day1 | Agentic AI概念 | 理解Agent架构和能力边界 |
| Day2 | 搭建第一个Agent | 安装配置、连接大模型 |
| Day3 | 自定义Skill开发 | SKILL.md编写、脚本开发 |
| Day4 | 多Agent协作 | 工作流配置、任务调度 |
| Day5 | 企业级部署 | 权限管理、安全配置 |
| Day6 | 实战项目 | 完整项目从零到上线 |
8.2 下一步探索
学完这个系列后,你可以继续探索:
高级Skill开发:学习开发带UI的Skill,实现更复杂的功能。
多Agent进阶:尝试多Agent协作,如搭建客服系统或研究助手。
企业级应用:基于Day5的知识,在企业环境中部署生产级Agent。
生态整合:与现有系统(CRM、ERP、IM)集成,实现更强大的自动化。
8.3 资源链接
- OpenClaw官方文档:https://docs.openclaw.ai
- GitHub仓库:https://github.com/openclaw/openclaw
- Skill市场:https://clawhub.ai
- Discord社区:加入讨论
8.4 学员分享
如果你基于这个系列做出了自己的Agent,欢迎在评论区分享!
六天系列到此结束!
感谢你的学习。如果觉得有帮助,请分享给需要的朋友。
有问题在评论区留言!
来源:OpenClaw官方文档(docs.openclaw.ai)
8.5 常见问题解答
Q1:助手没有响应怎么办?
A:首先检查Agent是否启动,运行openclaw status查看状态。如果没启动,运行openclaw start my-assistant。如果启动但无响应,检查网络连接和日志文件。日志路径在~/.openclaw/workspace/my-assistant/logs/assistant.log。查看日志中最新的错误信息,根据错误提示进行修复。
Q2:文件读取失败怎么解决?
A:常见原因有三个。第一,路径不存在或拼写错误,检查文件路径是否正确,注意~需要正确展开。第二,文件权限不足,使用的用户对文件是否有读取权限,可以用chmod 644命令修改权限。第三,文件编码问题,某些文件可能是非UTF-8编码,尝试转换文件编码或修改脚本中的打开模式。
Q3:如何添加新的Skill?
A:添加新Skill需要四步。第一步创建Skill目录结构,在~/.openclaw/workspace/my-assistant/skills/下创建新Skill的文件夹。第二步编写SKILL.md文件,定义Skill的功能和使用方法,这是Agent理解 Skill能力的依据。第三步编写处理脚本,实现具体的业务逻辑。第四步在openclaw.json中注册Skill,配置path和enabled参数。第五步重启Agent使配置生效。详细示例参考第五章的三个Skill开发教程。
Q4:助手记不住对话历史?
A:检查memory配置是否正确。确认memory.enabled设置为true,memory.type为file,memory.path指向一个可写的位置。检查文件系统是否有足够的存储空间。必要时可以手动删除memory文件让系统重新开始,记录的文件路径在agent.json中配置的memory.path路径。
Q5:如何让助手支持多语言?
A:在agent.json中修改language配置,当前支持zh、en、ja等语言。你也可以为不同语言配置不同的提示词模板。在skills目录下创建对应语言的配置目录,例如skills-en/、skills-ja/,然后在agent.json中根据language设置加载对应的Skill目录。
Q6:响应速度很慢怎么优化?
A:响应慢的主要原因和解决方案如下。第一,大模型响应慢可以考虑使用更快的模型或增加缓存。第二,网络问题导致搜索等操作慢,检查网络连接是否稳定。第三,Skill脚本执行慢,尝试优化脚本逻辑或增加缓存。第四,并发请求过多,配置rate limiting限制并发数。优化后重启Agent使配置生效。
Q7:如何导出对话记录?
A:对话记录存储在memory.json文件中,直接读取该文件可以获取历史对话。要导出特定格式的对话记录,可以编写脚本读取memory.json并转换为需要的格式,如JSON、Markdown或纯文本格式。使用export命令格式示例:openclaw export –from 2026-05-01 –to 2026-05-23 –format json –output conversations.json。
Q8:如何配置助手开机启动?
A:使用systemd配置开机启动。按第七章7.2节的步骤创建服务文件,然后执行systemctl enable openclaw-assistant命令启用开机启动。后续系统重启时Agent会自动启动。如果不需要开机启动,执行systemctl disable openclaw-assistant即可。
8.6 进阶功能配置
配置OAuth认证
如果需要第三方认证,配置OAuth流程。在agent.json中添加认证配置:
"auth": {
"type": "oauth",
"provider": "google",
"clientId": "your-client-id",
"redirectUri": "http://localhost:18789/callback"
}
}
配置后用户需要通过Google账号登录才能使用助手。
配置Webhook通知
配置Webhook让助手在特定事件发生时发送通知:
"webhook": {
"enabled": true,
"url": "https://your-webhook-server.com/notify",
"events": ["agent.error", "agent.start", "skill.invoked"]
}
}
这样你可以在外部系统监控助手的运行状态。
配置多语言支持
支持多语言用户同时使用:
"i18n": {
"default": "zh",
"supported": ["zh", "en", "ja"],
"fallback": "en"
}
}
用户可以通过发送语言切换命令改变助手使用的语言。



我要评论