title: Agent 技能调用 - 赋予 AI 超能力 tags: [agent, 技能]


Agent 技能调用 - 赋予 AI 超能力

深入解析 OpenCLAW Agent 技能系统,了解如何通过技能扩展 Agent 能力边界,实现强大的自动化能力。

什么是技能(Skill)?

技能是赋予 Agent 各种能力的模块化组件。通过技能,Agent 可以:

  • 读写文件、操作文件夹
  • 控制浏览器、自动化 Web 操作
  • 执行代码、运行程序
  • 调用外部 API
  • 发送消息、邮件
  • 操作数据库
  • 等等...
┌─────────────────────────────────────────────┐
│                 Agent                        │
│  ┌─────────────────────────────────────────┐│
│  │              技能系统                    ││
│  ├─────────┬─────────┬─────────┬───────────┤│
│  │ 文件操作 │ 浏览器  │ 代码执行 │  外部API  ││
│  └─────────┴─────────┴─────────┴───────────┘│
└─────────────────────────────────────────────┘

技能配置基础

启用内置技能

skills:
  # 文件操作技能
  - name: file-operations
    enabled: true
    permissions:
      - read
      - write
      - list

  # 浏览器控制技能
  - name: browser-control
    enabled: true
    permissions:
      - navigate
      - click
      - screenshot

  # 代码执行技能
  - name: code-executor
    enabled: true
    language: python
    timeout: 60

完整技能配置

skills:
  - name: file-operations
    enabled: true

    # 权限设置
    permissions:
      - read
      - write
      - delete
    allowed_paths:
      - ./workspace
      - ./data

    # 高级选项
    max_file_size: 10MB
    allowed_extensions:
      - .txt
      - .md
      - .json
      - .yaml

内置技能详解

1. 文件操作技能

skills:
  - name: file-operations
    enabled: true
    permissions:
      - read      # 读取文件
      - write     # 写入文件
      - list      # 列出目录
      - delete    # 删除文件
      - copy      # 复制文件
      - move      # 移动文件

    allowed_paths:
      - ./workspace
      - /tmp/data

    max_file_size: 50MB

使用示例:

# Agent 可以执行以下操作
# 读取文件
file_content = agent.read_file("./data/config.json")

# 写入文件
agent.write_file("./output/result.md", "# 结果\n\n内容...")

# 列出目录
files = agent.list_directory("./workspace")

# 创建目录
agent.create_directory("./workspace/new_project")

2. 浏览器控制技能

skills:
  - name: browser-control
    enabled: true
    permissions:
      - navigate    # 导航
      - click       # 点击
      - type        # 输入
      - screenshot  # 截图
      - evaluate    # 执行 JS

    timeout: 30
    user_agent: "Mozilla/5.0..."

使用示例:

# 导航到网页
agent.browser.navigate("https://example.com")

# 点击元素
agent.browser.click(".login-button")

# 输入文本
agent.browser.type("#username", "myuser")
agent.browser.type("#password", "mypass", submit=True)

# 截图
agent.browser.screenshot("./screenshots/page.png")

# 提取内容
title = agent.browser.evaluate("document.title")

3. 代码执行技能

skills:
  - name: code-executor
    enabled: true
    language: python
    timeout: 60
    allowed_packages:
      - requests
      - beautifulsoup4
      - pandas
    max_memory: 512MB
    sandbox: true

使用示例:

# 执行 Python 代码
result = agent.execute_code("""
import requests
response = requests.get('https://api.github.com')
print(f'Status: {response.status_code}')
""")

# 执行 JavaScript
js_result = agent.execute_js("""
return document.body.innerText.length;
""")

4. HTTP 请求技能

skills:
  - name: http-request
    enabled: true
    permissions:
      - GET
      - POST
      - PUT
      - DELETE

    allowed_domains:
      - api.example.com
      - *.github.com

    timeout: 30
    headers:
      User-Agent: OpenCLAW/1.0

5. 消息发送技能

skills:
  - name: messaging
    enabled: true
    channels:
      - email
      - slack
      - discord
      - webhook

    # Email 配置
    email:
      smtp_host: smtp.gmail.com
      smtp_port: 587
      from: agent@example.com

    # Slack 配置
    slack:
      webhook_url: ${SLACK_WEBHOOK}

自定义技能开发

创建自定义技能

from openclaw.skills import BaseSkill

class WeatherSkill(BaseSkill):
    """天气预报技能"""

    name = "weather"
    description = "查询指定城市的天气信息"

    # 定义技能可以调用的工具
    tools = ["http_request"]

    async def execute(self, city: str, days: int = 1):
        """获取天气信息"""
        # 调用 HTTP 请求工具
        response = await self.call_tool("http_request", {
            "url": f"https://api.weather.com/v3/weather",
            "params": {
                "city": city,
                "days": days,
                "key": self.config["api_key"]
            }
        })

        return self.format_weather(response)

    def format_weather(self, data):
        """格式化天气信息"""
        return f"""
🌤️ {data['city']} {data['date']}
温度: {data['temp']}°C
天气: {data['condition']}
湿度: {data['humidity']}%
        """

注册自定义技能

skills:
  # 使用自定义技能
  - name: weather
    type: custom
    path: ./skills/weather.py
    config:
      api_key: ${WEATHER_API_KEY}
      default_days: 3

技能配置

# skills/weather.py
from openclaw import Skill

class WeatherSkill(Skill):
    name = "weather"
    description = "查询天气"

    # 配置项
    config_schema = {
        "api_key": {"type": "string", "required": True},
        "default_days": {"type": "int", "default": 1}
    }

    async def execute(self, city: str, days: int = None):
        days = days or self.config["default_days"]
        # 实现逻辑...

技能调用方式

1. Agent 智能调用

配置后,Agent 会根据任务自动判断需要调用的技能:

system_prompt: |
  你是一个助手,可以使用各种技能完成任务。

  可用技能:
  - file-operations: 文件读写
  - browser-control: 浏览器控制
  - code-executor: 代码执行
  - weather: 天气查询

  当需要使用某个技能时,直接调用即可。

用户说"帮我查下北京天气",Agent 会自动调用 weather 技能。

2. 显式调用

# 直接调用技能
result = agent.skills.weather.execute(city="北京")

3. 工具式调用

# 在代码中使用工具
result = agent.call_tool("file_operations", {
    "action": "read",
    "path": "./config.yaml"
})

技能权限管理

权限级别

skills:
  - name: file-operations
    enabled: true

    # 细粒度权限
    permissions:
      # 允许的操作
      allow:
        - read
        - write
        - list

      # 禁止的操作
      deny:
        - delete

      # 路径限制
      path_allow:
        - ./workspace/*
        - ./data/*

      path_deny:
        - ./workspace/secrets/*
        - ./data/private/*

安全沙箱

skills:
  - name: code-executor
    enabled: true
    sandbox:
      enabled: true

      # 资源限制
      max_memory: 512MB
      max_cpu: 50%
      max_execution_time: 60

      # 网络限制
      network:
        enabled: false
        allowed_domains:
          - api.example.com

      # 文件系统限制
      filesystem:
        read_paths:
          - /tmp/sandbox/read
        write_paths:
          - /tmp/sandbox/write

技能组合使用

工作流示例:爬取数据并分析

# 1. 使用浏览器技能爬取网页
html = agent.browser.navigate("https://example.com/products")
content = agent.browser.evaluate("document.body.innerText")

# 2. 使用代码执行技能解析
products = agent.execute_code(f"""
from bs4 import BeautifulSoup
soup = BeautifulSoup({repr(html)}, 'html.parser')
items = [item.text for item in soup.select('.product')]
print(items)
""")

# 3. 使用文件操作保存结果
agent.write_file("./data/products.json", json.dumps(products))

# 4. 发送通知
agent.send_message("slack", f"爬取完成,共 {len(products)} 个产品")

技能链配置

skills:
  # 定义技能链
  chains:
    - name: data-pipeline
      description: 数据采集分析流程
      steps:
        - skill: browser-control
          action: navigate
          args:
            url: "${url}"

        - skill: code-executor
          action: parse
          args:
            format: json

        - skill: file-operations
          action: save
          args:
            path: "./data/output.json"

技能市场

安装社区技能

# 搜索技能
openclaw skill search weather

# 安装技能
openclaw skill install weather

# 列出已安装技能
openclaw skill list

# 更新技能
openclaw skill update weather

# 卸载技能
openclaw skill uninstall weather

常用技能推荐

技能名称 功能 安装命令
weather 天气查询 skill install weather
translate 翻译 skill install translate
image-generation AI 绘图 skill install image-generation
email 邮件发送 skill install email
database 数据库操作 skill install database
scheduler 定时任务 skill install scheduler

技能调试

查看可用技能

# 列出 Agent 的技能
openclaw agent skills my-agent

# 输出示例
# Skills for my-agent:
# - file-operations: enabled (read, write, list)
# - browser-control: enabled (navigate, click, screenshot)
# - code-executor: enabled (python, timeout=60s)
# - weather: enabled

调试技能调用

# 启用技能调试日志
openclaw agent debug my-agent --skills

# 测试技能调用
openclaw agent test-skill my-agent weather --args city=北京

技能调用日志

# 查看技能调用历史
logs = agent.get_skill_logs(
    skill_name="weather",
    limit=10
)

for log in logs:
    print(f"时间: {log.timestamp}")
    print(f"参数: {log.args}")
    print(f"结果: {log.result}")
    print(f"耗时: {log.duration}ms")

最佳实践

1. 最小权限原则

# ❌ 权限过大
skills:
  - name: file-operations
    enabled: true
    permissions: [read, write, delete, execute]
    allowed_paths: [/]

# ✅ 最小权限
skills:
  - name: file-operations
    enabled: true
    permissions: [read, write]
    allowed_paths:
      - ./workspace
      - ./data/output

2. 超时设置

skills:
  - name: browser-control
    timeout: 30

  - name: code-executor
    timeout: 60

  - name: http-request
    timeout: 15

3. 错误处理

class WeatherSkill(BaseSkill):
    async def execute(self, city: str):
        try:
            result = await self.call_tool(...)
            return result
        except TimeoutError:
            return "请求超时,请稍后重试"
        except Exception as e:
            self.logger.error(f"技能执行失败: {e}")
            return f"执行出错: {str(e)}"

小结

本文详细介绍了 OpenCLAW Agent 技能系统:

  1. 技能概念 - 技能是扩展 Agent 能力的模块
  2. 内置技能 - 文件操作、浏览器、代码执行、HTTP、消息
  3. 自定义技能 - 开发自己的技能模块
  4. 权限管理 - 细粒度权限控制和安全沙箱
  5. 技能组合 - 多个技能协同工作
  6. 技能市场 - 安装和使用社区技能
  7. 调试监控 - 查看和管理技能调用

接下来学习定时任务: - 定时任务设置 - 实现自动化运营