openclaw/skills: All versions of all skills that are on clawhub.com archived
使用一下配置部署后,可以对话,可以执行docker内的命令。
yml:
claves-openclaw:
container_name: claves-openclaw
hostname: claves-openclaw
image: ghcr.io/openclaw/openclaw:2026.3.1
restart: always
#privileged: true
user: root
extra_hosts:
- "api.chat.claves.com.cn:192.168.1.1"
init: true
environment:
HTTP_PROXY: http://192.168.1.3:1080
HTTPS_PROXY: http://192.168.1.3:1080
#HOME: /home/node
#OPENCLAW_GATEWAY_MODE: local #决定设备如何处理网络流量的核心配置项。
#OPENCLAW_GATEWAY_BIND: "lan"
#OPENCLAW_GATEWAY_PORT: 18789
volumes:
- ./volumes/claves-openclaw/openclaw-data:/root/.openclaw:rw
command:
- node
- dist/index.js
- gateway
- --bind
- lan
- --port
- "18789"
- --allow-unconfigured
ports:
- "18789:18789"
- "18790:18790"
deploy:
resources:
limits:
memory: 4096M
networks:
extnetwork:
ipv4_address: 172.20.0.239
openclaw.json
{
"meta": {
"lastTouchedVersion": "2026.3.1-beta.1",
"lastTouchedAt": "2026-03-05T02:19:39.329Z"
},
"models": {
"mode": "merge",
"providers": {
"blink-local-model": {
"baseUrl": "http://api.chat.cn/v1",
"apiKey": "sk-xxxxxxxxxxxxx",
"api": "openai-completions",
"models": [
{
"id": "gpt-4o",
"name": "gpt-4o",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 128000,
"maxTokens": 10960
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "blink-local-model/gpt-4o"
},
"models": {
"blink-local-model/gpt-4o": {}
},
"workspace": "/root/.openclaw/workspace",
"compaction": {
"mode": "safeguard"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
},
"sandbox":{
"mode":"off"
}
}
},
"commands": {
"native": "auto",
"nativeSkills": "auto",
"restart": true,
"ownerDisplay": "raw"
},
"gateway": {
"port": 18789,
"mode": "local",
"bind": "lan",
"controlUi": {
"enabled": true,
"dangerouslyAllowHostHeaderOriginFallback": true,
"allowInsecureAuth": true,
"dangerouslyDisableDeviceAuth": true
},
"auth": {
"mode": "token",
"token": "xxxxxxxxxxxxxxxxxxxx"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"entries": {},
"installs": {},
"load": {
"paths": []
}
},
"tools":{
"exec":{
"host":"gateway",
"security":"full"
},
"elevated":{
"enabled":true
}
}
}
Clawhub使用
安装
# 安装 npm -g install clawhub # 登录,token从clawhub官网登录个人账号后获取 clawhub login --token clh_Wn77MF7eWjdtcxxxxxxxxxxxxxxxxxxx #安装插件 clawhub install tavily-search
常见问题
完全理解你的疑问,我们把 OpenClaw 的 Tool / Skill / Python 执行能力 理清楚——很多人第一眼看到 Skill 能写 Python,就以为可以完全替代 Tool,其实并不是完全一样。
一、Tool 与 Skill 的本质区别
| 特性 | Tool | Skill |
|---|---|---|
| 抽象级别 | 底层能力 | 任务能力(可组合多个 Tool) |
| 本质 | 封装 API / 函数 | 调度逻辑 + 可调用 Tool 或 Python |
| 调用方式 | Skill 调用 | Agent 调用 Skill |
| 可扩展性 | 单一功能 | 可组合多个 Tool + 逻辑 |
| 目标 | 提供可复用能力 | 完成用户目标任务 |
一句话总结:Tool 是“原子操作”,Skill 是“使用这些原子操作完成任务的能力”。
二、Skill 中可以直接写 Python,但有局限
在 OpenClaw 的 Skill 里确实可以写 Python:
def run(query):
return f"你搜索的关键词是: {query}"
但是:
- Python 运行环境有限制
- Skill 执行 Python 主要用于处理数据、格式化、简单逻辑。
- 如果 Skill 直接去抓网页、调用外部 API,你需要保证网络权限和依赖环境(requests、bs4 等)可用。
- 可复用性和权限控制弱
- Tool 可以单独注册、被多个 Skill 复用。
- Skill 写死 Python 逻辑时,只能在这个 Skill 里使用,扩展性差。
- 多步任务管理不如 Tool + Skill
- 如果一个 Skill 只用 Python 实现抓取 + 解析 + 摘要,Agent 调用时没有“可拆解的工具”,难以监控、调试和授权。
三、能否只用一个“百度搜索 Skill”?
✅ 可以,但条件:
- Skill 内直接写 Python 做抓取、解析和摘要;
- 只在单用户 / 内部实验场景,不考虑安全、扩展、权限;
- 不打算再复用“百度搜索能力”给其他 Skill 或 Agent。
缺点:
- 扩展困难(以后要换搜索源、加入缓存、摘要功能都要改 Skill)
- Agent 对工具选择没有透明度
- 企业级权限控制、日志、计费统计不好做
四、推荐做法(最佳实践)
- 注册 Tool:封装“百度搜索 HTTP 调用”或“网页抓取函数”
- Python Skill 调用 Tool 可以保持清晰的调用链
- Tool 可以被其他 Skill 重用
- 创建 Skill:组合 Tool + Python 逻辑
- Skill 负责完成“搜索 → 抓取 → 摘要”任务
- 可以给 Agent 调用时提供统一接口
Agent -> Skill: internet_search
-> Tool: baidu_search
-> Tool: webpage_fetch
-> Python: summary_logic
这样:
- Agent 不需要知道抓取和解析细节
- Tool 可以单独替换为 Bing/Google/SearXNG
- Skill 可以增加业务逻辑(过滤、权限、格式化)
五、总结
- Tool = 原子操作(可复用、可授权、可替换)
- Skill = 任务能力(组合多个 Tool + Python 逻辑)
- Python Skill 可以直接实现百度搜索,但最好只做逻辑处理
- 企业 / 复杂场景推荐:Tool + Skill 分层
如果你愿意,我可以帮你写一个 生产级的“百度搜索 Skill”模板:
- 用 Python Skill 调用 注册的百度搜索 Tool
- 自动抓取网页并摘要
- 返回结构化结果给 Agent
- 可扩展到多搜索源
在 OpenClaw 的设计里,Tool 和 Skill 是两个不同层级的概念,类似 函数 vs 功能模块。理解这个结构很关键,否则在做 Agent 体系时会混乱。
我从架构层解释它们的 区别、关系,以及是否可以只做一个百度搜索 skill。
一、Tool 与 Skill 的本质区别
| 层级 | Tool | Skill |
|---|---|---|
| 抽象级别 | 底层能力 | 能力组合 / 任务能力 |
| 类比 | API / 函数 | 微服务 / 业务模块 |
| 功能 | 执行一个操作 | 完成一个任务 |
| 是否直接被 LLM 调用 | 通常 由 Skill 调用 | Agent 调用 Skill |
| 典型数量 | 很多 | 比较少 |
Tool 示例
{
"name": "baidu_search",
"type": "http"
}
作用:
执行百度搜索
Skill 示例
{
"name": "internet_search",
"tools": [
"baidu_search",
"webpage_fetch",
"content_extract"
]
}
作用:
1 搜索
2 打开网页
3 提取内容
4 返回摘要
二、Agent → Skill → Tool 调用链
OpenClaw 的执行链:
User
↓
Agent
↓
Skill
↓
Tool
↓
External API
例子:
用户:DeepSeek 最近有什么新闻
Agent
↓
Skill: internet_search
↓
Tool: baidu_search
↓
百度
三、为什么要有 Skill 层(关键设计)
如果 Agent 直接调用 Tool 会出现几个问题:
1 Agent 不知道如何组合工具
例如搜索信息需要:
search
fetch webpage
extract content
summarize
如果没有 Skill:
Agent 必须自己规划全部步骤。
稳定性很差。
2 Prompt 复杂度爆炸
如果有 50 个 tool:
baidu_search
bing_search
google_search
fetch_page
pdf_parse
db_query
erp_create_order
LLM 很难选。
3 权限控制
Skill 可以作为 权限边界:
skill: internet_search
skill: erp_operation
skill: database_query
不同用户可以启用不同 skill。
四、能不能只做一个百度搜索 Skill?
可以。
如果你只想简单搜索,可以这样:
Tool
{
"tools": {
"baidu_search": {
"type": "http",
"url": "http://localhost:8090/search"
}
}
}
Skill
{
"name": "baidu_search_skill",
"tools": [
"baidu_search"
]
}
结构:
Agent
↓
baidu_search_skill
↓
baidu_search tool
完全可以运行。
五、更合理的搜索 Skill(推荐)
真实 AI 搜索通常需要 3 个 tool:
search
fetch
summarize
架构:
Skill: internet_search
│
├── tool: baidu_search
├── tool: webpage_fetch
└── tool: content_extract
效果:
1 搜索结果
2 打开网页
3 提取正文
4 LLM总结
这就是 Perplexity / Cursor 的搜索模式。
六、很多人误解的一点
在 OpenClaw 里:
Skill ≠ Tool
很多人会写:
skill: baidu_search
其实只是:
tool: baidu_search
LLM会直接调用。
可以,但:
- 不利于扩展
- Agent 不好管理
七、企业系统的推荐结构
如果你在做 ERP + LLM Agent(你之前提过),建议:
OpenClaw
│
├── skill: internet_search
│ ├── baidu_search
│ └── page_fetch
│
├── skill: knowledge_search
│ └── vector_db_query
│
└── skill: erp_operation
├── create_order
├── query_inventory
└── create_purchase
好处:
- 技能模块清晰
- Agent规划更稳定
- 权限可控
八、一句话总结
Tool
单个能力(函数)
Skill
多个 Tool 组合形成的任务能力
调用关系:
Agent → Skill → Tool
在 OpenClaw 里,自定义 Tool 本质上是一个 Agent 可调用的接口封装。OpenClaw 官方设计上是尽量灵活,支持多种协议,但有一些实际限制。下面我帮你梳理清楚。
一、OpenClaw 自定义 Tool 支持的协议
| 协议类型 | 使用方式 | 备注 |
|---|---|---|
| HTTP / HTTPS | 最常用,通过 type: http 注册 Tool | 支持 GET / POST / PUT / DELETE 等方法,可绑定 query/body 参数,可直接返回 JSON 或文本 |
| WebSocket / SSE | 通过 type: websocket 注册 | 支持流式数据,Agent 可以接收实时结果;SSE 常用于 LLM 流式返回场景 |
| Local Python / Script | type: python 或在 Skill 内调用 Python 函数 | 可以直接执行 Python 代码,调用本地库,支持文件操作、抓取、解析等;适合内部逻辑或快速实验 |
| gRPC / HTTP2 | 通过 HTTP/gRPC 网关或自定义适配器 | OpenClaw 不直接支持 gRPC,需要在中间写一个 HTTP 包装层,Tool 实际上还是 HTTP 调用 |
| 数据库 / Vector DB | 通过 Python Tool 或 HTTP API | 比如 MySQL / Postgres / ClickHouse / Milvus / Pinecone;Tool 封装查询和结果返回接口 |
| 消息队列 / Kafka / RabbitMQ | 通过 Python 或 HTTP 封装 | Tool 可以发送/接收消息,实现异步任务,但 Agent 调用是同步封装 |
二、Tool 类型示例
1️⃣ HTTP Tool
{
"name": "baidu_search",
"type": "http",
"method": "GET",
"url": "http://localhost:8090/baidu_search",
"query": {
"q": "{{query}}"
}
}
支持 GET / POST / PUT / DELETE,返回 JSON 或文本
2️⃣ Python Tool
{
"name": "calculate",
"type": "python",
"description": "Simple calculation tool",
"code": "def run(a, b): return a + b"
}
可以访问本地库,也可以调用 requests 做 HTTP 请求。
3️⃣ WebSocket Tool(流式)
{
"name": "chat_stream",
"type": "websocket",
"url": "ws://localhost:9000/stream"
}
适合 LLM 流式对话或长任务反馈
三、注意事项
- 安全性
- Python / Local Tool 可以访问系统文件、网络,生产环境要控制权限
- HTTP Tool 可以绑定外部 API Key,避免泄露
- 返回格式
- OpenClaw 推荐 JSON 格式返回
- Python Tool 返回 dict / list / str 都可,但最终 Agent 会序列化为 JSON
- 组合能力
- Tool 单一功能,Skill 可以组合多个 Tool
- 例如:搜索 Tool + 摘要 Tool + 爬网页 Tool → Skill: internet_search
四、总结
✅ OpenClaw 自定义 Tool 支持:
- HTTP/HTTPS(GET/POST/PUT/DELETE)
- WebSocket / SSE(流式)
- Local Python 函数 / 脚本
- 间接支持 gRPC / HTTP2(通过适配层)
- 数据库访问(MySQL/Postgres/ClickHouse/Vector DB)
- 消息队列(Kafka / RabbitMQ)
本质上 只要你能包装成 HTTP / Python / WebSocket 接口,OpenClaw 就能当 Tool 调用。
完全可以,而且这是 OpenClaw Python Tool 的常用做法。核心逻辑是:Python Tool 本质上就是 在 OpenClaw 的 Python 执行环境里运行一段代码,这段代码可以直接导入和调用本地 Python 文件(模块)里的函数。
我帮你整理清楚规则和示例:
一、支持本地 Python 文件的方式
1️⃣ 直接在 code 字段写 Python 逻辑
{
"name": "hello_tool",
"type": "python",
"code": "def run(name):\n return f'Hello {name}!'"
}
- 简单函数适合短逻辑
- 不能直接管理大型项目,模块化能力差
2️⃣ 调用本地 Python 文件(推荐)
假设你有一个文件结构:
/opt/openclaw-tools/
├── mytool.py
└── utils.py
mytool.py 内容:
# mytool.py
from utils import helper
def run(query):
return f"Processed: {helper(query)}"
utils.py 内容:
# utils.py
def helper(text):
return text.upper()
在 OpenClaw Tool 配置里写:
{
"name": "my_local_tool",
"type": "python",
"file": "/opt/openclaw-tools/mytool.py"
}
这里的
file字段指向本地 Python 文件路径,OpenClaw 会在执行 Tool 时导入这个文件并调用run()函数。
3️⃣ 注意事项
- 文件路径
- Docker 部署时要注意 volume 映射,例如:
-v ~/openclaw-tools:/opt/openclaw-tools保证容器内路径/opt/openclaw-tools可访问
- Docker 部署时要注意 volume 映射,例如:
- 依赖库
- Python Tool 会在 OpenClaw 的 Python 环境里运行
- 如果本地 Python 文件依赖第三方库,必须先安装:
pip install requests beautifulsoup4
- 函数规范
- OpenClaw 默认调用 Python 文件里的
run()函数 - 参数可以是任意 JSON 可序列化对象
- 返回值应为 JSON 可序列化类型(dict / list / str / int / float)
- OpenClaw 默认调用 Python 文件里的
- 安全性
- Python Tool 可以执行任意代码
- 生产环境要限制路径和权限,避免写入敏感系统文件
4️⃣ Docker 中的示例
docker run -d \
--name openclaw \
-v ~/openclaw-tools:/opt/openclaw-tools \
-e TZ=Asia/Shanghai \
alpine/openclaw:main
然后 Tool 配置:
{
"name": "my_local_tool",
"type": "python",
"file": "/opt/openclaw-tools/mytool.py"
}
5️⃣ 调用示例
Agent 调用:
Agent -> Tool: my_local_tool
Input: {"query": "hello world"}
Output: {"result": "Processed: HELLO WORLD"}
✅ 结论:
- Python Tool 完全支持本地 Python 文件
- 文件路径通过
file指定,必须保证 OpenClaw 可访问 - Tool 调用约定:文件里必须有
run()函数 - 支持导入本地模块 / 包,实现复杂逻辑和企业级功能
如果你需要,我可以帮你写一个 完整模板,实现:
- 一个 Python Tool
- 可调用本地模块
- 支持百度搜索 + 网页抓取 + 摘要
- 可直接在 Docker OpenClaw 中运行