Навыки OpenCode
В OpenCode,Agent Skills— это механизм инкапсуляции переиспользуемых поведений, черезSKILL.mdопределённые в файлах, позволяя LLMзагружать по требованию и выполнять по требованиюконкретные возможности.
По сравнению с обычными промптами навыки ближе к модульным единицам возможностей и могут повторно использоваться в нескольких проектах или командах.
Skills — этосистема плагинов возможностейв OpenCode, которая переводит поведение ИИ с разовых промптов на переиспользуемые модули возможностей, делая рабочие процессы разработки более стандартизированными, компонуемыми и применимыми к сложным инженерным системам.
Skills существуют в виде Markdown-файлов. Они не выполняют функциональность; вместо этого за счёт загрузки по требованию и прогрессивного раскрытия они обеспечивают эффективную и переиспользуемую передачу знаний.
Самое большое отличие Skills от традиционных промптов: загрузка по требованию + прогрессивное раскрытие (только при необходимости объёмный SOP помещается в контекст, что значительно экономит токены).
| Пункт сравнения | Обычный промпт | Механизм Skills |
|---|---|---|
| Нужно описывать заново каждый раз | Да | Нет (описывается только один раз) |
| Использование длины контекста | Весь контент добавляется каждый раз | Прогрессивная загрузка (читает полное содержимое только при запуске) |
| Согласованность | Зависит от качества каждого промпта | Высокая (фиксированная SOP + шаблоны) |
| Переиспользуемость | Ручное копирование и вставка | Автоматическое сопоставление / слэш-команды / совместное использование проекта |
| Способ поддержки | Изменяете промпт, и его нужно отправить заново | Изменение файла SKILL.md вступает в силу глобально/на уровне проекта |
Основной механизм
Навыки используют встроенныйskillинструмент для управления; рабочий процесс выглядит следующим образом:
- Сканирование локальных и глобальных директорий навыков
- Отображение списка доступных навыков в контексте
- Агент автоматически выбирает навыки на основе задачи
- Загрузка содержимого SKILL.md по требованию
Этот механизм позволяет избежать загрузки всех правил сразу, улучшая производительность и использование контекста.
Основная структура навыка
В основе навыков лежит:Папка + файл SKILL.md。
Файл SKILL.md содержит:
- Метаданные (как минимум имя и описание)
- Инструкции, которые объясняют ИИ, как выполнить конкретную задачу

Навык — это по сути файл Markdown (имя файла зафиксировано как SKILL.md)
my-skill/ └── SKILL.md (唯一必需)
Базовый шаблон SKILL.md:
--- name: pdf-processing description: 从 PDF 中提取文本和表格,填写表单,并合并文档 --- # PDF 处理 ## 使用场景 当需要对 PDF 文件进行操作时使用,例如: - 提取 PDF 文本或表格数据 - 填写 PDF 表单 - 合并多个 PDF 文件 ## 提取文本 - 使用 `pdfplumber` 提取文本型 PDF 内容 - 扫描版 PDF 需配合 OCR 工具 ## 填写表单 - 读取 PDF 表单字段 - 按输入数据填充并生成新文件
Минимальный обязательный пример:
--- name: skill-name description: 说明该 Skill 的功能以及适用场景 ---
Пример с необязательными полями:
--- name: pdf-processing description: 从 PDF 中提取文本和表格,填写表单,并合并文档 license: Apache-2.0 metadata: author: example-org version: "1.0" ---
| Поле | Обязательный | Описание |
|---|---|---|
| name | Да | Имя Skill, до 64 символов, может содержать только строчные буквы, цифры и-, и не должно-начинаться или заканчиваться на |
| description | Да | Описание функции и сценариев использования, до 1024 символов, не может быть пустым |
| license | нет | Название лицензии или указатель на файл лицензии, поставляемый со Skill |
| совместимость | нет | Описание окружения и зависимостей (продукты, системные пакеты, сетевые разрешения и т. д.), до 500 символов |
| metadata | нет | Пользовательские пары ключ-значение для расширения метаданных (например, автор, номер версии) |
| allowed-tools | нет | Список разрешённых инструментов (разделённые пробелами, экспериментальная функция) |
Если вам нужны справочные материалы, справочные примеры или скрипты выполнения, вы можете использовать более сложную структуру каталога Skill:
my-skill/ ├── SKILL.md # 必需:指令 + 元数据 ├── scripts/ # 可选:可执行代码 ├── references/ # 可选:文档资料 └── assets/ # 可选:模板、资源
Как работают навыки
Навыки используют прогрессивную загрузку для эффективного управления контекстом:
- Обнаружение:При запуске ИИ загружает только имя и описание каждого навыка, сохраняя лишь самую базовую идентификационную информацию.
- Активация:Когда задача соответствует описанию навыка, ИИ считывает полные инструкции SKILL.md в контекст.
- Выполнение:ИИ выполняет инструкции, загружая справочные файлы или запуская код по мере необходимости.
Такая конструкция сохраняет скорость ИИ и позволяет ему получать больше информации по требованию.
Места размещения файлов
Каждому навыку требуется собственная папка, и внутри папки вы размещаетеSKILL.mdфайл (примечание: имя файла должно быть полностью заглавными буквами). OpenCode автоматически ищет следующие шесть расположений:
| Type | Путь | Область применения |
|---|---|---|
| Конфигурация проекта | .opencode/skills/<name>/SKILL.md |
Только текущий проект |
| Глобальная конфигурация | ~/.config/opencode/skills/<name>/SKILL.md |
Все проекты |
| Проект, совместимый с Claude | .claude/skills/<name>/SKILL.md |
Только текущий проект |
| Глобальный, совместимый с Claude | ~/.claude/skills/<name>/SKILL.md |
Все проекты |
| Проект, совместимый с агентом | .agents/skills/<name>/SKILL.md |
Только текущий проект |
| Глобальная совместимость с агентом | ~/.agents/skills/<name>/SKILL.md |
Все проекты |
Типичная структура каталогов проекта выглядит следующим образом:
your-repo/ ├── .opencode/ │ └── skills/ │ ├── git-release/ │ │ └── SKILL.md ← 发版流程技能 │ ├── code-review/ │ │ └── SKILL.md ← 代码审查技能 │ └── api-doc/ │ └── SKILL.md ← API 文档编写技能 ├── src/ └── package.json
Механизм обнаружения
Обнаружение навыков в OpenCode разделено на два уровня:
Локальные навыки проекта:OpenCode начинает с текущего рабочего каталога,проходит по дереву каталогов вверх уровень за уровнем, пока не достигнет корня рабочего дерева Git. В этом процессе он собирает с каждого уровня каталогов по пути
.opencode/skills/*/SKILL.md、.claude/skills/*/SKILL.md、.agents/skills/*/SKILL.mdвсе соответствующие файлы навыков.-
Глобальные навыки:В то же время из
~/.config/opencode/skills/*/SKILL.md、~/.claude/skills/*/SKILL.md、~/.agents/skills/*/SKILL.mdзагружаются все определённые глобальные навыки.
Навыки с обоих уровней объединяются и предоставляются агенту. Если локальный навык проекта имеет то же имя, что и глобальный навык,локальные навыки проекта имеют приоритет。
Написание SKILL.md
1. Поля frontmatter
КаждыйSKILL.mdфайл должен начинаться с YAML frontmatter (т.е.---заключённая часть). OpenCode распознаёт только следующие поля; неизвестные поля автоматически игнорируются:
| Поле | Обязательно? | Type | Описание |
|---|---|---|---|
name |
Обязательный | String | Уникальный идентификатор навыка должен совпадать с именем папки, в которой он находится, и соответствовать правилам именования |
description |
Обязательный | String | Описание навыка. Агент решает, вызывать ли его, на основе этого содержимого. 1–1024 символов. |
license |
Optional | String | Тип лицензии для содержимого навыка, например,MIT、Apache-2.0 |
compatibility |
Optional | String | Указывает, с каким инструментом он совместим, например,opencode、claude |
metadata |
Optional | Объект (сопоставление строк со строками) | Пользовательские дополнительные метаданные, такие как целевая аудитория, тип рабочего процесса и т. д. Ключи и значения являются строками. |
2. Правила именования
nameЗначение поля должно одновременно удовлетворять всем следующим условиям; иначе навык не может быть загружен:
- Длина составляет1–64 символов
- Может содержать толькострочные буквыицифры, слова могут использовать один дефис (
-) в качестве разделителя. - Не должен
-начинаться или заканчиваться на - Не должен содержать подряд идущие
-- - Должен соответствовать содержащему
SKILL.mdизимени папки точно.
Эквивалентное регулярное выражение:
^[a-z0-9]+(-[a-z0-9]+)*$
Примеры допустимых имён:git-release、api-doc、code-review、deploy2prod
Примеры недопустимого именования:Git-Release(содержит заглавные буквы),-release(с-в начале),git--release(Continuous--)
3. Написание описания
descriptionСодержимое поля напрямую влияет на то, сможет ли агент правильно выбрать и вызвать навык.Рекомендуется, чтобы описание было конкретным и ясным, объясняющим, что делает навык и в каких сценариях он используется, избегая чрезмерно общих описаний:
- ❌ Слишком общо:
Help complete the release task. - ✅ Конкретно и ясно:
从合并的 PR 中起草发版说明、提出版本号建议,并生成可直接使用的 gh release create 命令
4. Полный пример
Создайте в проекте.opencode/skills/git-release/SKILL.md, со следующим содержимым:
Пример
name: git-release
description: Создание согласованных релизов и списков изменений
license: MIT
compatibility: opencode
metadata:
audience:maintainers # Пользовательские метаданные: целевая аудитория
workflow:github # Пользовательские метаданные: тип рабочего процесса
---
## Что я делаю
- Черновик примечаний к выпуску из объединённых PR
- Предложить повышение версии
- Предоставить команду `gh release create`, которую можно скопировать-вставить
## Когда меня использовать
Используйте это , когда вы готовите релиз с тегом.
Задавайте уточняющие вопросы , если целевая схема версионирования неясна.
В Frontmatter
nameзначение должно соответствовать имени папки. В этом примере имя папки —git-release, поэтомуnameоно также должно быть записано какgit-release, иначе навык не может быть распознан.
Как агенты обнаруживают и загружают навыки
После запуска OpenCode он внедряет все доступные на данный момент навыки в формате XML вskillописание инструмента. Агенты могут узнать, какие навыки доступны, просмотрев описание инструмента:
<available_skills>
<skill>
<name>git-release</name>
<description>Create consistent releases and changelogs</description>
</skill>
<skill>
<name>code-review</name>
<description>Perform structured code reviews with consistent criteria</description>
</skill>
</available_skills>
Когда агент определяет, что навык релевантен текущей задаче, он проактивно вызываетskillинструмент для загрузки полногоSKILL.mdcontent:
skill({ name: "git-release" })
После загрузки инструкции и контекстная информация, определённые в навыке, попадают в рабочую память агента, тем самым влияя на последующее поведение и вывод. Сам навык не выполняет автоматически никаких операций; он лишь предоставляет агенту дополнительный контекст и правила поведения.
Настройка разрешений навыков
Вopencode.jsonВ, используйтеpermission.skillПоле управляет тем, к каким навыкам агент может получить доступ, и поддерживает два метода сопоставления: точные имена и подстановочные знаки Glob:
Пример
"$schema": "https://opencode.ai/config.json",
"permission": {
"skill": {
"*": "allow", // Резервное правило: разрешить загрузку всех навыков по умолчанию
"pr-review": "allow", // Точное совпадение: разрешить загрузку навыка pr-review
"internal-*": "deny", // Совпадение по Glob: запретить загрузку всех навыков, начинающихся с internal- (полностью скрыты от агента)
"experimental-*": "ask" // Сопоставление по glob-шаблону: требуется подтверждение пользователя перед загрузкой навыков, начинающихся с experimental-
}
}
}
Конкретные эффекты трёх действий разрешений на навыки следующие:
| Значение разрешения | Эффект |
|---|---|
"allow" |
Навык загружается сразу, и агенту не требуется никакого подтверждения |
"deny" |
Навык полностью скрыт от агента,<available_skills>Навык не появится в списке, и агент не может воспринимать его существование |
"ask" |
Когда агент пытается загрузить навык, появляется запрос на подтверждение, и пользователь решает, разрешить ли это |
Переопределение разрешений для каждого агента
Разным агентам может потребоваться доступ к разным наборам навыков. Вы можете настроить разрешения отдельно для каждого агента, переопределив глобальные значения по умолчанию.
1. Настройка в frontmatter пользовательского агента
# 文件路径:~/.config/opencode/agents/my-agent.md
---
permission:
skill:
"documents-*": "allow" # 该代理可以加载所有 documents- 开头的技能
# 其他技能遵循全局权限配置
---
You are a documentation assistant.
2. Настройка для встроенных агентов в opencode.json
{
"$schema": "https://opencode.ai/config.json",
"agent": {
"plan": { // 内置代理名称
"permission": {
"skill": {
"internal-*": "allow" // plan 代理可以加载 internal- 开头的技能,
// 即使全局配置中对其设置了 deny
}
}
}
}
}
Отключение инструмента навыков
Для агентов, которым совсем не нужно использовать навыки, можно напрямую отключитьskillинструмент. После его отключения,<available_skills>список будет полностью удалён из контекста агента, что сократит потребление токенов и предотвратит попытки агента загружать какие-либо навыки.
1. Отключение в Frontmatter пользовательского агента
Пример
tools:
skill: false # Полностью отключить функцию навыков для этого агента; список available_skills не будет появляться в контексте
---
Вы — ассистент для быстрых ответов. Просто отвечайте на вопросы напрямую.
2. Отключение для встроенных агентов в opencode.json
Пример
"$schema": "https://opencode.ai/config.json",
"agent": {
"plan": {
"tools": {
"skill": false // Агент plan не использует никакие навыки
}
}
}
}
Устранение проблем с загрузкой навыков
Если навык не появляется в списке доступных, проверьте следующие пункты по порядку:
-
Проверьте регистр имени файла
SKILL.mdИмя файла должно быть написано только заглавными буквами; если написать какskill.mdилиSkill.mdоно не будет распознано. -
Проверьте полноту Frontmatter
Убедитесь
SKILL.mdон начинается с корректного YAML frontmatter и содержитnameиdescriptionдва обязательных поля. Если хотя бы одно из них отсутствует, навык не будет загружен. -
Убедитесь, что имя навыка уникально и правильно отформатировано
Если навыки с одинаковым именем существуют в разных путях, могут возникнуть конфликты. Также проверьте
nameсоответствует ли поле правилам именования (только строчные буквы и цифры, разделённые дефисами) и точно ли совпадает с именем папки. -
Проверьте конфигурацию разрешений
В
opencode.jsonизpermission.skillВ, если разрешение —"deny"Навык будет полностью скрыт от агента и не появится в<available_skills>списке. Проверьте, нет ли каких-либо правил с подстановочными знаками (таких как"*": "deny") случайно этот навык.
Другие расширенияДля получения дополнительных навыков см.:
- Руководство по навыкам:https://www.example.com/ai-agent/skills-agent.html