Skip to main content

О крючках

Расширяйте и настраивайте поведение агента GitHub Copilot, выполняя пользовательские команды shell в ключевых точках выполнения агента.

Кто может использовать эту функцию?

Агент кодирования Copilot доступен с планами GitHub Copilot Pro, GitHub Copilot Pro+, Бизнес GitHub Copilot и GitHub Copilot Enterprise. Агент доступен во всех репозиториях, хранящихся на GitHub, за исключением репозиториев, принадлежащих управляемые учетные записи пользователей и где он был явно отключен.
Sign up for Copilot

О крючках

Крючки позволяют выполнять пользовательские команды 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 объект с массивами определений крючков.

JSON
{
  "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 внутри репозитория.

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
      }
    ]
  }
}

Вопросы, связанные с производительностью

Хуки работают синхронно и блокируют выполнение агентов. Чтобы обеспечить оперативный опыт, учитывайте следующие моменты:

  •         **Минимизировать время выполнения**: по возможности ограничивайте время выполнения хука менее 5 секунд.
    
  •         **Оптимизируйте логирование**: используйте асинхронное логирование, например, добавление в файлы, вместо синхронного ввода-вывода.
    
  •         **Используйте фоновую обработку**: для дорогих операций рассмотрите фоновую обработку.
    
  •         **Результаты кэша**: кэшировать дорогие вычисления, когда это возможно.
    

Вопросы безопасности

Чтобы обеспечить безопасность при использовании крючков, учитывайте следующие моменты:

  •         **Всегда проверяйте и дезинфицируйте данные, обработанные крючками**. Ненадёжный ввод может привести к неожиданному поведению.
    
  •         **Используйте правильное выход из оболочки при построении команд**. Это предотвращает уязвимости инъекции команд.
    
  •         **Никогда не записывайте конфиденциальные данные, такие как токены или пароли**.
    
  •         **Убедитесь, что скрипты и логи крючков имеют соответствующие права**. 
    
  •         **Будьте осторожны с крючками, которые совершают внешние сетевые звонки**. Они могут вызывать задержки, сбои или раскрывать данные третьим лицам.
    
  •         **Устанавливайте соответствующие тайм-ауты, чтобы предотвратить истощение ресурсов**. Долгосрочные крючки могут блокировать работу агентов и снижать производительность.
    

Дальнейшие шаги

Чтобы начать создавать крючки, смотрите АВТОТИТРЫ.