О крючках
Крючки позволяют выполнять пользовательские команды shell в стратегических точках рабочего процесса агента, например, когда сессия агента начинается или заканчивается, либо до и после ввода запроса или вызова инструмента.
Хуки получают подробную информацию о действиях агентов через JSON-вход, что позволяет автоматизацию с учетом контекста. Например, вы можете использовать крючки, чтобы:
- Программно одобряйте или отклоняйте выполнение инструментов.
- Используйте встроенные системы безопасности, такие как секретное сканирование, чтобы предотвратить утечку учетных данных.
- Внедрить пользовательские правила валидации и вести журналы аудита на соответствие.
Copilot агенты поддерживают хуки, хранящиеся в JSON-файлах вашего репозитория по адресу .github/hooks/*.json.
Крючки доступны для использования:
- Агент кодирования Copilot on GitHub
- GitHub Copilot CLI в терминале
Типы крючков
Доступны следующие типы крючков:
-
**sessionStart**: выполняется при начале новой сессии агента или возобновлении существующей сессии. Может использоваться для инициализации среды, запуска сессий для аудита, проверки состояния проекта и настройки временных ресурсов. -
**sessionEnd**: Выполняется после завершения или завершения сессии агента. Можно использовать для очистки временных ресурсов, генерации и архивирования отчётов и журналов сессий, а также для отправки уведомлений о завершении сессии. -
**userPromptSubmitted**: Выполняется, когда пользователь отправляет запрос агенту. Может использоваться для регистрации запросов пользователей на аудит и анализ использования. -
**preToolUse**: Выполняется до того, как агент использует любой инструмент (например`bash`, , `edit`). `view` Это самый мощный крючок, так как он может **одобрять или отклонять выполнение инструментов**. Используйте этот крючок для блокировки опасных команд, обеспечения политики безопасности и стандартов кода, необходимости одобрения для конфиденциальных операций или логирования использования инструмента для соответствия. -
**postToolUse**: выполняется после завершения выполнения инструмента (независимо от того, был ли он успешным или неудачным). Можно использовать для ведения результатов выполнения, отслеживания статистики использования, создания аудиторских следов, мониторинга показателей производительности и отправки оповещений о сбоях. -
**errorOccurled**: Выполняется при возникновении ошибки во время выполнения агента. Можно использовать для регистрации ошибок при отладке, отправки уведомлений, отслеживания ошибок и генерации отчетов.
Чтобы увидеть полный справочник по типам хуков с примерами применения, лучшими практиками и продвинутыми шаблонами, см. Конфигурация крючков.
Формат конфигурации крючка
Вы настраиваете хуки с помощью специального формата JSON. JSON должен содержать version поле со значением 1 , а hooks объект с массивами определений крючков.
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "string (optional)",
"powershell": "string (optional)",
"cwd": "string (optional)",
"env": { "KEY": "value" },
"timeoutSec": 30
}
],
}
}
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "string (optional)",
"powershell": "string (optional)",
"cwd": "string (optional)",
"env": { "KEY": "value" },
"timeoutSec": 30
}
],
}
}
Объект крючка может содержать следующие клавиши:
| Недвижимость | Обязательно | Description |
|---|---|---|
type | Да | Должен содержать значение "command". |
bash | Да (на Unix-системах) | Путь к bash-скрипту для выполнения |
powershell | Да (на Windows) | Путь к скрипту PowerShell для выполнения |
cwd | нет | Рабочая директория скрипта (относительно корня репозитория) |
env | нет | Дополнительные переменные среды, которые объединяются с существующей средой |
timeoutSec | нет | Максимальное время выполнения в секундах (по умолчанию: 30) |
Пример конфигурационного файла крючка
Это пример конфигурационного файла, который находится ~/.github/hooks/project-hooks.json внутри репозитория.
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "echo \"Session started: $(date)\" >> logs/session.log",
"powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"",
"cwd": ".",
"timeoutSec": 10
}
],
"userPromptSubmitted": [
{
"type": "command",
"bash": "./scripts/log-prompt.sh",
"powershell": "./scripts/log-prompt.ps1",
"cwd": "scripts",
"env": {
"LOG_LEVEL": "INFO"
}
}
],
"preToolUse": [
{
"type": "command",
"bash": "./scripts/security-check.sh",
"powershell": "./scripts/security-check.ps1",
"cwd": "scripts",
"timeoutSec": 15
},
{
"type": "command",
"bash": "./scripts/log-tool-use.sh",
"powershell": "./scripts/log-tool-use.ps1",
"cwd": "scripts"
}
],
"postToolUse": [
{
"type": "command",
"bash": "cat >> logs/tool-results.jsonl",
"powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
}
],
"sessionEnd": [
{
"type": "command",
"bash": "./scripts/cleanup.sh",
"powershell": "./scripts/cleanup.ps1",
"cwd": "scripts",
"timeoutSec": 60
}
]
}
}
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "echo \"Session started: $(date)\" >> logs/session.log",
"powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"",
"cwd": ".",
"timeoutSec": 10
}
],
"userPromptSubmitted": [
{
"type": "command",
"bash": "./scripts/log-prompt.sh",
"powershell": "./scripts/log-prompt.ps1",
"cwd": "scripts",
"env": {
"LOG_LEVEL": "INFO"
}
}
],
"preToolUse": [
{
"type": "command",
"bash": "./scripts/security-check.sh",
"powershell": "./scripts/security-check.ps1",
"cwd": "scripts",
"timeoutSec": 15
},
{
"type": "command",
"bash": "./scripts/log-tool-use.sh",
"powershell": "./scripts/log-tool-use.ps1",
"cwd": "scripts"
}
],
"postToolUse": [
{
"type": "command",
"bash": "cat >> logs/tool-results.jsonl",
"powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
}
],
"sessionEnd": [
{
"type": "command",
"bash": "./scripts/cleanup.sh",
"powershell": "./scripts/cleanup.ps1",
"cwd": "scripts",
"timeoutSec": 60
}
]
}
}
Вопросы, связанные с производительностью
Хуки работают синхронно и блокируют выполнение агентов. Чтобы обеспечить оперативный опыт, учитывайте следующие моменты:
-
**Минимизировать время выполнения**: по возможности ограничивайте время выполнения хука менее 5 секунд. -
**Оптимизируйте логирование**: используйте асинхронное логирование, например, добавление в файлы, вместо синхронного ввода-вывода. -
**Используйте фоновую обработку**: для дорогих операций рассмотрите фоновую обработку. -
**Результаты кэша**: кэшировать дорогие вычисления, когда это возможно.
Вопросы безопасности
Чтобы обеспечить безопасность при использовании крючков, учитывайте следующие моменты:
-
**Всегда проверяйте и дезинфицируйте данные, обработанные крючками**. Ненадёжный ввод может привести к неожиданному поведению. -
**Используйте правильное выход из оболочки при построении команд**. Это предотвращает уязвимости инъекции команд. -
**Никогда не записывайте конфиденциальные данные, такие как токены или пароли**. -
**Убедитесь, что скрипты и логи крючков имеют соответствующие права**. -
**Будьте осторожны с крючками, которые совершают внешние сетевые звонки**. Они могут вызывать задержки, сбои или раскрывать данные третьим лицам. -
**Устанавливайте соответствующие тайм-ауты, чтобы предотвратить истощение ресурсов**. Долгосрочные крючки могут блокировать работу агентов и снижать производительность.
Дальнейшие шаги
Чтобы начать создавать крючки, смотрите АВТОТИТРЫ.