1. 为什么要在 Docker 里折腾 openclaw 和自定义 Skills
openclaw 是一个可以跑在本地容器里的智能体网关,它能对接大模型、管理会话、加载技能插件,适合想把 AI 能力私有化部署、又不想被某个云平台绑死的开发者。Skills 是它最灵活的部分:你可以用 Python 写一个脚本,再配一份 SKILL.md 说明,Agent 就会在合适的时候调用它,而不是自己瞎编代码。这套组合特别适合做数据处理、文件分析、内部工具调用这类需要确定性结果的场景。
但实际部署时,很多人卡在三个地方:容器反复重启、模型通道接不进去、Skills 写了却不触发。我试过把 openclaw 跑在 Docker 里,再用 TaoToken 的统一 Key 通道接模型,最后挂一个 Python 写的 Excel 分析技能,整个过程踩了不少坑。这篇就把从 config.toml 骨架到技能验证的完整路径写清楚,你照着做能跑通一次可用的技能扩展。
核心检索词先摆出来:Docker 部署 openclaw、config.toml 配置、TaoToken 统一 Key、Python 自定义 Skills、SKILL.md 注册验证。适合已经装好 Docker、想给本地 Agent 加技能的人,也适合想把模型调用收敛到一个通道的团队。
2. 前置准备:TaoToken 通道与 openclaw 镜像
TaoToken 在这里的角色是统一模型入口。你不需要在 openclaw 里分别填各家模型的地址和 Key,而是把 base_url 指向 TaoToken 的 API 地址,用同一个 Key 调用不同模型。这样 config.toml 里只维护一份凭证,换模型只改模型名,不动通道配置。
官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意这个地址后面不加 UTM 参数,直接作为 base_url 使用。
你需要先拿到一个 API Key。登录后进控制台,在 API Keys 页面创建一个新 Key,复制出来备用。这个 Key 就是后面 config.toml 里填的凭证。如果你还没决定用哪个模型,可以先去模型对话页面试一下调用效果,确认通道通不通。
镜像方面,openclaw 官方镜像在 ghcr.io/openclaw/openclaw:latest。拉取前建议关掉不必要的进程,这个镜像解压和启动都比较吃内存,16G 的机器拉取时内存会明显上涨。拉取命令:
docker pull ghcr.io/openclaw/openclaw:latest拉完后在 Docker 桌面端的镜像列表里能看到它。接下来创建容器,注意路径要换成你自己的,别放在系统盘根目录下,除非你只有一个盘。下面这条命令把宿主机的 .openclaw 目录挂载到容器内,端口映射 18789:
docker run -d --name openclaw-agent -p 18789:18789 -v /your/path/.openclaw:/root/.openclaw -u root --restart unless-stopped ghcr.io/openclaw/openclaw:latestWindows 用户路径写成C:\Users\你的用户名\.openclaw:/root/.openclaw。启动后容器状态应该是 running,18789 旁边会出现跳转图标,点进去就是网关仪表盘。如果容器一直重启,先别急着改配置,大概率是配置文件格式错了或者网关没起来,后面排障章节会讲。
3. config.toml 骨架:把模型通道指向 TaoToken
openclaw 的模型配置有两种方式:交互式openclaw configure --section model,或者直接写 config.toml。交互式适合第一次跑通,但要做版本管理和多环境切换,还是得落到文件上。下面这份骨架你可以直接复制,改三个地方:api_key、base_url 已经填好 TaoToken 的地址、model 换成你要用的模型名。
# config.toml - openclaw 模型通道配置骨架 [gateway] host = "0.0.0.0" port = 18789 token = "你的网关令牌,从 openclaw.json 里复制" [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-你的TaoToken密钥" model = "claude-3-5-sonnet" timeout = 120 max_tokens = 4096 [model.params] temperature = 0.7 top_p = 0.9 [skills] enabled = true dir = "/root/.openclaw/skills" auto_reload = true几个关键点说明。provider 用 openai-compatible 是因为 TaoToken 的 API 兼容 OpenAI 格式,openclaw 走这个协议最省事。base_url 一定写https://taotoken.net/api,不要带任何查询参数。api_key 就是你在控制台创建的那串。model 字段填你想调用的模型标识,具体可用模型名在模型对话页面能看到。
网关令牌在.openclaw/openclaw.json里,容器启动后会自动生成。你可以用下面命令查看:
cat /your/path/.openclaw/openclaw.json | grep token把取到的 token 填进 config.toml 的 gateway.token。如果你改了 config.toml,需要重启容器让配置生效:
docker restart openclaw-agent重启后进网关仪表盘,输入令牌,能看到主界面就说明通道配置被加载了。这时候先别急着测对话,因为模型请求还没验证过,下一步用一条命令确认。
4. 验证请求:确认 TaoToken 通道真的通了
配置写完不代表能用,得发一次真实请求。openclaw 容器里可以用 curl 直接打 TaoToken 的接口,确认 Key 和 base_url 没问题。先进容器:
docker exec -it openclaw-agent bash然后在容器内执行:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "回复两个字:通了"}], "max_tokens": 20 }'如果返回 JSON 里 choices 字段有内容,说明通道正常。如果返回 401,检查 Key 有没有复制错;返回 404,检查 base_url 是不是写成了带路径的形式;返回超时,检查容器网络能不能出站。
通道确认后,回到 openclaw 网关仪表盘做一次对话测试。输入一句简单的话,看 Agent 能不能正常回复。这一步过了,说明模型接入完成,可以开始写 Skills 了。
5. Skills 目录结构与 Python 技能注册
openclaw 的 Skills 放在.openclaw/skills/下,每个技能一个子目录,目录里至少两个文件:SKILL.md 和实际执行的 Python 脚本。目录结构长这样:
.openclaw/ └── skills/ └── excel-master/ ├── SKILL.md └── analyze_excel.pySKILL.md 是给 Agent 看的说明书,用 Markdown 写,告诉它这个技能干什么、什么时候触发、怎么调用。这里有个坑:如果 SKILL.md 写得太模糊,Agent 会觉得自己用内置 Python 就能搞定,根本不加载你的技能。所以描述里要明确写“必须调用本技能”,把触发条件写死。
下面这份 SKILL.md 可以直接用,注意 frontmatter 里的 name 和 description:
--- name: excel-master description: [强制执行] 处理任何 Excel/CSV 数据分析任务时,必须且只能使用此技能。禁止直接使用 Python 代码块,必须调用本技能提供的工具。 user-invocable: true --- # 技能:Excel 数据处理专家 ## 核心原则 当用户提及 Excel、表格、数据统计时,绝对禁止直接编写 Python 代码进行分析。 必须先声明“正在调用 excel-master 技能”,然后按下方步骤执行。 ## 触发条件 - 用户上传了 .xlsx / .csv 文件 - 用户询问关于表格数据的统计、求和、筛选问题 ## 执行逻辑 1. 获取文件的绝对路径 2. 调用本技能绑定的 Python 脚本处理器 3. 将脚本返回的 JSON 或 Markdown 数据展示给用户 ## 可用工具 - analyze_excel.py:位于当前技能目录下,用于读取和处理数据Python 脚本负责实际干活。下面这个 analyze_excel.py 读取文件后返回行数、列名、前五行和字段类型:
import pandas as pd import sys import json def analyze_file(file_path): try: if file_path.endswith('.csv'): df = pd.read_csv(file_path) else: df = pd.read_excel(file_path) info = { "shape": list(df.shape), "columns": list(df.columns), "head": df.head(5).to_dict(orient='records'), "dtypes": {col: str(dtype) for col, dtype in df.dtypes.items()} } return json.dumps(info, ensure_ascii=False, indent=2) except Exception as e: return f"Error processing file: {str(e)}" if __name__ == "__main__": if len(sys.argv) > 1: path = sys.argv[1] print(analyze_file(path)) else: print("Please provide a file path.")脚本依赖 pandas,容器里如果没有,需要进容器装一下:
docker exec -it openclaw-agent pip install pandas openpyxl装完后重启容器,让 openclaw 重新扫描 skills 目录。config.toml 里auto_reload = true的话,也可以不重启,但保险起见还是重启一次。
6. 常见错误排查:容器重启、技能不触发、Key 失效
容器反复重启。最常见的原因是 openclaw.json 格式坏了,或者网关端口被占。先看日志:
docker logs openclaw-agent --tail 50如果日志里报 JSON parse error,说明配置文件有语法错误。把 openclaw.json 备份后重置,或者直接删掉让容器重新生成。另一个原因是数据库文件损坏,表现是容器起来又挂,日志里有 sqlite 相关报错。处理方式是进宿主机目录,把损坏的 db 文件改名备份:
mv /your/path/.openclaw/plugins/device-pair/state.sqlite /your/path/.openclaw/plugins/device-pair/state.sqlite.bak docker restart openclaw-agent技能不触发。Agent 明明收到了 Excel 文件却自己写代码,说明 SKILL.md 的 description 不够强硬。把“必须调用本技能”“禁止直接使用 Python”这类词写进 frontmatter 的 description 里,Agent 在决策时会优先匹配。另外确认 skills 目录路径和 config.toml 里的dir一致,容器内路径是/root/.openclaw/skills。
TaoToken 请求 401 或 403。先确认 Key 有没有过期或被禁用,去控制台 API Keys 页面看一眼状态。如果 Key 正常,检查 config.toml 里 api_key 有没有多余空格,base_url 是不是写成了https://taotoken.net/api/带尾斜杠,有些客户端对尾斜杠敏感。还有一点,容器内的时间如果和宿主机差太多,签名类请求会失败,用date命令对一下。
网关令牌找不到。openclaw.json 里 token 字段就是,如果文件被重置了,令牌会重新生成,去仪表盘重新输入即可。别把网关令牌和 TaoToken 的 API Key 搞混,前者是进 openclaw 界面的,后者是调模型的。
7. 下一步:把通道和技能固定下来
跑通一次之后,建议把 config.toml 和 skills 目录纳入版本管理,这样换机器或者重建容器时不用重新配。TaoToken 的 Key 可以放在环境变量里,config.toml 里用占位符引用,避免明文提交。
如果你后面要长期跑编码类任务或者 Agent 工作流,可以了解下 Coding Plan,它适合需要稳定调用和更高配额的场景。接入文档里有完整的参数说明和示例,排障时对着看能省不少时间。模型对话页面可以随时验证通道是否正常,不用每次都进容器 curl。
最后留一个实用习惯:每次改完 config.toml 或 SKILL.md,先docker restart openclaw-agent,再看日志确认没有报错,最后在仪表盘发一条测试消息。三步走完再去做别的,能避免很多“改了没生效”的困惑。