# Skills 使用指南

Skills 是 Agent 的领域知识库，存储在 Markdown 文件中。

---

## Skill 分类

| 类型 | 加载位置 | 加载时机 | 文件位置 |
|------|---------|---------|---------|
| **Core Skill** | System Prompt | Agent 启动时自动加载 | `agent/skills/core.md` |
| **内置 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `agent/skills/{name}/` |
| **自定义 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `./skills/{name}.md` |

### Core Skill

核心系统功能，每个 Agent 都需要了解：

- Step 管理（计划、执行、进度）
- 其他系统级功能

**位置**：`agent/skills/core.md`

**加载方式**：
- 框架自动注入到 System Prompt
- `load_skills_from_dir()` 总是自动加载 `agent/skills/` 中的所有 skills（包括 `core.md`）

### 内置 Skill

框架提供的特定领域能力，按需加载：

- browser_use（浏览器自动化）
- 其他领域 skills

**位置**：`agent/skills/{name}/`

**加载方式**：模型调用 `skill` 工具

### 自定义 Skill

项目特定的能力，按需加载：

**位置**：`./skills/{name}.md`

**加载方式**：
1. 通过 `skills_dir` 参数在 Agent 启动时加载到 System Prompt
2. 通过 `skill` 工具运行时按需加载

---

## 普通 Skill 文件格式

```markdown
---
name: browser-use
description: 浏览器自动化工具使用指南
category: web-automation
scope: agent:*
---

## When to use
- 需要访问网页、填写表单
- 需要截图或提取网页内容

## Guidelines
- 先运行 `browser-use state` 查看可点击元素
- 使用元素索引进行交互：`browser-use click 5`
- 每次操作后验证结果
```

**Frontmatter 字段**：
- `name`: Skill 名称（必填）
- `description`: 简短描述（必填）
- `category`: 分类（可选，默认 general）
- `scope`: 作用域（可选，默认 agent:*）

**章节**：
- `## When to use`: 适用场景列表
- `## Guidelines`: 指导原则列表

## 使用方法

### 1. 创建 skills 目录

```bash
mkdir skills
```

### 2. 添加 skill 文件

创建 `skills/browser-use.md` 文件，按照上述格式编写。

### 3. Agent 调用

**方式 1：自动加载到 System Prompt**

```python
from agent import AgentRunner
from agent.llm import create_gemini_llm_call
import os

# 加载自定义 skills 到 System Prompt
runner = AgentRunner(
    llm_call=create_gemini_llm_call(os.getenv("GEMINI_API_KEY")),
    skills_dir="./skills",  # 可选：加载额外的自定义 skills
)

# 结果：
# - agent/skills/core.md 自动加载（总是）
# - agent/skills/ 中的其他 skills 自动加载
# - ./skills/ 中的 skills 也会自动加载
```

**方式 2：运行时动态加载**

```python
from agent import AgentRunner
from agent.llm import create_gemini_llm_call
import os

runner = AgentRunner(
    llm_call=create_gemini_llm_call(os.getenv("GEMINI_API_KEY"))
)

async for item in runner.run(
    task="帮我从网站提取数据",
    model="gemini-2.0-flash-exp"
):
    # Agent 会自动调用 skill 工具加载需要的 skills
    pass
```

**Agent 工作流**：
1. Agent 启动时自动加载 `agent/skills/` 中的所有 skills（包括 `core.md`）
2. 如果提供了 `skills_dir`，也会加载自定义 skills 到 System Prompt
3. Agent 接收任务
4. Agent 可以调用 `list_skills()` 查看可用 skills
5. Agent 可以调用 `skill(skill_name="browser-use")` 动态加载特定 skill
6. Skill 内容注入到对话历史
7. Agent 根据 skill 指导完成任务

### 4. 手动测试

```python
from agent.tools.builtin.skill import list_skills, skill

# 列出所有 skills
result = await list_skills()
print(result.output)

# 加载特定 skill
result = await skill(skill_name="browser-use")
print(result.output)
```

## Skill 加载机制

### 自动加载（Agent 启动时）

```python
# load_skills_from_dir() 自动加载内置 skills
runner = AgentRunner(
    llm_call=my_llm,
    # 不需要指定 skills_dir，内置 skills 会自动加载
)

# 结果：agent/skills/ 中的所有 skills 都会被加载到 System Prompt
```

### 可选加载额外的自定义 Skills

```python
runner = AgentRunner(
    llm_call=my_llm,
    skills_dir="./my-custom-skills",  # 可选：加载额外的自定义 skills
)

# 结果：agent/skills/ + ./my-custom-skills/ 中的所有 skills 都会被加载
```

### 动态加载（运行时）

Agent 可以通过 `skill` 工具运行时动态加载特定的 skill：

```python
# Agent 调用
skill(skill_name="browser-use")

# 搜索路径（优先级）：
# 1. ./skills/browser-use.md         ← 项目自定义
# 2. ./agent/skills/browser-use/     ← 框架内置
```

**实现位置**：
- `agent/skill/skill_loader.py:load_skills_from_dir()` - 自动加载机制
- `agent/tools/builtin/skill.py` - skill 工具（动态加载）

详见 [`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)

## Skill 工具 API

### `skill` 工具

加载指定的 skill 文档。

**参数**：
- `skill_name` (str): Skill 名称，如 "browser-use"

**返回**：Skill 的完整内容（Markdown 格式）

### `list_skills` 工具

列出所有可用的 skills，按 category 分组。

**返回**：Skills 列表，包含名称、ID 和简短描述

**实现位置**：`agent/tools/builtin/skill.py`

## 环境变量

可以设置默认 skills 目录：

```bash
# .env
SKILLS_DIR=./skills
```

## 参考

- 完整文档：[`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)
- 示例：`examples/feature_extract/run.py`
- Skill 文件：`agent/skills/` 目录
- 工具实现：`agent/tools/builtin/skill.py`
- 加载器实现：`agent/skill/skill_loader.py`
