1. 从“养龙虾”到卖铲子:OpenClaw 个人开发者的变现困局
OpenClaw 是近期在个人开发者圈子里热度很高的一类 AI 自动化工具框架,它能通过 Skills(技能脚本)把大模型的 Prompt 能力封装成可复用的命令,让用户用一句指令完成内容生成、数据整理、批量处理等任务。适合谁?适合手里有一两个跑得通的 Prompt 流程、想把它变成对外服务而不是自己闷头玩的开发者。但现实是,绝大多数人卡在同一个地方:本地跑通了,别人用不了;想对外提供能力,又不知道怎么封装、怎么部署、怎么让别人稳定调用。
我见过太多“养龙虾”式的玩法——在自己电脑上装一堆依赖,写几个脚本,生成几篇文案,然后就没有然后了。问题不在于技术不行,而在于没有把零散能力变成可交付的服务。你本地跑得再顺,别人复制你的流程时遇到 Python 版本不对、依赖冲突、路径写死、API Key 硬编码,第一步就劝退了。这就是“河边观望者”的由来:不是不想用,是门槛太高。
真正的变现路径,是把你的 Skills 用 Docker 封装成一个标准化的 API 服务,别人不需要懂你的环境,只需要一个 Base URL、一个 Key、一个 Model ID 就能调用。你从“下河挖金的人”变成“递铲子的人”。这篇文章就交付这条链路:Docker Compose 配置、Skills 目录结构、调用示例,以及一次端到端验证。全程可复制,不玩虚的。
核心检索词先明确:OpenClaw 的 Skills 封装与 API 对外服务,是个人开发者把 Prompt 能力产品化的最短路径。你不需要成为 OpenClaw 最顶尖的高手,只需要比观望者多走一步——把本地脚本变成别人能调用的接口。
2. TaoToken 前置:给 OpenClaw 一个稳定的模型出口
OpenClaw 本身是框架,Skills 是逻辑,但真正干活的是背后的大模型。你在本地调试时可能用某个直连方式,但一旦要对外提供服务,模型调用的稳定性、Key 的管理、不同模型之间的切换就成了必须解决的问题。我试过把 Key 写死在代码里,结果换模型要改代码、重启服务,非常麻烦。后来改成统一走 TaoToken 的 API 出口,Base URL 固定,Key 集中管理,Model ID 按需切换,Skills 代码里只认环境变量,干净很多。
TaoToken 在这里的角色是模型能力的统一接入层。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。你需要在控制台创建一个 API Key,然后把它写进 Docker 的环境变量里,而不是硬编码在 Skills 脚本中。这一步是后面所有配置的前提。
具体操作:打开 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,登录后创建一个新的 Key,复制保存。这个 Key 就是你 OpenClaw 服务调用模型的凭证。注意,Key 只显示一次,丢了就重新建。创建完成后,你还需要确认要用的 Model ID,比如你打算用哪个模型来驱动 Skills,这个 ID 在模型列表里能查到。如果你不确定选哪个,可以先到模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 试一下不同模型的效果,再决定生产环境用哪个。
为什么强调这一步?因为 OpenClaw 的 Skills 本质上是 Prompt 模板加执行逻辑,模型输出质量直接决定你的服务能不能卖出去。你对外提供的 API,别人调一次拿到的是垃圾还是可用结果,全看模型和 Prompt 的配合。TaoToken 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有 Base URL 的完整写法和鉴权方式,建议配置前先过一遍。
这里要提醒一个常见误区:不要把 TaoToken 当成“中转”来理解,它是一个标准的 API 接入层,你按文档配置 Base URL 和 Key 即可。所有配置都走环境变量,Docker Compose 里通过 env_file 注入,这样你的 Skills 代码可以开源、可以分享,Key 不会泄露。
3. 可复制配置:Docker Compose + Skills 目录结构
这一节是全文的核心,直接给你能跑的配置。先看目录结构,这是你对外服务的“产品形态”。一个清晰的 Skills 目录本身就是价值,别人拿到你的资源包,看到结构就知道怎么用。
openclaw-service/ ├── docker-compose.yml ├── .env ├── skills/ │ ├── xhs_copywriter/ │ │ ├── skill.yaml │ │ ├── prompt.md │ │ └── handler.py │ ├── meeting_summary/ │ │ ├── skill.yaml │ │ ├── prompt.md │ │ └── handler.py │ └── code_fixer/ │ ├── skill.yaml │ ├── prompt.md │ └── handler.py ├── app/ │ ├── main.py │ ├── router.py │ └── model_client.py └── requirements.txt每个 skill 目录下三个文件:skill.yaml定义技能元信息,prompt.md放 Prompt 模板,handler.py写执行逻辑。这样拆分的好处是,改 Prompt 不用动代码,加新技能不用改主程序。
docker-compose.yml配置如下:
version: "3.9" services: openclaw-api: build: . container_name: openclaw-api ports: - "8000:8000" env_file: - .env volumes: - ./skills:/app/skills restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3.env文件内容:
TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=sk-你的Key DEFAULT_MODEL_ID=你的ModelID注意,TAOTOKEN_BASE_URL写https://taotoken.net/api,不要加多余路径。DEFAULT_MODEL_ID填你在模型列表里选定的那个。这两个值通过env_file注入容器,model_client.py里用os.getenv读取。
model_client.py的核心逻辑:
import os from openai import OpenAI client = OpenAI( base_url=os.getenv("TAOTOKEN_BASE_URL"), api_key=os.getenv("TAOTOKEN_API_KEY"), ) def call_model(prompt: str, model_id: str = None) -> str: model = model_id or os.getenv("DEFAULT_MODEL_ID") resp = client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], temperature=0.7, ) return resp.choices[0].message.contentskill.yaml示例:
name: xhs_copywriter description: 小红书爆款文案生成 model: ${DEFAULT_MODEL_ID} prompt_file: prompt.md timeout: 60handler.py负责读取 prompt 模板、拼接用户输入、调用call_model、返回结果。这样一套下来,你的 Skills 就是可插拔的,加一个新技能只需要新建一个目录。
requirements.txt:
fastapi==0.115.0 uvicorn==0.30.6 openai==1.51.0 pyyaml==6.0.2构建命令:docker compose up -d --build。启动后服务监听 8000 端口,/health返回 200 即正常。
4. 验证请求:一次端到端调用跑通
配置写完了,必须验证。打开终端,先确认容器状态:
docker compose ps看到openclaw-api状态是Up且健康检查通过,继续。然后发一个实际请求:
curl -X POST http://localhost:8000/skill/xhs_copywriter \ -H "Content-Type: application/json" \ -d '{"input": "产品:便携榨汁杯,卖点:无线充电、一键清洗、300ml容量"}'预期返回结构:
{ "skill": "xhs_copywriter", "result": "标题1:谁懂啊!这个无线充电榨汁杯让我戒掉了奶茶店...", "model": "你的ModelID", "elapsed_ms": 2340 }如果返回了result字段且有内容,说明从 Docker 到 Skills 到 TaoToken 模型调用的整条链路通了。这一步跑通,你就可以把这个 API 地址给到别人,别人用同样的 curl 就能调用你的能力。
再验证一个技能,确认多技能路由正常:
curl -X POST http://localhost:8000/skill/meeting_summary \ -H "Content-Type: application/json" \ -d '{"input": "今天讨论了三个议题:预算、排期、人员分工..."}'两个技能都返回正常结果,说明你的 OpenClaw 服务已经具备对外提供能力的基础。接下来你可以把这个服务部署到有公网 IP 的机器上,或者用内网穿透工具暴露出去(注意合规),别人就能远程调用。
这里的关键成功标志是:elapsed_ms有值且result非空。如果result为空,先检查 Prompt 模板是否拼接正确;如果elapsed_ms异常大,检查模型 ID 是否有效。
5. 本篇常见错排查:401、local proxy failed、reading choices
配置过程中最容易遇到的几个报错,我逐个拆解。
401 Unauthorized。这个最常见,原因是 Key 没传对。检查.env文件里TAOTOKEN_API_KEY是否完整,有没有多余空格。Docker 容器里用docker compose exec openclaw-api env | grep TAOTOKEN确认环境变量注入成功。如果 Key 是对的还报 401,检查base_url是否写成了https://taotoken.net/api,不要写成https://taotoken.net/api/v1或其他路径。接入文档里有标准写法,对照一下。
local proxy failed / connection refused。这个报错通常出现在容器内访问外部 API 时。原因是容器网络配置问题,或者你本地有代理设置干扰。检查docker-compose.yml里有没有多余的network_mode或extra_hosts。如果宿主机有代理,容器内不一定继承,需要在.env里显式配置或去掉代理相关变量。另外确认TAOTOKEN_BASE_URL是https而不是http。
reading choices 报错 / choices 字段为空。这个报错说明模型返回结构不符合预期。常见原因有两个:一是 Model ID 写错了,调了一个不存在的模型,返回体里没有choices;二是 Prompt 太长超出模型上下文限制,返回被截断。解决方法是先用模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 单独测试你的 Prompt,确认模型能正常返回,再把同样的 Prompt 放进 Skills 里。如果对话页面正常但 API 报错,检查model_client.py里resp.choices[0]的取值逻辑,加一层判空。
OAuth 相关报错。如果你在配置过程中看到 OAuth 字样,说明你可能在尝试某种需要浏览器授权的接入方式。OpenClaw 的 API 调用走的是 Key 鉴权,不需要 OAuth。检查你的model_client.py是否误用了其他 SDK 的授权流程。标准做法就是OpenAI(base_url=..., api_key=...),没有额外授权步骤。
Docker 构建失败 / 依赖冲突。requirements.txt里版本号要固定,不要用latest。如果构建时 pip 安装慢,可以在 Dockerfile 里换源。构建失败先看日志最后 20 行,通常是某个包版本不兼容,逐个降级测试。
Skills 目录挂载后不生效。检查docker-compose.yml里volumes路径是否正确,宿主机./skills要存在。容器内路径是/app/skills,handler.py里读取路径要用这个。改完 Skills 文件后不需要重建镜像,重启容器即可:docker compose restart openclaw-api。
6. 从本地到对外服务:把能力变成可持续的调用
链路跑通之后,你要考虑的是怎么让它持续产生价值。本地localhost:8000只能自己用,要对外服务需要部署到公网环境。你可以用一台云服务器,把docker-compose.yml和.env传上去,docker compose up -d即可。注意.env不要提交到 Git,用.gitignore排除。
对外服务时,建议加一层简单的鉴权,比如在 FastAPI 里加一个X-API-Key头校验,防止别人白嫖你的模型额度。同时设置调用频率限制,避免单个用户把你的额度跑光。这些逻辑在router.py里加中间件就能实现。
如果你的 Skills 越来越多,可以考虑把每个 Skill 的 Prompt 模板单独版本管理,用户调用时指定版本号。这样你更新 Prompt 不会影响已有用户,新用户可以用最新版。这是把“卖铲子”做成可持续生意的关键——你的产品在迭代,用户在持续付费。
对于长期做编码类 Skills 的开发者,可以关注 Coding Plan 相关的接入方式 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,它针对代码生成场景有专门的配置建议。如果你的 Skills 涉及 Claude Code 类的代码润色和修复,接入文档里有对应的 Base URL 和 Model ID 配置说明,照着填即可。
最后一步验证:把你的公网地址发给一个朋友,让他用 curl 调一次,确认能返回结果。这一步过了,你的 OpenClaw 服务就从“养龙虾”变成了真正的对外能力。剩下的就是不断加 Skills、优化 Prompt、维护服务稳定性。你不需要一次做到完美,先跑通一个技能,再复制第二个、第三个。行动本身比等待完美更重要。