1. 为什么 OpenClaw 的跨平台协作总在文件这一步卡住
OpenClaw AI 助手最让人上头的地方,是它能自己拆任务、调工具、写文件。但真把它当成团队里的一个“数字同事”用起来,你会发现一个很尴尬的断层:AI 助手在云服务器上跑,生成的东西落在它的本地工作目录里;你在自己的笔记本上,想拿到这份成果,要么让它发邮件,要么让它丢云盘,要么手动 scp 拉回来。文件在中间这段路上,永远是断的。
我一开始的用法很原始。让 OpenClaw 写完一篇稿子,它存在/root/workspace/output.md,然后我得 SSH 上去,cat 出来,复制粘贴到本地。后来换成让它把文件内容直接打印在对话里,再手动存成文件。文件一大,对话窗口就开始截断,中文还容易乱码。再后来想让它直接写进 NAS,问题更明显:AI 助手根本没有访问 NAS 的能力,它只能操作自己那台机器上的路径。
这就是 OpenClaw 跨平台协作里最真实的痛点——AI agent、本地文件、异地访问三者之间缺一座桥。NAS 作为私有存储,容量大、保密性好、团队共享方便,但它对 AI 助手来说是一块“看不见的磁盘”。WebDAV 恰好是几乎所有 NAS 都支持的标准文件协议,而 OpenClaw 的 Skill 系统天生就是用来扩展能力的。把这两件事接起来,AI 助手就能直接读写 NAS,跨平台协作的断点自然就补上了。
我写这个 WebDAV Skill 的初衷很朴素:让 OpenClaw 生成的文件,能直接落到 NAS 的共享目录里;让团队放在 NAS 上的模板和素材,AI 助手能直接拉取使用。整个过程不需要人工搬运,也不需要把 NAS 暴露成什么奇怪的服务。它就是一个标准的 WebDAV 客户端,挂在 OpenClaw 的技能目录下,用自然语言就能调用。
这篇文章会从 settings 配置入手,把 WebDAV Skill 的.env和 OpenClaw 的 settings 指向 TaoToken 统一 Key/API 通道这件事讲透。因为很多人卡的不是 WebDAV 本身,而是 AI 助手的模型调用通道没统一,导致多设备之间 Key 到处散落,协作数据也跟着乱。把配置收敛到一处,跨平台同步才真正成立。
适合谁看:已经在用 OpenClaw 或 Claude Code 做自动化、手里有 NAS(群晖、威联通、飞牛、Nextcloud 都行)、想让 AI 生成物自动归档到共享目录的人。如果你还没配过 WebDAV,跟着做也能跑通。
2. TaoToken 前置:把 OpenClaw 的模型通道统一到一处
在讲 WebDAV Skill 之前,得先把一个容易被忽略的前置问题解决掉:OpenClaw 在多设备之间协作时,模型调用的 Key 和 Base URL 如果各写各的,配置就会散落在每台机器上。你在云服务器上配一套,在本地 Ubuntu 上又配一套,改一次要改好几处,跨平台同步的“配置”本身先乱了。
我的做法是把 OpenClaw 的模型通道统一指向 TaoToken。TaoToken 提供统一的 API 入口,OpenClaw、Claude Code、Cline 这类工具都可以走同一个 Base URL 和同一个 Key。这样无论 AI 助手跑在云服务器还是本地,模型调用这一层是一致的,WebDAV Skill 负责的只是文件同步,两件事各管各的,边界清晰。
TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。注意 API 地址后面不加任何 UTM 参数,配置里就写这个干净的地址。
你需要先拿到一个 API Key。进入控制台的 API Keys 页面创建:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建后复制出来,形如sk-xxxxxxxx。这个 Key 就是后面 settings 里要填的东西。
模型 ID 怎么选?如果你主要用 OpenClaw 做编码和 Agent 任务,可以先用claude-sonnet-4-5这类通用能力强的模型;如果只是做轻量对话验证,用更小的模型也行。模型 ID 要和你实际在 TaoToken 上开通的保持一致,写错了会直接报 model not found。
这里有个关键点:OpenClaw 的 settings 和 WebDAV Skill 的.env是两个独立的配置文件。settings 管的是模型通道(Base URL、Key、Model ID),.env管的是 NAS 的 WebDAV 地址和认证。很多人把这两件事混在一起,结果排查问题时不知道是模型调不通还是 NAS 连不上。分开配,分开测,出问题一眼就能定位。
如果你还没决定用哪种方式接入,可以先在模型对话页面验证一下 Key 是否可用:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。能正常对话,说明 Key 和模型 ID 没问题,再去配 OpenClaw 就稳了。
对于长期跑编码和 Agent 任务的场景,可以考虑 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它的定位是给持续性的编码工作提供更稳定的通道,和 WebDAV Skill 配合起来,AI 助手在云上跑任务、成果自动落到 NAS,整条链路就顺了。
接入文档在这里,配置项有疑问可以对照:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
把模型通道统一之后,接下来才是 WebDAV Skill 的 settings 配置。顺序别反,否则你会同时面对两个变量,排障成本翻倍。
3. 可复制配置:settings 指向 TaoToken 与 WebDAV Skill 的 .env
这一节是全文最核心的部分,所有配置片段都可以直接复制。我按“先模型通道、后 WebDAV”的顺序给,路径和原文保持一致。
3.1 OpenClaw settings 指向 TaoToken
OpenClaw 的模型配置通常放在它的 settings 文件里。不同版本路径略有差异,常见的是~/.openclaw/settings.json或项目目录下的settings.json。我用的是 JSON 格式,内容如下:
{ "model": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoToken密钥", "model_id": "claude-sonnet-4-5", "timeout": 120 }, "skills_dir": "~/.openclaw/skills", "workspace": "~/workspace" }三个关键字段必须写全:base_url是https://taotoken.net/api,api_key是你从控制台复制的 Key,model_id是你实际开通的模型。这三个就是所谓的“三件套”,缺一个都调不通。provider写openai-compatible是因为 TaoToken 的 API 兼容 OpenAI 格式,OpenClaw 能直接识别。
如果你用的是 Claude Code 或 Cline,配置形式不同但三件套一样。Claude Code 走的是环境变量或~/.claude/settings.json,Cline 走的是 MCP 配置里的env字段。无论哪种,Base URL、Key、Model ID 都要对齐到 TaoToken。
3.2 WebDAV Skill 的 .env 配置
WebDAV Skill 的配置文件在技能目录下,路径是~/.openclaw/skills/webdav/.env。内容如下:
WEBDAV_SERVER=https://192.168.0.18:5006 WEBDAV_USERNAME=your_username WEBDAV_PASSWORD=your_password WEBDAV_SSL_VERIFY=falseWEBDAV_SERVER填你 NAS 的 WebDAV 地址。局域网内就是 NAS 的 IP 加端口,飞牛默认 WebDAV 端口常见是 5006,群晖是 5006 或 5005,威联通是 8080 或 443。WEBDAV_SSL_VERIFY=false是因为自签名证书环境下开启验证会直接握手失败,先用 false 跑通,再考虑换正式证书。
注意.env里的密码如果包含特殊字符,比如#或空格,要用引号包起来,否则会被解析截断。我踩过一次坑,密码里有个#,结果认证一直 401,排查了半天才发现是配置文件把#后面当注释了。
3.3 目录结构对照
配置放对位置很重要,整个技能目录长这样:
webdav/ ├── SKILL.md ├── main.py ├── requirements.txt ├── README.md ├── .env └── .venv/.env和main.py同级,main.py里的load_config()会优先读环境变量,再读.env文件。所以你也可以不写.env,直接在启动命令前用环境变量传,适合临时测试:
cd ~/.openclaw/skills/webdav WEBDAV_SERVER=https://192.168.0.18:5006 \ WEBDAV_USERNAME=your_username \ WEBDAV_PASSWORD=your_password \ WEBDAV_SSL_VERIFY=false \ .venv/bin/python3 main.py test这种写法不会污染.env,测完就没了。正式用还是写进.env,让 OpenClaw 调用时自动加载。
3.4 安装依赖
Python 依赖只有requests一个,但虚拟环境要建好:
cd ~/.openclaw/skills/webdav python3 -m venv .venv .venv/bin/pip install -r requirements.txtUbuntu/Debian 上如果venv报错,先装python3.12-venv:
sudo apt install python3.12-venv到这里,模型通道和 WebDAV 通道的配置就都齐了。下一步是验证它们各自能不能通。
4. 验证请求:从连接测试到跨平台同步成功
配置写完不代表能用,必须一步步验证。我习惯先单独测 WebDAV,再测模型通道,最后测两者协同。
4.1 测试 WebDAV 连接
进入技能目录,跑 test 命令:
cd ~/.openclaw/skills/webdav .venv/bin/python3 main.py test正常输出是这样:
WebDAV 连接正常 服务器: https://192.168.0.18:5006 用户名: xiejava HTTP 状态: 207 SSL 验证: 关闭HTTP 状态 207 是 WebDAV 的 Multi-Status,说明 PROPFIND 请求成功,认证也过了。如果返回 401,是用户名密码问题;返回 404,是路径不对;返回 502/503,是 NAS 的 WebDAV 服务没起来或者端口不对。
4.2 列出 NAS 共享目录
连接通了之后,列出目录验证读写权限:
.venv/bin/python3 main.py list remote=openclaw_sharedoc如果目录里有文件,会逐个列出来,包含文件名、大小、修改时间。这一步能过,说明你的账号对该目录至少有读权限。
4.3 上传一个测试文件
本地建个测试文件,上传到 NAS:
echo "hello from openclaw" > /tmp/test_upload.txt .venv/bin/python3 main.py upload local=/tmp/test_upload.txt remote=openclaw_sharedoc/test_upload.txt上传过程中会显示进度条,64KB 分块流式上传。完成后去 NAS 的共享目录里看,文件应该在了。这一步验证的是写权限。
4.4 在 OpenClaw 里用自然语言调用
单独测通之后,回到 OpenClaw 对话里,直接用中文下指令:
列出NAS目录 openclaw_sharedoc 上传 /tmp/report.pdf 到NAS openclaw_sharedoc/report.pdf 下载NAS文件 openclaw_sharedoc/report.pdf 到 /tmp/OpenClaw 会匹配到 WebDAV Skill,转成结构化调用执行。如果它没识别,检查SKILL.md是否在技能目录里,以及 settings 里的skills_dir是否指向正确路径。
4.5 跨平台同步验证
这是最关键的一步。我的 OpenClaw 跑在云服务器上,NAS 在家里局域网。云服务器通过 DDNS 或者内网穿透访问 NAS 的 WebDAV 端口。验证流程:
第一步,在云服务器的 OpenClaw 里让它写一篇文档,并指定输出到 NAS:
写一篇关于 WebDAV 的技术笔记,保存到NAS openclaw_sharedoc/notes/webdav_note.md第二步,OpenClaw 调用 WebDAV Skill 上传,完成后在对话里会返回上传成功的路径。
第三步,回到本地 Ubuntu,用 Trae 或者任何支持 WebDAV 的编辑器,挂载 NAS 的共享目录,直接打开webdav_note.md。文件内容应该和云上生成的一致。
第四步,在本地修改这个文件并保存,NAS 上的文件同步更新。再回到云服务器,让 OpenClaw 读取这个文件:
读取NAS文件 openclaw_sharedoc/notes/webdav_note.md它读到的应该是你本地修改后的版本。这一来一回,就证明了 AI agent、本地、异地三者通过 WebDAV 真正打通了。
4.6 模型通道验证
WebDAV 通了之后,确认 OpenClaw 的模型调用走的是 TaoToken。在对话里问一个简单问题,比如“你现在用的是哪个模型”,或者直接看 OpenClaw 的日志,确认请求发往https://taotoken.net/api。如果日志里出现的是别的地址,说明 settings 没生效,检查文件路径和 JSON 格式。
两个通道都验证通过,整个链路才算真正可用。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞上的几类报错,我按实际遇到的顺序列出来,对照着查。
5.1 WebDAV 返回 401 Unauthorized
这是最高频的。原因通常有三个:用户名密码写错、.env里密码含特殊字符被截断、NAS 的 WebDAV 权限没给这个账号。先确认.env里的密码用引号包起来,再确认 NAS 后台该账号对共享目录有读写权限。飞牛 NAS 要在 WebDAV 设置里明确勾选可访问的文件夹范围,没勾的目录即使认证过了也会 403 或 404。
5.2 local proxy failed
这个报错一般出现在 OpenClaw 调用模型时,不是 WebDAV 的问题。意思是本地到 TaoToken 的连接没建立起来。检查三件事:base_url是不是https://taotoken.net/api,网络能不能通(curl https://taotoken.net/api看返回),以及有没有多余的代理环境变量干扰。如果你机器上设了HTTP_PROXY之类的变量,先 unset 掉再试。
5.3 reading choices 相关报错
这类报错通常是模型返回格式和 OpenClaw 预期不一致。常见原因是model_id写错了,或者用了一个不支持 OpenAI 兼容格式的模型。回到 TaoToken 控制台确认模型 ID,然后在模型对话页面单独测一下这个模型能不能正常返回。如果对话页面正常、OpenClaw 报错,那就是 settings 里的provider或model_id没对齐。
5.4 OAuth 相关报错
如果你用的是 Claude Code 并且走了 OAuth 登录流程,可能会遇到 token 过期或 scope 不对的报错。这种情况建议改用 API Key 方式接入 TaoToken,在 settings 里直接填 Key,绕开 OAuth 的复杂性。Claude Code 的配置里把认证方式从 OAuth 切到 API Key,三件套填全,问题基本就消失了。
5.5 上传大文件超时
WebDAV Skill 内置了重试机制,对 500/502/503/504 会自动重试 3 次,退避策略。但如果文件特别大、网络特别慢,还是可能超时。可以在.env里加一个超时配置,或者在main.py里调整timeout参数。另外确认 NAS 的 WebDAV 服务没有单文件大小限制。
5.6 中文路径乱码
WebDAV Skill 对中文路径做了 URL 编码处理,但如果你在 NAS 后台看到的文件名是乱码,可能是 NAS 的文件系统编码和客户端不一致。建议共享目录里尽量用英文命名,中文文件名虽然能传,但在某些 NAS 系统上显示会不正常。
5.7 Skill 没被 OpenClaw 识别
检查~/.openclaw/skills/webdav/SKILL.md是否存在,以及 settings 里的skills_dir路径是否正确。OpenClaw 启动时会扫描技能目录,如果目录层级不对,比如多套了一层文件夹,就扫不到。正确的层级是skills/webdav/SKILL.md,不是skills/webdav/webdav/SKILL.md。
排查的顺序建议是:先单独测 WebDAV(main.py test),再单独测模型(模型对话页面),最后测 OpenClaw 里的协同。每次只改一个变量,出问题才能定位。
6. 把配置收敛到 TaoToken,让跨平台协作真正闭环
WebDAV Skill 解决的是文件层的跨平台问题,TaoToken 解决的是模型通道的统一问题。这两件事看起来独立,实际上是一套组合拳:文件通过 WebDAV 在 NAS 上汇聚,模型调用通过 TaoToken 在统一入口收敛,OpenClaw 在中间做调度。三者各司其职,配置就不会散。
我现在的用法是,云服务器上的 OpenClaw 负责跑任务、生成内容,所有产出直接通过 WebDAV Skill 落到 NAS 的共享目录。本地机器通过 WebDAV 挂载同一个目录,随时查看和编辑。模型通道全部指向 TaoToken,不管 OpenClaw 跑在哪台机器上,Key 和 Base URL 都是同一套。换机器、加设备,只需要配一次 settings,不用到处复制 Key。
如果你要开始配,建议的顺序是:先去 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 拿 Key,把 OpenClaw 的 settings 三件套填好,在模型对话页面验证通过;然后配 WebDAV Skill 的.env,用main.py test验证连接;最后在 OpenClaw 里用自然语言下一条上传指令,看文件能不能落到 NAS。三步都过,链路就通了。
长期跑编码和 Agent 任务的话,Coding Plan 的通道更稳一些:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。配置项有疑问对照接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后说一个实用技巧:把 WebDAV Skill 的.env和 OpenClaw 的 settings 都纳入版本管理,但 Key 和密码用环境变量注入,不要硬编码进仓库。这样多设备同步配置时,拉下来改一下环境变量就能跑,既统一又安全。跨平台协作的难点从来不是协议本身,而是配置的收敛和一致。把这一点做好,剩下的就是自然语言下指令的事了。