☰
为什么我建议你还是自己写小龙虾的 Skills?手把手教你打造专属自动化文献阅读工作流(TaoToken 统一 Key 接入版)
2026/10/18 17:19:57 网站建设 项目流程

1. 为什么通用 Skills 总差那么一口气

先说一个我观察到的现象:很多人装好 OpenClaw 之后,第一件事就是冲进 ClawHub 技能市场,按下载量排序,一口气装十几个 Skills。装完发现——能用的没几个。要么触发条件跟你说话的习惯对不上,要么权限开得太大不敢用,要么跑起来就报错。

这不是 OpenClaw 的问题,是「通用」这件事本身的代价。一个 Skill 要照顾几千个用户,它只能写得很泛。比如联网搜索类 Skill,它默认搜公开互联网,但你真正想要的是让它读你本地Papers/文件夹里的 PDF,再把摘要写进 Obsidian。这种需求,通用 Skill 永远做不好,因为它不知道你的文件夹叫什么、你的 WebDAV 账号是谁、你的笔记模板长什么样。

自己写 SKILL.md 的价值就在这里:你可以把「我的工作流」精确翻译成 AI 能执行的指令。路径是你自己的,认证是你自己的,输出格式是你自己的。这篇文章就带你从零写一个「文献自动摘要归档」的 Skill,用 TaoToken 统一 Key 接入模型,WebDAV 同步 PDF 到 Obsidian,最后跑一次端到端验证,确认从抓取到落库全链路通。

适合谁看:手上有 OpenClaw、想认真做科研文献管理的人;已经装了 Skills 但觉得不顺手、想自己动手的人;以及想搞清楚 SKILL.md 到底怎么写才不报错的人。下面所有配置都可以直接复制,改几个路径就能跑。

2. TaoToken 统一 Key 接入:把模型渠道先理顺

写 Skill 之前,得先把模型通道打通。OpenClaw 本身不提供模型,它需要一个兼容 OpenAI 接口的 Base URL 和 Key。我试过在多个渠道之间来回切,最烦的是每个 Skill 都要单独配一遍 Key,改起来容易漏。用 TaoToken 的好处是:一个 Key 覆盖多个模型,Base URL 统一,Skill 里只认这一套配置,换模型不用动 Skill 代码。

2.1 拿到统一 Key

登录 TaoToken 控制台,在 API Keys 页面创建一个新 Key。建议按用途命名,比如openclaw-paper,方便以后排查是哪个应用在调用。创建后立即复制保存,页面刷新后就看不到了。

拿到 Key 之后,OpenClaw 的模型配置指向 TaoToken 的 API 地址:

{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoToken密钥", "model": "claude-sonnet-4-20250514" }

注意 Base URL 是https://taotoken.net/api,不要多加/v1,OpenClaw 内部会自己拼路径。Model ID 按你实际要用的填,文献摘要这种任务用 Claude 系列比较稳,长文本理解不容易丢信息。

2.2 在 OpenClaw 里落地配置

OpenClaw 的模型配置一般放在~/.openclaw/config.json(不同版本路径可能略有差异,以你本地为准)。把上面那段 JSON 合并进去,保存后重启 OpenClaw。如果你用的是 Claude Code 那套配置体系,对应的settings.json里也是同样的三件套:Base URL、Key、Model ID,一个都不能少。

提示:Key 不要硬编码进 SKILL.md。Skill 文件可能会被分享或同步,Key 写在环境变量或 OpenClaw 的全局配置里,Skill 只引用变量名。

2.3 验证模型通道是否通

在正式写 Skill 之前,先用一个最小请求确认通道没问题。OpenClaw 一般带一个chat命令或者交互模式,直接发一句:

openclaw chat --message "回复 OK 两个字母即可"

如果返回OK,说明 Base URL、Key、Model ID 三件套都对。如果报 401,多半是 Key 复制时带了空格;如果报 model not found,检查 Model ID 拼写。这一步过了,再往下写 Skill,出问题就能排除掉模型通道的因素。

3. 可复制配置:SKILL.md 与 WebDAV 同步脚本

这一节是核心。我们写一个叫paper-to-obsidian的 Skill,职责单一:读 PDF、提摘要、生成 Obsidian 笔记、通过 WebDAV 上传。

3.1 SKILL.md 完整内容

在 OpenClaw 的 skills 目录下新建文件夹paper-to-obsidian,里面放SKILL.md:

--- name: paper-to-obsidian description: 批量读取学术论文PDF,提取标题、作者、摘要,生成Obsidian格式笔记,通过WebDAV同步到本地库。当用户说"把论文导入Obsidian""整理这几篇PDF""生成文献笔记"时激活。 version: 1.0.0 tags: [academic, paper, obsidian, webdav, automation] --- # 论文阅读笔记同步 Skill ## 触发场景 用户请求"帮我读这篇论文并整理笔记""把这几篇PDF导入Obsidian""生成文献阅读笔记"时激活。 ## 必要环境变量 - `WEBDAV_URL`: WebDAV 服务地址 - `WEBDAV_USERNAME`: WebDAV 账号 - `WEBDAV_PASSWORD`: WebDAV 应用密码(非登录密码) - `OBSIDIAN_PAPER_PATH`: Obsidian 库中存放论文笔记的目录,如 `Papers/` ## 执行步骤 ### Step 1: 读取 PDF 接收用户提供的 PDF 路径列表,用 pdfplumber 提取文本。 ### Step 2: 提取关键信息 从文本中提取标题、作者、发表日期、摘要。摘要定位关键词为 Abstract。 ### Step 3: 生成 Markdown 按下方模板生成笔记,文件名格式 `YYYYMMDD_标题简写.md`。 ### Step 4: 上传 WebDAV 用 webdavclient3 连接,上传到 `OBSIDIAN_PAPER_PATH` 目录。 ### Step 5: 返回结果 报告成功与失败数量,失败项给出原因。 ## 笔记模板 ```markdown --- title: {标题} authors: {作者} date: {日期} tags: [paper, reading-notes] type: paper-note --- # {标题} ## 摘要 {摘要} ## 核心观点 [待补充] ## 阅读日期 {今日日期}

注意事项

  • 加密 PDF 或扫描版跳过并告知用户
  • 文件名非法字符\ / : * ? " < > |替换为下划线
  • WebDAV 密码必须是应用密码,不是登录密码
### 3.2 WebDAV 同步脚本 Skill 描述只是给模型看的指令,真正干活的是 Python 脚本。放在同目录 `sync.py`: ```python #!/usr/bin/env python3 import os, re, sys from datetime import datetime from pathlib import Path import pdfplumber from webdav3.client import Client def extract_pdf(path): with pdfplumber.open(path) as pdf: text = "\n".join(p.extract_text() or "" for p in pdf.pages) lines = [l.strip() for l in text.split("\n") if l.strip()] title = lines[0] if lines else "Untitled" m = re.search(r"Abstract[:\s]*(.*?)(?=\n\n|Introduction|$)", text, re.I | re.S) abstract = m.group(1).strip()[:600] if m else "" return {"title": title, "abstract": abstract, "path": path} def build_md(info): today = datetime.now().strftime("%Y-%m-%d") return f"""--- title: {info['title']} authors: Unknown date: {today} tags: [paper, reading-notes] type: paper-note --- # {info['title']} ## 摘要 {info['abstract']} ## 核心观点 [待补充] ## 阅读日期 {today} """ def safe_name(title): return re.sub(r'[\\/:*?"<>|]', "_", title)[:80] def main(pdfs): opts = { "webdav_hostname": os.environ["WEBDAV_URL"], "webdav_login": os.environ["WEBDAV_USERNAME"], "webdav_password": os.environ["WEBDAV_PASSWORD"], } client = Client(opts) remote_dir = os.environ.get("OBSIDIAN_PAPER_PATH", "Papers/") if not client.exists(remote_dir): client.mkdir(remote_dir) ok, fail = 0, 0 for p in pdfs: try: info = extract_pdf(p) md = build_md(info) fname = f"{datetime.now().strftime('%Y%m%d')}_{safe_name(info['title'])}.md" client.upload_sync(f"{remote_dir}{fname}", md.encode("utf-8")) print(f"OK: {fname}") ok += 1 except Exception as e: print(f"FAIL: {p} -> {e}") fail += 1 print(f"完成 成功{ok} 失败{fail}") if __name__ == "__main__": main(sys.argv[1:])

依赖安装:

pip install pdfplumber webdavclient3

3.3 环境变量配置

在 OpenClaw 启动脚本或系统环境里设置:

export WEBDAV_URL="https://dav.jianguoyun.com/dav/" export WEBDAV_USERNAME="你的账号邮箱" export WEBDAV_PASSWORD="你的应用密码" export OBSIDIAN_PAPER_PATH="Papers/"

WebDAV 应用密码要在服务商网页端的「安全选项」里单独生成,不要用登录密码。这一步很多人踩坑,用登录密码会直接 401。

4. 验证请求:跑一次端到端全链路

配置写完,必须验证。找两篇 PDF 放到~/papers/下,然后对 OpenClaw 说:

帮我把 ~/papers/ 下的论文导入 Obsidian

OpenClaw 会匹配到paper-to-obsidian的触发场景,加载 SKILL.md,调用sync.py。你也可以先绕过模型,直接手动跑脚本确认底层通:

python sync.py ~/papers/test1.pdf ~/papers/test2.pdf

预期输出:

OK: 20260115_Attention_Is_All_You_Need.md OK: 20260115_Deep_Residual_Learning.md 完成 成功2 失败0

然后打开 Obsidian,等 WebDAV 同步完成,在Papers/目录下应该能看到两个新笔记,YAML frontmatter 里的 title、date、tags 都填好了,摘要段落有内容。如果摘要为空,说明 PDF 里 Abstract 关键词的排版跟正则没匹配上,可以手动调整正则或换pdfplumber的提取参数。

这一步跑通,意味着「PDF 读取 → 信息提取 → Markdown 生成 → WebDAV 上传 → Obsidian 落库」全链路闭环。之后你只要把 PDF 丢进文件夹,一句话就能批量归档。

5. 本篇常见错排查:401、local proxy failed 与 reading choices

写 Skill 和调通道的过程中,有几个报错几乎人人都会遇到。我把它们和对应解法列出来,你对照着查。

401 Unauthorized:出现在模型调用或 WebDAV 上传两个环节。模型侧检查 TaoToken Key 是否复制完整、Base URL 是否为https://taotoken.net/api;WebDAV 侧检查用的是不是应用密码。两者都会返回 401,但报错来源不同,看日志里是chat还是upload就能区分。

local proxy failed:OpenClaw 启动时报这个,通常是本地网络配置或端口占用。先确认没有其他进程占用 OpenClaw 的默认端口,再检查系统代理设置是否指向了一个不存在的地址。把代理关掉重试,多数能恢复。

reading choices 相关报错:模型返回结构里choices字段读不到,一般是 Model ID 填错,或者 Base URL 多写了/v1导致路径拼接错误。回到 §2.1 的三件套逐项核对,Base URL 保持https://taotoken.net/api原样。

OAuth 报错:如果你用的是 Claude Code 那套 OAuth 流程,报 OAuth 失败时先确认settings.json里的认证字段没有跟 API Key 混用。OAuth 和 Key 是两套认证,不要同时配。

WebDAV 上传成功但 Obsidian 没出现笔记:不是 Skill 的问题,是 Obsidian 端的 WebDAV 同步插件还没拉取。手动触发一次同步,或者检查OBSIDIAN_PAPER_PATH是否跟插件配置的远程目录一致。

排查顺序建议:先手动跑sync.py确认底层通,再走 OpenClaw 确认 Skill 触发正常,最后看 Obsidian 同步。分层定位,比一上来就怀疑模型快得多。

6. 把 Key 和文档收好,下一步交给 Coding Plan

Skill 跑通之后,日常维护其实很轻:新增 PDF 丢文件夹,一句话触发。真正需要你操心的,是 Key 的管理和文档的查阅。TaoToken 的 API Keys 页面可以按应用建多个 Key,建议给 OpenClaw 单独一个,方便用量归因和随时吊销。接入文档里有 Base URL、Model ID 列表和常见错误码说明,遇到报错先翻文档比瞎试快。

如果你打算把这个文献工作流长期跑下去,甚至扩展成多个 Skill 协同(比如再加一个「自动生成文献综述」的 Skill),可以考虑 Coding Plan。它适合长期编码和 Agent 类任务,Key 和额度管理更省心,不用每次手动续。

  • 排障与接入:API Keys 页面 + 接入文档
  • 验证模型是否正常:模型对话页面
  • 长期编码与 Agent 任务:Coding Plan

最后说个实用技巧:SKILL.md 里的触发场景描述,尽量用你平时说话的原话。比如你习惯说「把这堆论文归档一下」,就把这句写进触发场景,模型匹配率会明显提高。Skill 是改出来的,第一版跑通就行,后面根据实际报错慢慢调。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询