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