展 —— ClawdHub 與自定義 Skill 開(kāi)發(fā)入門(mén)(TaoToken 統(tǒng)一 Key 接入))
1. 從“能聊天”到“能干活”O(jiān)penClaw 技能擴(kuò)展到底解決什么問(wèn)題很多人第一次用 OpenClaw會(huì)覺(jué)得它跟普通對(duì)話工具差不多能讀文件、能跑命令、能查網(wǎng)頁(yè)但也就那樣。真正讓它從“會(huì)聊天的助手”變成“能替你干活的自動(dòng)化平臺(tái)”的是 Skill 技能擴(kuò)展機(jī)制。你可以把 OpenClaw 本體理解成一部剛出廠的手機(jī)系統(tǒng)自帶電話、短信、相機(jī)而 Skill 就是你后來(lái)裝上去的 AppClawdHub 則是那個(gè)應(yīng)用商店。手機(jī)能不能變成生產(chǎn)力工具取決于你裝了什么 App。這篇是 OpenClaw 系列的第八篇聚焦一條完整鏈路從 ClawdHub 拉取現(xiàn)成 Skill到按規(guī)范寫(xiě)一個(gè)自定義 Skill再到本地調(diào)試、驗(yàn)證它是否被正確加載執(zhí)行。中間會(huì)順帶把模型調(diào)用通道配好——因?yàn)?Skill 里只要涉及“讓模型判斷一下再?zèng)Q定調(diào)哪個(gè)工具”就需要一個(gè)穩(wěn)定的 API 入口。我用的是 TaoToken 的統(tǒng)一 Key 通道一個(gè) Key 走通對(duì)話和編碼類(lèi)模型省得在多個(gè)平臺(tái)之間來(lái)回切。適合誰(shuí)看已經(jīng)裝好 OpenClaw、能跑通基礎(chǔ)對(duì)話但還沒(méi)碰過(guò) Skill 目錄的人想給團(tuán)隊(duì)做內(nèi)部專(zhuān)屬能力比如讀內(nèi)部表格、發(fā)通知、調(diào)內(nèi)部接口的開(kāi)發(fā)者以及被“技能不生效”“裝完沒(méi)反應(yīng)”折騰過(guò)的新手。整篇按可跟做的步驟寫(xiě)命令、目錄結(jié)構(gòu)、manifest 配置都會(huì)給全你照著敲就能跑出結(jié)果。先說(shuō)清楚一個(gè)概念邊界避免后面混淆。OpenClaw 里的 Skill 不是那種重量級(jí)插件框架它極度輕量一個(gè)入口文件加一份描述配置就能跑。它的價(jià)值在于把“一段確定性邏輯”包裝成模型可以主動(dòng)調(diào)用的能力。模型負(fù)責(zé)理解你要干什么Skill 負(fù)責(zé)真正執(zhí)行。兩者配合才有“一句話觸發(fā)自動(dòng)化”的效果。我實(shí)測(cè)下來(lái)最容易卡住新手的不是寫(xiě)代碼而是三件事Skill 放錯(cuò)目錄導(dǎo)致根本沒(méi)被掃描到manifest 里字段寫(xiě)錯(cuò)導(dǎo)致加載報(bào)錯(cuò)但提示不明顯Skill 內(nèi)部要調(diào)模型時(shí)API 配置散落在各處導(dǎo)致 401。這篇會(huì)把這三個(gè)坑都填上。2. TaoToken 前置準(zhǔn)備給 Skill 一個(gè)統(tǒng)一的模型調(diào)用入口在寫(xiě) Skill 之前先把模型通道準(zhǔn)備好。原因很簡(jiǎn)單很多 Skill 不是純本地邏輯它需要“讓模型先理解再執(zhí)行”。比如一個(gè)“智能日?qǐng)?bào)”Skill得先讓模型把零散記錄整理成結(jié)構(gòu)化內(nèi)容再調(diào)用發(fā)送接口。如果每個(gè) Skill 各自配一套 API Key維護(hù)起來(lái)會(huì)非常痛苦。統(tǒng)一走 TaoToken 的 Key是最省事的做法。TaoToken 在這里扮演的角色是“統(tǒng)一模型接入層”。你拿到一個(gè) Key就能通過(guò)兼容接口調(diào)用多種模型對(duì)話類(lèi)、編碼類(lèi)都能覆蓋。對(duì) OpenClaw 這種需要頻繁調(diào)用模型的場(chǎng)景來(lái)說(shuō)好處是配置只寫(xiě)一份Skill 里引用同一個(gè)環(huán)境變量即可。官網(wǎng)地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址后面不加任何查詢參數(shù)。第一步去控制臺(tái)創(chuàng)建 Key。打開(kāi) https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登錄后在 API Keys 頁(yè)面新建一個(gè)密鑰。建議按用途命名比如openclaw-skill方便以后區(qū)分。創(chuàng)建后立刻復(fù)制保存頁(yè)面刷新后就看不到完整 Key 了。第二步把 Key 寫(xiě)進(jìn)環(huán)境變量而不是硬編碼進(jìn) Skill 代碼。這是安全底線也是后面排障時(shí)能快速定位問(wèn)題的前提。Linux/macOS 下編輯 shell 配置# 寫(xiě)入 ~/.bashrc 或 ~/.zshrc export TAOTOKEN_API_KEYsk-你的實(shí)際Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows PowerShell 用setx TAOTOKEN_API_KEY sk-你的實(shí)際Key setx TAOTOKEN_BASE_URL https://taotoken.net/api改完記得重開(kāi)終端或者source ~/.zshrc讓變量生效。驗(yàn)證一下echo $TAOTOKEN_BASE_URL # 應(yīng)輸出 https://taotoken.net/api第三步確認(rèn) OpenClaw 的模型配置指向這個(gè)通道。OpenClaw 的模型配置通常在項(xiàng)目根目錄的配置文件里找到模型相關(guān)段落把 base URL 和 Key 引用改成環(huán)境變量。不同版本字段名略有差異核心是三項(xiàng)Base URL、API Key、Model ID。這三件套必須齊全缺一個(gè)就會(huì)在調(diào)用時(shí)報(bào)錯(cuò)。注意不要把 Key 提交到 Git 倉(cāng)庫(kù)。如果你在團(tuán)隊(duì)里共享 OpenClaw 配置用.env文件并把它加進(jìn).gitignore或者用密鑰管理服務(wù)注入環(huán)境變量。配好之后建議先用一次最簡(jiǎn)單的模型對(duì)話驗(yàn)證通道是否通。打開(kāi) https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 在頁(yè)面里發(fā)一條測(cè)試消息能正常返回就說(shuō)明 Key 和通道沒(méi)問(wèn)題。這一步別跳過(guò)否則后面 Skill 報(bào)錯(cuò)時(shí)你分不清是 Skill 的問(wèn)題還是通道的問(wèn)題。3. 可復(fù)制配置ClawdHub 安裝命令與自定義 Skill 目錄結(jié)構(gòu)這一節(jié)是整篇的核心操作區(qū)。先講從 ClawdHub 拉現(xiàn)成 Skill再講自己寫(xiě)一個(gè)最后給出可直接復(fù)制的 manifest 配置片段。3.1 從 ClawdHub 安裝現(xiàn)成 SkillOpenClaw 內(nèi)置了技能管理命令不需要你手動(dòng)下載解壓。先列出 ClawdHub 上可用的技能npm run skill:list這條命令會(huì)拉取遠(yuǎn)程技能索引并打印列表包含技能名、版本、簡(jiǎn)介。找到你想要的比如一個(gè)通知類(lèi)技能直接安裝npm run skill:install feishu-notifier安裝完成后查看已裝列表npm run skill:list --installed卸載和更新分別是npm run skill:uninstall feishu-notifier npm run skill:update安裝類(lèi)操作完成后新技能一般會(huì)被自動(dòng)掃描到不需要重啟。但如果你改了技能目錄結(jié)構(gòu)或 manifest重啟一次更穩(wěn)妥。3.2 自定義 Skill 的目錄結(jié)構(gòu)自定義 Skill 放在項(xiàng)目根目錄的skills/下每個(gè)技能一個(gè)獨(dú)立文件夾。標(biāo)準(zhǔn)結(jié)構(gòu)如下skills/ └── my-custom-skill/ ├── index.js # 技能入口導(dǎo)出 run 方法 ├── manifest.json # 技能描述與參數(shù)聲明 ├── config.json # 可選運(yùn)行時(shí)配置 └── README.md # 可選說(shuō)明文檔manifest.json是模型識(shí)別技能的關(guān)鍵字段寫(xiě)錯(cuò)會(huì)導(dǎo)致技能加載失敗或模型無(wú)法正確調(diào)用。一個(gè)可復(fù)制的最小 manifest{ name: my-custom-skill, version: 1.0.0, description: 讀取指定 CSV 文件并統(tǒng)計(jì)行數(shù)返回摘要, entry: index.js, parameters: { type: object, properties: { filePath: { type: string, description: CSV 文件的相對(duì)路徑 } }, required: [filePath] } }parameters用的是 JSON Schema 風(fēng)格模型會(huì)根據(jù)這里的描述決定傳什么參數(shù)。描述寫(xiě)得越清楚模型調(diào)用越準(zhǔn)。比如你把filePath描述成“CSV 文件的相對(duì)路徑”模型就不會(huì)傳一個(gè)不存在的絕對(duì)路徑進(jìn)來(lái)。3.3 技能入口代碼index.js導(dǎo)出一個(gè)對(duì)象核心是run方法// skills/my-custom-skill/index.js const fs require(fs); const path require(path); module.exports { name: my-custom-skill, description: 讀取 CSV 并統(tǒng)計(jì)行數(shù), version: 1.0.0, async run({ args }) { const filePath args.filePath; const abs path.resolve(process.cwd(), filePath); if (!fs.existsSync(abs)) { return 文件不存在${filePath}; } const content fs.readFileSync(abs, utf-8); const lines content.split(\n).filter(Boolean); return 文件 ${filePath} 共 ${lines.length} 行含表頭。; } };如果技能內(nèi)部需要調(diào)用模型比如做內(nèi)容總結(jié)就在run里用環(huán)境變量里的 Key 發(fā)起請(qǐng)求async run({ args }) { const resp await fetch(${process.env.TAOTOKEN_BASE_URL}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${process.env.TAOTOKEN_API_KEY} }, body: JSON.stringify({ model: 你的模型ID, messages: [{ role: user, content: 總結(jié)以下內(nèi)容${args.text} }] }) }); const data await resp.json(); return data.choices[0].message.content; }注意這里 Base URL 和 Key 都從環(huán)境變量讀跟第二節(jié)配的完全一致。這樣無(wú)論你有多少個(gè) Skill模型通道只有一份配置。3.4 本地調(diào)試寫(xiě)完放進(jìn)skills/后重啟 OpenClaw 觸發(fā)掃描。然后直接在對(duì)話里觸發(fā)調(diào)用 my-custom-skill讀取 data/user.csv如果模型正確識(shí)別并執(zhí)行你會(huì)看到返回的行數(shù)統(tǒng)計(jì)。如果沒(méi)反應(yīng)先看日志目錄logs/OpenClaw 會(huì)把加載錯(cuò)誤和調(diào)用錯(cuò)誤分開(kāi)記錄定位起來(lái)比盲猜快得多。4. 驗(yàn)證請(qǐng)求一次真實(shí)觸發(fā)確認(rèn) Skill 被正確加載與執(zhí)行配置寫(xiě)完不驗(yàn)證等于沒(méi)寫(xiě)。這一節(jié)用一次完整觸發(fā)把“加載—識(shí)別—執(zhí)行—返回”四個(gè)環(huán)節(jié)都走一遍并給出成功結(jié)果的判斷標(biāo)準(zhǔn)。先確認(rèn)技能已被掃描到。重啟 OpenClaw 后在對(duì)話里問(wèn)一句現(xiàn)在有哪些可用的技能正常情況下模型會(huì)列出已安裝技能包括你剛寫(xiě)的my-custom-skill。如果列表里沒(méi)有它說(shuō)明掃描沒(méi)通過(guò)直接跳到第五節(jié)排障。接著做真實(shí)觸發(fā)。準(zhǔn)備一個(gè)測(cè)試文件mkdir -p data printf name,age\nAlice,30\nBob,25\n data/user.csv然后在對(duì)話里輸入調(diào)用 my-custom-skill讀取 data/user.csv預(yù)期返回文件 data/user.csv 共 3 行含表頭??吹竭@個(gè)結(jié)果說(shuō)明四件事都對(duì)了manifest 被正確解析、模型識(shí)別到了技能、參數(shù)傳遞正確、run方法執(zhí)行成功。如果返回的是“文件不存在”檢查你運(yùn)行 OpenClaw 的工作目錄是不是項(xiàng)目根目錄因?yàn)榇a里用的是process.cwd()。再驗(yàn)證一個(gè)帶模型調(diào)用的技能。假設(shè)你寫(xiě)了一個(gè)總結(jié)技能觸發(fā)調(diào)用 summarize-skill把 data/user.csv 的內(nèi)容總結(jié)成一句話如果返回了模型生成的摘要說(shuō)明 TaoToken 通道也通了。這一步同時(shí)驗(yàn)證了 Skill 機(jī)制和模型通道是最有價(jià)值的端到端測(cè)試。提示驗(yàn)證階段建議把日志級(jí)別調(diào)成 debug這樣能看到模型決定調(diào)用哪個(gè)技能的中間過(guò)程。很多“技能不生效”其實(shí)是模型沒(méi)選中它而不是技能本身有問(wèn)題。成功結(jié)果的判斷標(biāo)準(zhǔn)可以記一下技能列表里能看到它、觸發(fā)后返回符合預(yù)期的內(nèi)容、日志里沒(méi)有加載錯(cuò)誤。三條都滿足才算真正跑通。只滿足第一條說(shuō)明只是被掃描到但調(diào)用失敗只滿足后兩條但列表里沒(méi)有可能是緩存問(wèn)題重啟即可。5. 本篇常見(jiàn)錯(cuò)排查401、local proxy failed、reading choices、OAuth排障這部分按真實(shí)報(bào)錯(cuò)來(lái)每個(gè)都給出原因和修法。這些是我在配 Skill TaoToken 通道時(shí)實(shí)際遇到過(guò)的按出現(xiàn)頻率排序。401 Unauthorized。最常見(jiàn)幾乎都是 Key 的問(wèn)題。三種可能環(huán)境變量沒(méi)生效、Key 復(fù)制時(shí)帶了空格、Key 被撤銷(xiāo)。先驗(yàn)證echo $TAOTOKEN_API_KEY如果輸出為空說(shuō)明變量沒(méi)加載重開(kāi)終端或 source 配置。如果輸出正常但請(qǐng)求仍 401檢查代碼里是不是把Bearer拼錯(cuò)了或者 Base URL 寫(xiě)成了帶路徑的地址。正確組合是 Base URL 為https://taotoken.net/api請(qǐng)求路徑為/v1/chat/completionsHeader 為Authorization: Bearer sk-xxx。三件套Base URL Key Model ID缺一不可Model ID 寫(xiě)錯(cuò)有時(shí)也會(huì)返回鑒權(quán)類(lèi)錯(cuò)誤別只盯著 Key。local proxy failed。這個(gè)報(bào)錯(cuò)通常出現(xiàn)在 OpenClaw 嘗試通過(guò)本地代理轉(zhuǎn)發(fā)請(qǐng)求時(shí)。原因一般是代理配置殘留或者環(huán)境變量里設(shè)置了HTTP_PROXY/HTTPS_PROXY指向一個(gè)已經(jīng)失效的地址。檢查env | grep -i proxy如果有輸出且地址不可用清掉這些變量再試。OpenClaw 直連 TaoToken 通道即可不需要額外代理層。reading choices。典型報(bào)錯(cuò)是Cannot read properties of undefined (reading choices)。這說(shuō)明請(qǐng)求返回的結(jié)構(gòu)里沒(méi)有choices字段代碼卻直接取了data.choices[0]。原因通常是請(qǐng)求根本沒(méi)成功返回的是錯(cuò)誤對(duì)象或者返回體不是預(yù)期的 JSON 結(jié)構(gòu)。修法是先打印完整響應(yīng)再取字段const data await resp.json(); if (!data.choices) { return 模型返回異常${JSON.stringify(data)}; } return data.choices[0].message.content;這樣報(bào)錯(cuò)信息會(huì)直接告訴你服務(wù)端返回了什么比盲猜快得多。OAuth 相關(guān)報(bào)錯(cuò)。如果你在 OpenClaw 里配了需要 OAuth 的模型通道又同時(shí)用 Key 方式接 TaoToken可能會(huì)沖突。表現(xiàn)是提示 token 過(guò)期或授權(quán)失敗。處理方式是明確區(qū)分Skill 內(nèi)部調(diào)用統(tǒng)一走 Key 方式不要混用 OAuth 流程。檢查配置文件里是否有殘留的 OAuth 字段清掉后重啟。技能加載了但模型不調(diào)用。這不是報(bào)錯(cuò)但很常見(jiàn)。原因是 manifest 里的description寫(xiě)得太模糊模型判斷不出什么時(shí)候該用它。把描述改具體比如把“處理文件”改成“讀取指定 CSV 文件并統(tǒng)計(jì)行數(shù)”命中率會(huì)明顯提升。CC Switch / Cline MCP / Codex auth.json 場(chǎng)景。如果你在 OpenClaw 之外還用這些工具配置邏輯是一樣的三件套Base URL、Key、Model ID。以 Codex 的auth.json為例確保里面的 base URL 指向https://taotoken.net/apiKey 與環(huán)境變量一致Model ID 填你實(shí)際要用的模型。三處不一致是這類(lèi)工具報(bào)錯(cuò)的頭號(hào)原因。排障時(shí)記住一個(gè)原則先確認(rèn)通道通不通用模型對(duì)話頁(yè)面測(cè)再確認(rèn)技能加載沒(méi)加載看技能列表最后確認(rèn)模型選沒(méi)選中技能看 debug 日志。按這個(gè)順序90% 的問(wèn)題能快速定位。6. 把 Skill 用起來(lái)從單點(diǎn)能力到可持續(xù)擴(kuò)展的工作流走到這里你已經(jīng)能裝技能、寫(xiě)技能、驗(yàn)證技能、排錯(cuò)了。最后聊點(diǎn)實(shí)際用法幫你把這套機(jī)制變成日常能依賴的東西。第一從“高頻重復(fù)動(dòng)作”入手寫(xiě)第一個(gè)自定義 Skill。別一上來(lái)就搞復(fù)雜系統(tǒng)先挑一個(gè)你每天都要做、步驟固定的小事比如“把某個(gè)目錄下的日志按日期歸檔”“把固定格式的表格轉(zhuǎn)成 JSON”。這類(lèi)邏輯確定、不需要模型判斷的寫(xiě)成 Skill 最穩(wěn)也最容易驗(yàn)證成功。跑通一個(gè)你對(duì)整套機(jī)制的手感就建立了。第二涉及模型判斷的 Skill把 prompt 寫(xiě)進(jìn)技能內(nèi)部而不是讓用戶每次輸入。比如一個(gè)“智能分類(lèi)”Skill分類(lèi)規(guī)則和輸出格式應(yīng)該固化在代碼里用戶只需要傳待分類(lèi)的內(nèi)容。這樣觸發(fā)時(shí)更穩(wěn)定也避免每次都要重復(fù)描述需求。第三統(tǒng)一模型通道的價(jià)值會(huì)隨著 Skill 數(shù)量增加而放大。你寫(xiě)的 Skill 越多越不想在每個(gè)里面重復(fù)配 Key。用 TaoToken 一個(gè) Key 覆蓋對(duì)話和編碼類(lèi)模型新增 Skill 時(shí)只引用環(huán)境變量維護(hù)成本幾乎為零。需要長(zhǎng)期跑編碼類(lèi)或 Agent 類(lèi)任務(wù)的話可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 按用量規(guī)劃比零散調(diào)用更可控。第四給技能寫(xiě) README。不是為了別人是為了三個(gè)月后的你自己。寫(xiě)清楚這個(gè)技能干什么、參數(shù)怎么傳、依賴什么環(huán)境變量、失敗時(shí)看哪里。技能多了之后這份文檔就是你的索引。第五調(diào)試期善用日志。OpenClaw 的logs/目錄把加載錯(cuò)誤和運(yùn)行錯(cuò)誤分開(kāi)記錄遇到問(wèn)題先看日志再改代碼比反復(fù)重啟試錯(cuò)高效得多。我踩過(guò)的坑里有一半是沒(méi)看日志直接猜結(jié)果繞了遠(yuǎn)路。如果你還沒(méi)拿到 Key先去控制臺(tái)建一個(gè)https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入細(xì)節(jié)和字段說(shuō)明看文檔https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先感受模型通道是否順暢直接去模型對(duì)話頁(yè)面發(fā)一條消息https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。Claude Code 相關(guān)的接入配置可以參考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite 。技能擴(kuò)展這件事真正的門(mén)檻不在寫(xiě)代碼而在“想清楚要自動(dòng)化什么”。想清楚了剩下的就是照這篇的目錄結(jié)構(gòu)、manifest 和驗(yàn)證步驟走一遍。跑通第一個(gè)后面就是復(fù)制和迭代。